〜 ソフトウェア 〜
エクセルの起動と終了・ブック作成と終了

HSP3のサンプルフォルダに少しだけエクセル操作を行うスクリプトファイルがありますが、
エクセル操作を行うのに必要最低限な極一部のものしか紹介されておらず、
また、そのままでは自分のスクリプトに組み込みにくい形でもあるので、
当サイトで汎用的なTipsモジュールとして紹介します。

紹介しているモジュールは、COMオブジェクト型変数を使用していますので、
RiffRaffさん作成、ちょくとさん引継のHSP非公式LOLLIPOPモジュールを用いれば、
HSP2でもサンプルと似た処理が可能になると思われますが、
LOLLIPOPは標準モジュールではないのでHSP3以上のみ対象としたTipsとしています。

当Tipsでは、Excelアプリケーションの起動と終了、ブックの新規作成と終了のみを紹介します。
その他の処理については別途用意したTipsを参照してください。

Excelアプリケーションを終了させなくても、
Excelアプリケーション起動元のHSPファイルを終了させれば、
オートメーションの解除によりExcelアプリケーションも同時に終了するようになっていますが、
Excelアプリケーション起動後に何らかのエラーが出てしまうと、
HSPはアベンドして終了するもののExcelアプリケーションはそのまま残ってしまいます。
この場合はエクセルを通常の方法で終了させようとしても完全には終了できません。
厳密には、オートメーションエラーが出てHSPだけが終了してしまうと、
エクセルを[×]ボタン等で閉じようが、「呼出元はどこかに生きている」と誤認して、
Excelのプロセスだけは消えずに残ってしまうようです。
何度もエラーが出て正常に終了できないままテスト的に実行し続けていると、
タスクマネージャに「EXCEL.EXE」が大量にゴミとして残ってしまうので、
サンプルのように必ずonerror命令で安全に終了させるようにしてください。

使い方を軽く説明しておきます。
まずはxlInitでエクセルの使用準備をします。
もし、バックグラウンドで使用する時は表示しないオプションパラメータを指定することができますが、
場合によっては先程書いたようにゴミとして残ってしまう可能性があるので、
動作テストの段階ではオプション指定せず表示させるモードで実行するほうが良いでしょう。

コレを実行しただけだとExcelアプリケーションが起動しますがブックが開いておらず、
入力可能なセルが表示された状態ではありませんので、
次にxlNewで新たなブックを作成してください。
もし、既存のxlsファイルを使用するなら、ブックが開かれるのでxlNewを実行する必要ありませんが、
当Tipsではファイル読込を行うモジュールは紹介してませんので新規ブック作成として話を進めます。

任意のセルに入力したり、セル内容を取得したり、ブックを保存したりした後は、
xlCloseで開いたブックを閉じましょう。
その際、閉じるタイミングで自動的に保存するオプションパラメータが存在しますが、
新しくブックを作成した場合は上書き保存できず、
また、名前を付けて保存するダイアログも表示しないようになってるので、
この段階では保存して終了するオプションは指定しても効果ありません。
このブックを閉じる処理を行わなくても、
次に紹介する終了前解放処理を実行すれば、解放前に自動的にブックが閉じられるので、
HSPアプリケーションを終了させるまでブックを閉じる必要がない時は、
xlCloseを実行する必要はありません。

エクセルを使い終わったら最後にxlQuitで解放処理を実行してください。
HSPアプリケーションが終了すれば自動的にエクセルの解放処理も実行されるので、
「HSPアプリケーションが起動している間はエクセルも起動させておいて問題ない」という時は、
xlQuitを実行しなくても問題ありません。
ただ、onerror命令で任意のラベルにジャンプさせるようにする場合は、
元々モジュール内に入っているエラー終了時のxlQuitが実行されず、
プロセスに「EXCEL.EXE」が残ってしまうので、
自分で書いたエラージャンプ先ラベル内にもxlQuitを記述して解放処理を実行させてください。

具体的な使い方は下記のサンプルを参照してください。
モジュール命令がわかりやすいように大文字交じりで書いていますが、
他の命令同様に全て小文字で記述しても動作しますので使いやすいほうで書くと良いです。
	

xlInit 表示モード
表示モードエクセルを利用する際の表示モード(0:非表示, 1:表示)を指定する。

xlNew
[パラメータなし]現在のブックに新しいシートを追加するだけである為、パラメータは必要ない。

xlClose 保存フラグ
保存フラグ保存モード(0:非保存, 1:強制保存)を指定して現在のブックを終了する。

xlQuit
[パラメータなし]エクセルを終了させるだけである為、パラメータは必要ない。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#module
*xlerror
	xlQuit
	dialog "エラーが発生した為、終了します", 1
	end

#deffunc xlInit int hide
	onerror *xlerror // エラー発生時は強制的にCOMオブジェクトを解放
	newcom xlApp, "Excel.Application"
	xlApp("Visible") = (hide = 0)	// 表示モードをセット
	xlApp("DisplayAlerts") = 0	// エクセルのダイアログは非表示
	xlBooks = xlApp("WorkBooks")
	return

#deffunc xlNew
	xlBook = xlBooks("Add") // ブックを追加
	return

#deffunc xlClose int save
	xlBook -> "Close" save // ブックを閉じる
	return

#deffunc xlQuit
	if vartype(xlSheet) = vartype("comobj") : delcom xlSheet
	if vartype(xlBook) = vartype("comobj") : delcom xlBook
	if vartype(xlBooks) = vartype("comobj") : xlBooks -> "Close" : delcom xlBooks
	if vartype(xlApp) = vartype("comobj") : xlApp -> "Quit" : delcom xlApp
	return
#global

	gsel 0, 2
	mes "表示モードでエクセル起動"
	wait 100
	xlInit
	wait 100
	mes "ブック新規作成"
	wait 100
	xlNew
	wait 100
	mes "ブック閉じる"
	wait 100
	xlClose
	wait 100
	mes "エクセル終了"
	wait 100
	xlQuit
	wait 100
	mes "HSP終了"
	wait 100
	end