〜 ソフトウェア 〜
ブックの読込と保存

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

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

当Tipsでは、xlsファイルの読込と保存についてのみを紹介します。
単純に「ファイル保存」と言っても、
既にxlsファイルが保存されている場合の上書保存であったり、
事前に保存されている・いないに関係なく新しく名前を付ける新規保存であったり、
簡単に開けないようにするパスワード付きの保存であったり、
csv形式等のxls形式以外での保存であったりと様々です。
紹介しているモジュールでは、「上書き保存」と「ソレ以外の保存」の2種類に分類し、
また、上書き保存時でもファイルが未作成の場合は「ソレ以外の保存」として保存するようにしてます。

上書き保存を行うxlSaveの「保存済のファイルであるか否か」のチェック方法は、
内部でアクティブなブックのファイルパスを取得するxlGetBookNameを実行して、
ファイルパス形式になっていれば保存済、なっていなければ未保存として制御しています。

新規に保存する際はxlSaveAsを使い、保存先のファイルパスを指定してください。
また、そのエクセルブックに読取パスワードを付けたい場合は、
「保存ファイルパス|パスワード」と、間に「|」を挟み込んで指定します。
パスワードは大文字・小文字を区別する15字以内のテキストでなければなりません。
保存するファイルフォーマットを指定する時は、フォーマットパラメータに以下のコード値を指定できます。
定数コード内容
16進10進
XlCurrentPlatformText0xFFFFEFC2-4158テキスト(使用中のシステム)
xlWorkbookNormal0xFFFFEFD1-4143Microsoft Excelワークブック(*.XLS)
xlSYLK0x000000022SYLK(シンボリックリンク)(*.SLK)
xlWKS0x000000044MS Worksフォーマット(*.WKS)
xlWK10x000000055Lotus 1-2-3(*.WK1)
XlCSV0x000000066カンマ切り(*.CSV)
xlDBF20x000000077dBase II(*.DBF)
xlDBF30x000000088dBase III(*.DBF)
xlDIF0x000000099Data Interchange Format(*.DIF)
xlDBF40x0000000B11dBase IV(*.DBF)
xlWK30x0000000F15Lotus 1-2-3(*.WK3)
xlExcel20x0000001016Microsoft Excel 2.0 ワークシート(*.XLS)
xlTemplate0x0000001117テンプレート(*.XLT)
xlAddIn0x0000001218Microsoft Excelアドイン(*.XLA)
xlTextMac0x0000001319テキストMacintosh(*.TXT)
xlTextWindows0x0000001420テキストWindows(*.TXT)
xlTextMSDOS0x0000001521テキスト(MS-DOS)(*.TXT)
XlCSVMac0x0000001622カンマ切りMacintosh(*.CSV)
XlCSVWindows0x0000001723カンマ切りWindows(*.CSV)
XlCSVMSDOS0x0000001824カンマ切りDOS(*.CSV)
XlIntlMacro0x0000001925Excel Internationalマクロ
xlIntlAddIn0x0000001A26Excel Internationalアドイン
xlExcel2FarEast0x0000001B27Microsoft Excel 2.0 ワークシート Far East(*.XLS)
xlWorks2FarEast0x0000001C28MS Works(Far East)フォーマット(*.WKS)
xlExcel30x0000001D29Microsoft Excel 3.0ワークシート(*.XLS)
xlWK1FMT0x0000001E30Lotus 1-2-3(*.WK1)
xlWK1ALL0x0000001F31Lotus 1-2-3(*.WK1)
xlWK3FM30x0000002032Lotus 1-2-3(*.WK3)
xlExcel40x0000002133Microsoft Excel 4.0 ワークシート(*.XLS)
xlWQ10x0000002234Quattro Pro for MSDOSフォーマット(*.WQ1)
xlExcel4Workbook0x0000002335Microsoft Excel 4.0 ワークブック(*.XLW)
xlTextPrinter0x0000002436テキストプリンタファイル(*.PRN)
xlWK40x0000002638Lotus 1-2-3(*.WK4)
xlExcel5
xlExcel7
0x0000002739Microsoft Excel 5.0/95 ワークブック(*.XLW)
Microsoft Excel 7.0/95 ワークブック(*.XLW)
xlWJ30x0000002840Lotus 1-2-3(*.WJ3)
xlUnicodeText0x0000002A42Unicodeテキスト(*.TXT)
xlExcel97950x0000002B43Microsoft Excel 97-2000 & 5.0/95 ワークブック(*.XLS)
xlHTML0x0000002C44Webページ(*.HTM, *.HTML)
xlXML0x0000002E46XML(*.XML)
これらは現在使用できるフォーマットであり、変更される場合もあるのでMSDN等で確認してください。 フォーマットを省略した場合は、デフォルトの保存形式(=xlWorkbookNormal)が適用されます。 一方の読み込みを行うxlOpenでも、保存同様に「ファイルパス|パスワード」と、間に「|」を挟むことで、 xlsファイルにパスワードが掛かっていて、正しいパスワードである場合は開くことができます。 ただ、読込時に指定するフォーマットパラメータは保存時のものと異なり、 テキストファイルを開く際の区切り文字を示すコード値を指定します。 テキストファイルとはエクセル用の形式ではない通常のファイルのことで、 定数名は見当たりませんでしたが以下のコード値を指定できます。
コード内容
1タブ
2カンマ
3スペース
4セミコロン
5なし
6指定文字 ※今回のモジュール命令では使用不可
具体的な使い方は下記のサンプルを参照してください。 モジュール命令がわかりやすいように大文字交じりで書いていますが、 標準命令同様に全て小文字で記述しても動作しますので使いやすいほうで書くと良いです。 サンプルで使用されている、その他の処理については別途用意したTipsページを参照してください。

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

