Access起動時にパラメータを引き渡し、
渡されたパラメータによって処理をかえる方法。
起動スイッチというのがあるらしい。
参照:Microsoft Office 製品のコマンド ライン スイッチ
ということで
"C:¥.........¥MSACCESS.EXE" "......accdb" /cmd "para1" "para2" "para3" ...
順に
Accessのexe 起動するAccessファイル /cmd パラメータ(必要分)
をそれぞれダブルクォーテーションで括って設定するのが重要らしい。
そして、Access側のVBAはこの引数を引き取って処理を行う。
Command関数
参照:Microsoft Support Command関数
このようにパラメータで渡された文字列は、AutoExecマクロ内で処理をすることにする。
- マクロを追加 名称は「AutoExec」にする
- 作ったマクロに「プロシージャの実行」を追加し、3.で作成するFunctionプロシージャ名を記載する
ex) RunProc() ← 必ず()をつける
- ここからVBA
標準モジュールを追加して、2.のマクロで実行させるFunctionプロシージャを追加する
ex) Function RunProc() …. End Function
Functionでないとダメで、SubだとCommandを認識しなかった。
- 3.のFunctionプロシージャ内に引数を使った処理を記載する
Function RunProc()
' Trimを忘れずに.これはパラメータが複数の時なので1つしかない時は、Trim(Command())でOK
Dim cmd() As String
cmd = Split(Trim(Command()), " ")
' 1つめの引数で処理を分岐
Select Case cmd(0)
Case "para1"
' ここに処理
Case "paraX"
' ここに処理
Case Else
' ここに処理
End Select
End Function
<注意点>
Command関数の結果は必ずTrimすること。起動コマンドで””で括っているが後ろにスペースが入って渡ってくる。
起動コマンドで最初にexeを指定したくない、ランタイム起動でも問題ない、という場合は、
"......accdb" /runtime /cmd "para1" "para2" "para3" ...
と、/runtimeを挟むと、exeの指定をせずにCommandが引き渡され、処理が走る。
んで、次。
もう1つ別のやり方があるのだが、それは /x スイッチ。
"......accdb" /runtime /x "macro1" /cmd "para1" "para2" "para3" ...
という感じにすると、
/x の後ろに入れたマクロ「macro1」を実行させられるようになる。
で、さっきと同じくプロシージャの実行をマクロに追加して、実行させるFunctionプロシージャを指定する。
VBA側は下記のようにしてパラメータを読み込んでおけばいい。
Function RunMacro1()
Dim cmd() As String
cmd = Split(Trim(Command()), " ")
' ここに処理
End Function
このやり方だと、わざわざ分岐処理を書く必要がないので、見た目が良いかなと思ったりする。
さて、最後。
起動コマンドからランタイム実行(/runtime 付)させたときに、AutoExecは走らせたくないなぁって思ったら、
AutoExecで動くFunction(またはSub)内の先頭に、こういう1文を先頭に入れておくといい。
If SysCmd(acSysCmdRuntime) Then Exit Function
普通に起動させたときは後続処理が走るが、ランタイム起動させたときはプロシージャを抜けるようにしておくこともできるわけだ。
奥が深いぜ、Accessさんよぉ
※ランタイム:Accessから開発機能(フォーム、クエリ、レポート、VBAの作成編集機能)を除いたもの