Ms Accessの起動スイッチと天才的としかいいようのない裏技

#Accessのスィッチは時代につれ使えないものがある

|スイッチ|パラメーター |説明 |
|:---:|:----:|:----|
|なし|データベース|指定したデータベースまたは Access プロジェクトを開きます。必要に応じて、パスを含めることができます。パスにスペースが含まれている場合は、引用符で囲みます|
|/excl |なし|排他的アクセス用に指定した Access データベースを開きます。マルチ ユーザー環境で共有目的でデータベースを開くには、このスイッチを省略します。Access データベースのみに適用されます。|
|/ro |なし|指定した Access データベースまたは Access プロジェクトを読み取り専用で開きます。|
|/runtime |なし|実行時バージョン オプションを使用して Access が起動するように指定します。|
|/profile |ユーザー プロファイル|Access のインストール時に作成した Windows レジストリの標準設定ではなく、指定したユーザー プロファイルのオプションを使用して Access を起動します。これは、Access 95 以前のバージョンの Access で使用されていた /ini スイッチを置き換えて初期化ファイルを指定します。|
|/compact |ターゲット データベースまたは Access プロジェクト |/compact スイッチの前に指定された Access データベースを圧縮して修復するか、または Access プロジェクトを圧縮してから Access を閉じます。/compact スイッチの後のターゲット ファイル名を省略すると、ファイルは元の名前とフォルダーに圧縮されます。別の名前に圧縮するには、ターゲット ファイルを指定します。スペースを含むパスを含める場合は、パスを引用符で囲みます。target database または target Access project パラメーターにファイル名を指定したにもかかわらず、パスを含めない場合は、Access で指定した既定のデータベース フォルダーにターゲット ファイルが作成されます。この設定は、[Access のオプション] ダイアログ ボックスで変更できます。Access プロジェクトでは、このオプションで Access プロジェクト (.mdb) ファイルは圧縮されますが、Microsoft SQL Server データベースは圧縮されません。|
|/cmd |なし|コマンド ラインの後に続くものが Command 関数によって返される値になるように指定します。このオプションは、コマンド ラインの最後のスイッチにする必要があります。/cmd の代わりにセミコロン (;) を使用できます。このスイッチを使用して、Visual basic for Applications (VBA) コードに使用できるコマンド ライン引数を指定します。|
|/repair|なし|/repair スイッチの前に指定した Access データベースを修復し、Access を終了します。Microsoft Access 2000 以降では、/compact スイッチに最適化と修復の機能が統合されています。/repair スイッチは、下位互換性のためにサポートされています。|
|/convert|<対象データベース>|以前のバージョンの Access データベースまたは Access プロジェクトを Access 2007 のファイル形式に変換し、そのファイルに新しいファイル名を付けて、Access を終了します。/convert スイッチの前に、変換元データベースを指定する必要があります。 |
|以下| | 2007以降は失われた機能|
|/user | <ユーザー名> | 指定したユーザー名で Access を起動します。Access 2002-2003 およびそれ以前のデータベースにのみ適用されます。 |
|/wrkgrp| <ワークグループ情報ファイル> |ワークグループ情報ファイル> 指定したワークグループ情報ファイルを使用して Access を起動します。Access 2002-2003 およびそれ以前のデータベースにのみ適用されます。 |



