コマンドライン引数で、Webを検索すると、出てくる出てくる、
サンプルが。
その中で、
GetCommandLine ってものを見つけました。
^^^^^^^^^^^^^^
'実はAPIまるでわからない三流作者、宣言文を丸ごとコピー
Private Declare Function GetCommandLine _
Lib "kernel32" Alias "GetCommandLineA" () As Long
Private Declare Function lstrcpy _
Lib "kernel32" Alias "lstrcpyA" _
(ByVal lpString1 As String, _
ByVal lpString2 As Any) As Long
Private Sub Auto_open()
Dim sBuf As String
sBuf = Space$(255) 'バッファをスペース埋めで取る
'呪文じゃないが、GetCommandLine()関数を呼びlstrcpyでバッファにコピー
Call lstrcpy(sBuf, GetCommandLine())
'確認のため表示
MsgBox "起動方法は、[" & sBuf & "]です"
Debug.Print "[" & sBuf & "]"
End Sub
コマンドライン引数で、Webを検索すると、
VBScriptで引数を受け取る方法なんて今回のExcelに無関係そうなものも拾える。
拡張子を.vbsとしてファイルを作成します。
~~~~~~~~~~~~~
test.vbs
^^^^^^^^
msgbox "test"
なんて一行書いて、保存。
ダブルクリックで実行すると、
あらら不思議、メッセージが表示されたよ。
↑実行結果
これがウイルスの温床と噂のVBスクリプトってヤツですね。
よんでね.VBSとかファイル名を付けて、添付する・・なんてヤツですね。
まぁ、そんな話は、置いといて、
次の VBScript コードは、名前付きのコマンド ライン引数を表示する例です。
Set WshArguments = WScript.Arguments
Set WshNamed = WshArguments.Named
If WshNamed.Exists("a") Then
msgbox "A=" & WshNamed("a")
Else
Msgbox "引数Aが見つかりませんでした"
End If
で、Aの値を取れるんだぁ。
テストでまず、test.vbsのショートカットを作成します。
※右クリックでショートカット作成
作成したショートカットのプロパティを開きます。
↑ショートカットを右クリック、プロパティを選択
プロパティのリンク先に
~~~~~~~~~~~~~~~~~~~~
E:\Work\test.vbs /A:Ken3 /B:1234
と値を入れます。
↑リンク先に起動パラメータを代入
ダブルクリックして実行すると、パラメータが渡ったことが確認できます。
/*
* 5.VBScriptからExcelファイルを開く
*/
さてと、複合技じゃないけど、
直接意中の彼女にラブレター(パラメータ)渡せないんだったら、
共通の友人(VBScript)にお願いして、間接的に渡してみる、
そんな手段を考えました。
※でも、ラブレター、告白は直接でしょホントは、、、?
直接出来なきゃねぇ・・・と話をそらしてみました(笑)
まぁ、間接的にでも渡せないよりは、渡せたほうがいいのかな。
まずは、Excelの起動とファイルを開くルーチンの復習で、
過去のメルマガを検索すると、初めのほうで、
No.2 AccessからExcel出力
http://www.ken3.org/backno/backno_vba01.html#2
で、
Dim oApp As Object
Set oApp = CreateObject("Excel.Application")
oApp.Visible = True
'Only XL 97 supports UserControl Property
On Error Resume Next
oApp.UserControl = True
'*1↓頭にCreateObjectで作成した変数を追加しただけ
oApp.Workbooks.Open FileName:="D:\vba002\TYPE.xls"
'^^^^
なんてAccessからExcelを起動して、ファイルを開いてたよね。
これをそのままVBScriptに持っていきテストします。
おいおい、コンパイルエラーかよ(笑)
↑エラー画面
あっ、VBScriptって変数の型指定ができないんだっけ、
Dim oApp As Object
みたいに、As XXXXはダメなんだっけ、忘れてた。
これを取って、
えっ、まだダメなの?
oApp.Workbooks.Open FileName:="E:\work\vba086.xls"
の場所?
oApp.Workbooks.Open "E:\work\vba086.xls"
と引数の名前指定を外して見た(う〜ん、後で調査ですね)
無事、固定のファイルが開けたので、
今度はパラメータをFILE:E:\work\vba086.xlsで渡せるかチェックする。
ショートカットのリンクを
E:\Work\test.vbs /FILE:E:\work\vba086.xls
とファイル名をパラメータで渡すように変更してみた。
VBScript側で、ファイル名(引数)を受け取り、
そのファイルを開いてみた。
Dim oApp
Set oApp = CreateObject("Excel.Application")
oApp.Visible = True
'Only XL 97 supports UserControl Property
On Error Resume Next
oApp.UserControl = True
'引数のチェック、ファイルを開く
Set WshArguments = WScript.Arguments
Set WshNamed = WshArguments.Named
If WshNamed.Exists("file") Then
oApp.Workbooks.Open WshNamed("file") 'ファイルを開く
msgbox "File=" & WshNamed("file")
Else
Msgbox "引数Fileが見つかりませんでした"
End If
なんとか、ファイルを開くことが出来ました。
やりたいのは、彼女(Excel)にラブレター(パラメータ)を渡すんだっけ。
No.54 AccessからExcel開いて、処理終了後に閉じたい
http://www.ken3.org/backno/backno_vba11.html#54
で、.RUNってメソッドで、マクロを起動してたっけ。
受け取り側のExcelファイルを下記のように変更して、
^^^^^^^^^^^^^^^^^
Private Sub START(strP As String)
If IsEmpty(strP) Then 'パラメータ無しか?
'パラメータ無しの処理
MsgBox "パラメータ無しで起動されました"
Else
'パラメータありの処理
MsgBox "受け取ったのは" & strP & "です"
End If
End Sub
ショートカットのリンクを
E:\Work\test.vbs /FILE:E:\work\vba086.xls /P:総務
とファイル名とパラメータを渡すように変更、
↑ショートカットにパラメータを追加
VBScript側では、.Runメソッドを使用して、
STARTマクロを起動、パラメータを1つ渡します。
Dim oApp
Set oApp = CreateObject("Excel.Application")
oApp.Visible = True
'Only XL 97 supports UserControl Property
On Error Resume Next
oApp.UserControl = True
'引数のチェック、ファイルを開く
Set WshArguments = WScript.Arguments
Set WshNamed = WshArguments.Named
If WshNamed.Exists("file") Then
oApp.Workbooks.Open WshNamed("file") 'ファイルを開く
If WshNamed.Exists("p") Then
oApp.Run "START", WshNamed("p")
Else
Msgbox "引数Pを指定してください"
End If
Else
Msgbox "引数Fileを指定してください"
End If
ポイントは
~~~~~~~~~~
oApp.Run "START", WshNamed("p")
と、マクロ名と引数としてパラメータを渡してます。
実行すると、総務とExcelで受け取ることが出来ました。
↑実行結果