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プロシージャ名を記載する
- ここからVBA
- 3.のFunctionプロシージャ内に引数を使った処理を記載する
ex) RunProc() ← 必ず()をつける
標準モジュールを追加して、2.のマクロで実行させるFunctionプロシージャを追加する
ex) Function RunProc() …. End Function
Functionでないとダメで、SubだとCommandを認識しなかった。
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の作成編集機能)を除いたもの