xlOpen ファイルパス, 読取専用, フォーマット
ファイルパスエクセルに読み込むファイルのパスを指定する。
尚、読取パスワードが必要な場合、「ファイルパス|パスワード」形式で指定する。
読取専用読取フラグ(0:通常, 1:読取専用)を指定する。
フォーマットテキストファイルオープン時のセル区切り文字を指定する。
1タブ(デフォルト)
2カンマ
3スペース
4セミコロン
5区切りなし

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

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

ブック数 = xlGetBookNum( )
ブック数取得したブック数の受取先を指定する。
[パラメータなし]ブックの数を取得するだけである為、パラメータは必要ない。

ブック名 = xlGetBookName( )
ブック名取得したブック名の受取先を指定する。
[パラメータなし]ブックの名称を取得するだけである為、パラメータは必要ない。

xlSaveAs ファイルパス, フォーマット
ファイルパス保存先のファイルパスを指定する。
尚、読取パスワードを付ける場合、「ファイルパス|パスワード」形式で指定する。
フォーマット保存時のファイルフォーマットを指定する。
フォーマットと指定値については前記のフォーマットリストを参照すること。

xlSave
[パラメータなし]ブックを上書保存するだけである為、パラメータは必要ない。
未保存ブックの場合、ブック名をファイル名としてカレントフォルダに新規保存する。

 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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#module
*xlerror
	dialog "エラーが発生した為、終了します", 1
	xlQuit
	end

#deffunc xlInit int hide
	onerror *xlerror
	newcom xlApp, "Excel.Application"
	xlApp("Visible") = (hide = 0)
	xlApp("DisplayAlerts") = 0 
	xlBooks = xlApp("WorkBooks")
	return

#deffunc xlOpen str fname, int readonly, int format, local s, local key
	s = fname : key = ""
	if instr(s, , "|") ! -1 : split s, "|", s, key
	xlBooks -> "Open" s, , readonly, (format = 0) * 1 + format, key // フォーマット未指定時はタブ
	xlBook = xlBooks("Item", getpath(s, 8))
	xlSheet = xlBook("ActiveSheet")
	return 1

#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

#defcfunc xlGetBookNum
	return xlBooks("Count") // ブック総数取得

#defcfunc xlGetBookName
	if xlGetBookNum() < 1 : return ""
	return xlBook("FullName") // フルパスを返す

#deffunc xlSaveAs str fname, int format, local s, local key
	s = fname : key = ""
	if instr(s, , "|") ! -1 : split s, "|", s, key
	xlBook -> "SaveAs" s, (format = 0) * -4143 + format, key // フォーマット未指定時は通常xls形式
	return

#deffunc xlSave local s
	s = xlGetBookName()
	if instr(s, , ":") = 1 { // 1文字目がコロンのときはファイルパスとして処理
		xlBook -> "Save"
	} else {
		xlSaveAs strf("%s\\%s.xls", dir_cur, s)
	}
	return
#global

	pass = "hspbc"
	gsel 0, 2
	mes "パスワードが掛かってない通常のxlsファイルを指定してください。"
	wait 100
	dialog "xls", 16, "読込対象xlsファイル"
	if stat = 0 : end
	xlInit
	xlOpen refstr
	wait 100
	mes "開いたファイルをパスワード付で保存しますので保存先を指定してください。"
	wait 100
	dialog "xls", 17, "書込対象xlsファイル"
	if stat {
		file = strf("%s|%s", refstr, pass)
		xlSaveAs file
		xlClose
		mes strf("%sとして保存しました。パスワードは%sとなります。", refstr, pass)
		wait 100
		mes "パスワード付ファイルが開けるかを確認します。"
		wait 100
		xlOpen file
		wait 300
		mes "開けることを確認できましたので終了します。"
	} else {
		mes "保存を中止しました。"
	}
	wait 100
	xlQuit
	end