[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.086 Excel 起動オプションのお話(引数的なラブレターを渡したい)

Excel 起動オプションのお話(引数的なラブレターを渡したい)

結局、うまくできなかったので、
Set oApp = CreateObject("Excel.Application")
oApp.Run "関数名", パラメータ
で渡したように見せただけでした・・・
※もっとスマートな方法がありそうですが、何かの参考となれば幸いです。



メルマガ発行内容

<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
まぁ、こんな感じで、Accessだとできるのに、Accessだとできるのに・・・ 共通にしろVBA、なんで共通じゃないんだVBA、、 VBだと簡単なのにVBだと、、 なんて、どこかで聞いたこと言ってても先に進まないので、

/* * 3.私が使いたくないAPIにそれらしきものが */

コマンドライン引数で、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
と、Auto_openのモジュールに入れてテスト起動したところ、 ["C:\Program Files\Microsoft Office\Office10\excel.exe" /e 無事にそれらしく取れたかなぁ。 ↑表示された例 ショートカットを新たに作成してテストしてみますか。 "C:\Program Files\Microsoft Office\Office10\EXCEL.EXE" e:\work\vba086.xls 総務 ↑ショートカット作成 テスト実行、出来るだろ? あれれ、、、ダメだ。 予定では総務が渡ると思ったのに、、、

/* * 4.少し横にそれて、VBScriptで引数を受け取る方法 */

コマンドライン引数で、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で受け取ることが出来ました。 ↑実行結果

/* * 5.終わりの挨拶 */

なんか、まわりくどいラブレター(引数)の渡し方でしたが、 VBScript経由でExcelを開き、マクロの起動のサンプルです。 ショートカットのリンクを E:\Work\Excel起動.vbs /FILE:E:\work\vba086.xls /P:総務 E:\Work\Excel起動.vbs /FILE:E:\work\vba086.xls /P:営業 など、複数作成して使うことが出来ます。 なんかなぁ、、、ヤッパラブレターは直接でしょ。 Excelお嬢へ直接、引数(ラブレター)渡す方法、ご存知の人は教えてください。 私じゃExcelお嬢様に渡せなかったので・・・・ 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ※評価は↓で投票してね。感想は掲示板かメールでくださいね。



ページフッター

ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、

三流君へ メッセージを送る

感想や質問・要望・苦情など 三流君へメッセージを送る。
返信例 XXXXさんへ
下記のフォームからメッセージを送ることができます。


あなたのお名前(ニックネーム):さん
返信は?:

アドレス:に返事をもらいたい
感想や質問↓:


(感想や質問・要望・苦情はHPで記事に載せることがあります。)

種類別のリンク や 広告など

[VBA系バックナンバー目次へ移動] / [VBA系TOPへ] / [三流君(TOP ken3.org へ戻る)]

Blogとリンク:[三流君のMemo別館]/ [VBA 三流君のソースコード置き場]/ [Ken3Video YouTubeで動画解説]

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。



Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。




[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]