<Excel 起動オプションのお話(引数的なラブレターを渡したい)>
どうも、三流プログラマーのKen3です。 今回は、 Excelの起動オプションのお話です/* * 1.今回のキッカケ */
http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi 掲示板に、下記の質問が来ました。 --------------- >投稿時間:2003/06/06(Fri) 10:08 >投稿者名:JackZero > >タイトル:起動時に 引数を! > >お世話になります. > >ExcelやProject等で、起動時にコマンドラインにて >引数を渡したいのですが、どのようにすればマクロ内で >取得できるのでしょうか? --------------- そんな質問に対して、 > ExcelやProject等で、起動時にコマンドラインにて > 引数を渡したいのですが、どのようにすればマクロ内で > 取得できるのでしょうか? excel.exe c:\new.xls -in:d:\data\20030607.csv or c:\new.xls -in:d:\data\20030607.csv と起動時に、例えばファイル名+パラメータで起動したい、 で、起動した.xls内のAuto_Open起動時に走るマクロで、 その値を使用したい、 そんな感じですか? 起動は、ユーザーさんが、ショートカットなどから起動? それともVBやAccessからExcelを開く? どちらでしょうか? ※Excelの起動オプション、私も見ましたが、 それらしきオプションがなぜか無かったですね・・・ excel.exe c:\new.xls -in:d:\data\20030607.csv みたいな起動はできないのかなぁ。 連続処理や固定のファイルを処理する場合、 c:\new.xls -u:営業 c:\new.xls -u:経理 なんて、感じで、起動時に処理分岐可能にできると いいのにね。 なんて答えてました。/* * 2.機能を調査してみる */
コマンドラインの引数、あってもよさそうなので、ヘルプで調査。 Excel の起動スイッチを設定する ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 起動時のオプション 入力する文字列 特定のブックを開く --------------- ブックのパス/ファイル名 特定のブックを読み取り専用で開く - /r ブックのパス/ファイル名 Excel の起動画面および新規ブックが表示されないようにする /e 作業フォルダを指定する ----------- /p フォルダのパス/フォルダ名 Office Safe モードを指定する ----- /safe あらら、これしか無いの? ^^^^^^^^^^^^^^^^^^^^^^^^ 起動するブックに引数を渡したいのに、、、 余談:Accessの起動オプション ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 今回の質問とあまり関係ないけど、Accessだと、コマンドラインオプションで、 /cmd ~~~~ ってオプションがあり、 コマンド ラインの後に、Command 関数から返される値が続くように指定します。 このオプションは、必ずコマンド ラインの最後に指定してください。/cmd の代わりに セミコロン (;) を使用することもできます。 このオプションを使用して、Visual Basic コードで使用可能なコマンド ライン引数を 指定します。 なんて、使えそうな便利なオプションがあります。 Command 関数 ^^^^^^^^^^^^ Access を起動したときに使われたコマンド ライン (コマンド ライン : アプリケーションを起動するための文字列のことです。)の引数を返します。 解説 コマンド ラインから Access を起動すると、/cmd オプションに続く部分がコマンド ラインの引数としてプログラムに渡されます。 Command 関数を使うと、プログラムに渡された引数を返すことができます。 必ずコマンド ラインの最後に指定がポイントです。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub aaa()
MsgBox "起動時に/cmdで指定したのは[" & Command & "]"
End Sub |
Private Sub Auto_open()
Dim sBuf As String
sBuf = Space$(255) 'バッファをスペース埋めで取る
'呪文じゃないが、GetCommandLine()関数を呼びlstrcpyでバッファにコピー
Call lstrcpy(sBuf, GetCommandLine())
'確認のため表示
MsgBox "起動方法は、[" & sBuf & "]です"
Debug.Print "[" & sBuf & "]"
End Sub |
↑表示された例
ショートカットを新たに作成してテストしてみますか。
"C:\Program Files\Microsoft Office\Office10\EXCEL.EXE" e:\work\vba086.xls 総務
↑ショートカット作成
テスト実行、出来るだろ?
あれれ、、、ダメだ。
予定では総務が渡ると思ったのに、、、
↑実行結果
これがウイルスの温床と噂の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
と値を入れます。
↑リンク先に起動パラメータを代入
ダブルクリックして実行すると、パラメータが渡ったことが確認できます。
↑エラー画面
あっ、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 |
↑ショートカットにパラメータを追加
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で受け取ることが出来ました。
↑実行結果
|
あとは、項目別にMSでお勉強かな? ◆ マイクロソフト サイトの歩き方 ◇ How-To インデックス ◇ FAQ インデックス ◇ スキルレベル別おすすめコンテンツ ◇ テクノロジ マップ ◇ テーマ別技術資料一覧 |
| ※種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。 お奨め本の目次を見るだけでも勉強になったり |