◆ [VBScript] VBSにファイルがドロップされたファイルのパスをExcelマクロに渡す
どーもボキです。

始めにいっとくけど、ボカぁはExcelのマクロは、ほとんど知らにゃい。
それに嫌い。
Helpの検索が酷くないか? 「For」を検索すると「一致する項目はありません」って何よ。探せ!つうの。
エディタもパッチを当てなきゃマウスホイールでスクロールすら出来ないし。 これは、ココを参考に解決した。

まぁいい。

Excelマクロを使い、さまざまなファイルを処理したい場合、
そのファイル名をどうやって取得しているだろうか?

a0021757_1365287.gifEXEファイルのように、ファイルをドロップし処理させたい。
だが、これはできない。(左図)
ファイル選択ダイアログ を表示し、処理したいファイルをユーザに選ばせる」 という手もある。
だが、「ユーザへの負担は極力へらす」 を開発ポリシーの一つとしているボキとしては、これはありえない。
だって面倒じゃん、フォルダを探ってファイルを選択するのってさ。

色々調べていくうち、
VBSを経由すれば、Excelマクロにドロップされたファイルパスを渡せることが分かった。
サンプルプログラム (Excel、VBS)

VBSのコード
' Excelファイル名 と マクロ名
FName = "ExcelMacro.xls"
Macro = "ShowMsgBox"

If WScript.Arguments.Count = 0 Then
WScript.Quit
End If

' VBSの保存パスの取得

Set objFS = WScript.CreateObject("Scripting.FileSystemObject")
DPath = objFS.GetParentFolderName(WScript.ScriptFullName) & "\"

' Excelファイルを開く
Set objXLS = CreateObject("Excel.Application")
objXLS.Workbooks.Open DPath & FName

' マクロを実行
For i = 0 To WScript.Arguments.count -1
objXLS.Run Macro, WScript.Arguments.Item(i)
Next

objXLS.Quit

Excelファイル「ExcelMacro.xls」に記述したマクロ
Sub ShowMsgBox(FPath As Variant)
MsgBox FPath
End Sub
VBS と Excel を同じフォルダに置き、VBSファイルにファイルをドロップすると、
以下のように、Excelマクロにドロップされたファイルのフルパスを渡っていることが確認出来る。
a0021757_1585617.gif

[PR]
by yozda | 2009-06-06 01:59 | プログラミング | Trackback | Comments(4)
トラックバックURL : http://yozda.exblog.jp/tb/8359675
トラックバックする(会員専用) [ヘルプ]
Commented by fullone at 2009-06-06 09:46
流石、プロは違うね。
ワタシのマクロは、
① 決まったフォルダに処理したいファイルを入れる。
② 入れたファイルのファイル名を決まったセルに書く。
ってしてた。

プロだと、マクロでもココまでできるんだな。

yozdaのマクロは綺麗だな。
コメントや名前(〇〇〇=・・・ の〇〇〇部分)も分かりやすいし。
Commented by yozda at 2009-06-06 16:48
あんがと。

チミがホンキになりゃ、これくらいできると思うけどね。

ただし、
For と If と Goto 以外もちゃんと覚えれば、だけど。
Commented by fullone at 2009-06-06 22:18
For と If と Goto があれば、なんでも出来るで。
ワタシが本気(マジ)になっても、できんよ。 センス無いもん。
Commented by yozda at 2009-06-08 22:41
> For と If と Goto があれば、なんでも出来るで。

あながち間違ってはないね。
Gotoってのは、適切に使えばかなり分かりやすいコードが書けるのよ。

マクロ(VB)には、Continueがないのよね。
Continueってのは、ループを次に回すコマンド。以下のように使う。

For i = 0 to Count -1
If 次のループに行きたい時(処理を飛ばしたい時) Then Continue

  処理したい内容
Next

って出来ないから、

For i = 0 to Count -1
If 処理したい時 Then
   処理内容
 End If
Next
ってやるしかないのよ。

でもこの場合、Ifでのインデントが深くなるからボキは嫌い。
処理したい内容が複雑であればあるほど、インデントは少ないほうがいい。

そこで、fulloneオススメのGotoを使う。

For i = 0 to Count -1
If 次のループに行きたい時 Then Goto Next_i

処理したい内容

  Next_i:
Next
<< [Excel] グループとアウ... [苦言] ボタンを押せばすべてが解決 >>