プログラマとプロマネのあいだ

プログラマもやるし、プロマネもやるし、たまに似非アーキとか営業っぽいこともやる

Excelを開かないで、CSVファイルを文字列データとしてExcelに変換する

→参考までに、まとめと今までのやり方を載せときました。
http://www5b.biglobe.ne.jp/~taka_2/technique/csv2excel/
これまでCSVファイルをExcelに変換するのに、

  • 対象のCSVファイルの拡張子をcsvからdatとかに変える(csvだと文字列で読めない)
  • Excelを起動する
  • 開く→すべてのファイル
  • ウィザードの質問に答える(途中どの形式で読み込むか聞かれるので、迷わず全列を選択して文字列にする)
  • ファイルを保存する

っていうようなつまらない作業を繰り返してきたわけです。多分、何百回、何千回と。
が、今日そのつまらない作業から開放されることになりました。

以下のスクリプトをtest.vbs(でもなんでもいいが)で保存して、CSVファイルをtest.vbsのアイコンにドロップするだけ。
ただし、拡張子はcsv以外にしておく必要があるのは、変わらないようです。

■test.vbs

' 引数より対象ファイル名を取得する
fileName = WScript.Arguments(0)

' ファイルの1行目を読み取って、カラム数を取得する
Set fs = CreateObject("Scripting.FileSystemObject")
Set ts = fs.OpenTextFile(fileName)

If ts.AtEndOfLine = False Then
	lineData = ts.readLine()
	lineDataSplit = split(lineData, ",")
	columnCount = UBound(lineDataSplit) + 1
Else
	WScript.Quit(0)
End If

ts.close

' Excelを起動し、CSVファイルをExcelファイルに変換して保存する
Dim arr()
ReDim arr(columnCount - 1)
For i=0 to (columnCount - 1)
	arr(i) = Array((i+1), 2)
Next

Set excelObj = CreateObject("Excel.Application")

excelObj.Workbooks.OpenText fileName, 1, 1, 1, 1, False, True, False, True, False, False, False, arr

excelObj.ActiveWorkbook.SaveAs fileName & ".xls", -4143

excelObj.Quit()

最初は、

Cells(i,j).FormulaR1C1 = "'" & data

みたいなことをやってたんですが、もう遅いのなんのって。
で、Excelのファイル→開くをマクロに記録して、なんとか一般化できないかとやってみたところ、出来たっていうわけです。
ミソは、ファイル名だけ与えればよく、余計な設定情報が要らないっていうところでしょう。
ところで、このスクリプトをコンソールから起動してみると、ファイル名がカレントパスではなく、MyDocumentsからの相対パスで読み込まれてしまうことに気づきました。
回避策としては、WScript.ScriptFullNameを使って、スクリプト(*.vbs)が存在する場所からの相対パスとなるよう読み替えることでしょうか。この辺、もう少しうまいやり方がないものかと調査中です。