[Access2007 のコマンド ライン スイッチ - White Tiger](http://www7b.biglobe.ne.jp/~whitetiger/ac/ac2007002.html)

###起動スイッチの前か後ろか
上記の表の中で
/convert スイッチの前に、変換元データベースを指定する必要があります。
とあるように必ずしもスイッチの後ろに詳細なものが来るわけではない。また/cmdが必ず最後である。最後なのはこの最後まで見るとわかるけど、裏技で指示をたくさん送り込めるからである。

##exeまでは省略できる
Office Access 2007 では、"msaccess.exe" を省略し、ファイルの完全なパスからコマンドを始めることができます。たとえば、上のコマンドは次のように入力できます。
"c:\My Folder\My Database.accdb" /ro

これは2013でもできる

##同時に起動しているか、すでに起動している場合はスィッチの受け渡しに失敗する場合がある。

.accdb ファイル、.adp ファイル、または .mdb ファイルに対して "msaccess.exe" を指定せずにコマンドを実行するときは、Access が実行中でないことを確認してください。Access が既に実行されていると、コマンド ライン スイッチが渡されません。ただし、.accdr ファイル、.mde ファイル、.accde ファイル、または .ade ファイルを開く場合は、常に新しい Access のインスタンスが開始されるため、コマンド ライン スイッチが通常どおりに機能します。
<UL>
<li>スイッチおよびパラメータでは、大文字と小文字は区別されません。たとえば、/RO は /ro と同じように機能します。
<li>各スイッチの前と各パラメータの前には、空白スペースを 1 つずつ挿入します
</UL>

##Command 関数
https://support.office.com/ja-jp/article/Command-関数-fec67826-7fd7-48ed-a7aa-479c020ffaa4
Access 2007 Later
Command 関数を使用して、Microsoft Office Access 2007 の起動に使用されるコマンド ラインの引数の部分を返すことができます。

データベースが開かれてからコマンドライン引数を変更するには:

1. [ファイル] メニューの [Access のオプション] をクリックします。
2. [アプリケーションの設定] ダイアログ ボックスの [詳細設定] をクリックします。
3. [コマンド ライン引数] ボックスに新しい引数を入力します。

Command 関数は、入力した新しい引数を返すようになります。

モジュールの Visual Basic for Applications (VBA) コード以外の場所で Command 関数を使用する場合、関数の後に空のかっこを含める必要があります。たとえば、フォームのテキスト ボックスに Command 関数を使用するには、テキスト ボックスの ControlSource プロパティを次のように 式 に設定します。

```vb
=Command()
```


次の例は、コマンドライン引数を指定して Access を起動する方法を示しています。また、Command 関数を使用してこの引数の値を返す方法についても示します。

この例をテストするには、Windows の [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。[ファイル名を指定して実行] ボックスに次のコードを 1 行で入力します (コマンド ライン情報の部分は引用符で囲む必要があります)。

```vb
"C:\Program Files\Microsoft Office\Office11\Msaccess.exe" _
"C:\Program Files\Microsoft Office\Office11\Samples\Northwind.mdb" /cmd "Orders"
```

次に、Northwind Traders サンプル データベースに新しいモジュールを作成し、次の Sub プロシージャを追加します。

```visualbasic

Public Sub CheckCommandLine()
' Check the value returned by Command function and display
' the appropriate form.
If Command = "Orders" Then
DoCmd.OpenForm "Orders"
ElseIf Command = "Employees" Then
DoCmd.OpenForm "Employees"
Else
Exit Sub
End If
End Sub

```

> このプロシージャを呼び出すと、Access で Orders フォームが開きます。データベースを開くときに、このプロシージャを自動的に呼び出す AutoExec マクロを作成できます。

これはアクションマクロ用の関数を作る必要がある。
[データベースを開いたときに実行されるマクロを作成する](https://support.microsoft.com/ja-jp/office/%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e3%82%92%e9%96%8b%e3%81%84%e3%81%9f%e3%81%a8%e3%81%8d%e3%81%ab%e5%ae%9f%e8%a1%8c%e3%81%95%e3%82%8c%e3%82%8b%e3%83%9e%e3%82%af%e3%83%ad%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b-98ba1508-dcc6-4e0f-9698-a4755e548124?ui=ja-jp&rs=ja-jp&ad=jp)
[データベースを開くときにアクションを実行する（AutoExecマクロ）Moug](https://www.moug.net/tech/acopr/0010001.html)
Autoexecという名前にする
そのなかに[プロシージャの実行(Runcode) マクロ アクション](https://support.office.com/ja-jp/article/runcode-%E3%83%9E%E3%82%AF%E3%83%AD-%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3-e6a62d3f-02c6-4daf-a5f7-402fd600bed4)を書いて関数を呼び出す
<UL>
<li>Function プロシージャでは、引数を指定しない場合も、次の例に示すようにかっこを含める必要があります。<br>
`TestFunction()`<br>自動で前カッコまでが補われるのでされるのでつい、`TestFunction(()`としてしまいがち。
<li>Access は該当する関数を最初にフォームまたはレポートのクラス モジュール内で探し、次に標準モジュール内で探します。
<li>関数が標準モジュールにないと呼び出せない。（Classモジュール不可能）
<li>関数名がモジュール名と同じである場合呼び出せない
<li>関数には代入する値と、その関数に代入した結果である「返り値」があるが、そのどちらも不要。
<li>このアクションは、VBA モジュールでは使用できません。代わりに、VBA で直接、目的の~~Function~~Subプロシージャを実行します。
</UL>

```vb

Function Macro_CheckCommandline()
Call CheckCommandLine
End Function
Public Sub CheckCommandLine()
' Check the value returned by Command function and display
' the appropriate form.
If Command = "Orders" Then
DoCmd.OpenForm "Orders"
ElseIf Command = "Employees" Then
DoCmd.OpenForm "Employees"
Else
Exit Sub
End If
End Sub
```


###実験と結果
"*.accdb" /cmd "aaa" "bbb" >aaa bbb
"*.accdb" /cmd "aaa";"bbb" > aaa
/cmd "aaa";"bbb"; > aaa

###天才としか言いようがない
ここにあるが、
https://stackoverflow.com/questions/27904046/ms-access-how-to-determine-the-command-line-parameters-that-the-current-instanc
これをスペースで切るのである
.accdb" /cmd "aaa" "bbb" "ccc" "ddd"
##未知の裏技Debug.Print Split(Command(), ";")(0)
Splitの後ろに(要素数)で切った配列が出るというもの
たしかに Ar=Splitとしているのに置き換えればAr(0)であるが

##こうして命令はAccessに入る

```visualbasic

Public Sub CheckCommandLine2()
'Delimiter 区切り文字 半角空白
'Spaceが入らなければわかりやすい
'/cmd "aaa" "bbb" "ccc" "ddd"
Debug.Print Split(Command(), ";")(0)
Debug.Print Split(Command(), ";")(1)
Dim cDB As DAO.Database: Set cDB = CurrentDb
Dim ar, iar As Long
ar = Split(Command(), " ")
For iar = LBound(ar) To UBound(ar)
Debug.Print ar(iar)
Next
End Sub

Public Sub CheckCommandLine3()
'Delimiter 区切り文字 セミコロン
'"aaa;bbb;c c;ddd;"
'空白を使うことができる
Dim cDB As DAO.Database: Set cDB = CurrentDb
Dim ar, iar As Long
Debug.Print Split(Command(), ";")(0)
Debug.Print Split(Command(), ";")(1)

ar = Split(Command(), ";")
For iar = LBound(ar) To UBound(ar)
Debug.Print ar(iar)
Next

End Sub
```

世の中には恐ろしい人がいるものである。