Access 2010 later コマンドラインから最適化する - Access2016は要注意

#今回のテーマ
[最適化/修復だけ行うショートカットの作り方](http://tsware.jp/tips/tips_230.htm)
"c:\Program Files\Microsoft Office\Office10\MSACCESS.EXE" "c:\db1.mdb" /compact

デスクトップにこういうショートカットを作って最適化とありますが、MDB形式です。
ACCDB形式のファイルは最適化できるのか。またせっかくですから別名で最適化しましょう。

##Access 2013 32 bit
```batch
"C:\Program Files (x86)\Microsoft Office\Office15\MSACCESS.EXE" "C:\hoge\Distination.accdb" "C:\hoge\Source.accdb" /compact
'環境変数を使用
"%ProgramFiles(x86)%\Microsoft Office\Office15\MSACCESS.EXE" "C:\hoge\Distination.accdb" "C:\hoge\Source.accdb" /compact
```

###気が付いたこと
1.MSAccess.exeをフルパスでダブルクオーテーションで囲む　そのあと半角スペース
2./compact オプションはexe" の次ではなく、最後にもってくる
3. ファイルのパスにスペースが含まれていない場合は引用符は必要ない。が一応つけるのがお約束。
4. 圧縮先 圧縮元の順 の順に各々ダブルクォーテーションで囲む。各ファイル名の間はスペース。コンマは不要。
5. パスワードつきは未確認
6. msaccess.exe /ro "c:\My Folder\My Database.accdb"
"c:\My Folder\My Database.accdb" /ro
Office Access 2007 では、"msaccess.exe" を省略し、ファイルの完全なパスからコマンドを始めることができます。たとえば、上のコマンドは次のように入力できるが、他に実行していたら失敗する。

#Access 2016 64 bit

```bat
"C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" /compact "C:\hoge\Distination.accdb" "C:\hoge\Source.accdb" 
"C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" /compact "C:\hoge\Source.accdb" 
```
1.64Bitだと実行ファイルのフォルダ名にRootになる
2.コマンドラインスイッチの位置が違う。最後に置くとエラーになる。2007 - 2013 までと異なるようだ。
3.別名に最適化することはたまにエラーになる。ファイル名、コマンドラインスィッチを全角スペースで区切るとエラーになるようだがよくわからなかった。


##Access 2016 32bit
[How to launch Access 2016 from command line with access.exe? ](https://answers.microsoft.com/en-us/msoffice/forum/msoffice_access-mso_win10/how-to-launch-access-2016-from-command-line-with/9a6501e1-87e0-437e-9ef3-513802a26db3)
MicrosoftのQAサイトでは

```bat
"C:\Program Files (x86)\Microsoft Office\Office16\MSACCESS.EXE"
```
になるようだ

#参考
[Access のコマンド ライン スイッチ - Access 2007](https://support.office.com/ja-jp/article/Access-%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89-%e3%83%a9%e3%82%a4%e3%83%b3-%e3%82%b9%e3%82%a4%e3%83%83%e3%83%81-558cfe1d-3c98-4292-bee8-1f5df9702bf1?CorrelationId=eef988e4-3ae3-451f-9fd9-0d70cd7d1b59&ui=ja-JP&rs=ja-JP&ad=JP&fromAR=1&ocmsassetID=HA010166605)
[Access 2013 コマンドライン スイッチを使って帳票を自動印刷する方法～起動後のマクロ実行](http://nasunoblog.blogspot.jp/2013/10/access-2013_29.html)
マクロを自動起動する例がある。しかしAccess2016はオプションスィッチの位置が異なる可能性がある。

[Access 2010 のコマンド ラインスイッチに関するマイクロソフトの公式情報が知りたい](https://answers.microsoft.com/ja-jp/msoffice/forum/msoffice_access-mso_other/access-2010/6b3573dc-42f3-4c36-a078-c3e94d114587)
>公式な情報という事でしたら、弊社のサポート窓口へお問い合わせいただいた方がよいかもしれません。
　カスタマー インフォメーション センター
よろしくご検討くださいませ。 

>---
結論として現時点で公式な情報はどこにも無いそうです。
製品として販売しているものの情報が
バージョンが変わったとたんに開示されない事に疑問は残りますが
無いものを回答しろといってもしょうがありませんので
この質問はしめさせていただきます。
検索等でこのページを見られた方へ
　技術サポートは受けられるとの事なので
　「このコマンドラインで起動するとおかしんだけど」や、
　「こんなテストを行いたいんだけど」 のような問い合わせは、
　電話すれば回答して頂けるとの事でした。

#その他の2016で確認したコマンドラインスィッチ
###読み取り専用

```bat
"C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" "C:\hoge\DATABASE.accdb"
```

```bat
"F:\DATABASE9.accdb" /ro 
```

CMD.Exeからは動かない
<b>ファイル名を指定して実行</b>から起動すると開くが、読み取り専用にはならない

```bat
msaccess.exe "F:\DATABASE9.accdb" /ro
```

CMD.Exeからは動かない
<b>ファイル名を指定して実行</b>にすると開くが、読み取り専用にはならない

####***msaccess.exe /ro "F:\DATABASE9.accdb"***
CMD.Exeからは動かない
<b>ファイル名を指定して実行</b>からは成功する。

/ro "F:\DATABASE9.accdb"
CMD.exe,<b>ファイル名を指定して実行</b>もエラー

###Repair

```bat
"C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" /repair "C:\hoge\Source.accdb"
```

成功する
###X
 /x <マクロ>
/x スイッチの前に指定されている Access データベースを開いた後、指定したマクロを実行します。データベースを開いたときにマクロを実行する別の方法として、AutoExec という名前のマクロを作成することもできます。
マクロにはウイルスが含まれている可能性があるため、実行する場合には注意してください。感染への予防策として、最新のウイルス対策ソフトウェアをコンピュータで動作させ、セキュリティ センターを使用してデジタル署名のないマクロをすべて無効にし、信頼できるマクロの作成元の一覧を管理してください。 
 -　ここで言っている<font color = "Green">マクロは<font color = "Green">独立マクロ（アクションマクロ）</font>のこと。VBAではない。
 まずVBAのモジュールを作成し、次のコードを入れる。

```vb
Option Compare Database
Option Explicit

Function Macro_test()
Call test
End Function
Sub test()
MsgBox "hello, world!"
End Sub
```

次に<font color = "Green">マクロ</font>を作成しプロシージャの実行でプロシージャ名 Macro_test() とし、この<font color = "Green">マクロ</font>をtestMとして保存する
"C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" /x "testM" "C:\hoge\Source.accdb"

###CMD
[Command 関数](https://support.office.com/ja-jp/article/Command-%E9%96%A2%E6%95%B0-fec67826-7fd7-48ed-a7aa-479c020ffaa4)
適用対象: Access 2016 Access 2013 Access 2010 Access 2007 Access 2010 Developer Access 2007 Developer Access 2013 Developeraccdb


```vbnet
Function Macro_CheckCommandLine()
'Macro button "testM1"
Call CheckCommandLine
End Function
Public Sub CheckCommandLine()
    ' Check the value returned by Command function and display
    ' the appropriate form.
    If Command = "Orders" Then
        MsgBox "Orders"
    ElseIf Command = "Employees" Then
        MsgBox "Employees"
    Else
        Exit Sub
    End If
End Sub
```

"C:\Program Files\Microsoft Office\Office11\Msaccess.exe" "C:\Program Files\Microsoft Office\Office11\Samples\Northwind.mdb" /cmd "Orders"
"C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" "C:\hoge\Source.accdb" /cmd "Orders"
Access 2016は クライアントの設定にコマンドライン引数がある。
上記を実行すると Odersが入る。
###複合技
VBAのプロシージャを登録しておくと、以下のようにすると引数を指定してマクロを実行できる。
"C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" /x "testM1" "C:\hoge\Source.accdb" /cmd "Orders"

###Convertによる変換(Access2007以降)
mdb Access2000以降のMDB→Accdbのみ可能
 /convert  <対象データベース>

>以前のバージョンの Access データベースまたは Access プロジェクトを Access 2007 のファイル形式に変換し、そのファイルに新しいファイル名を付けて、Access を終了します。/convert スイッチの前に、変換元データベースを指定する必要があります。

```bat
"C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" /convert  "C:\hoge\convert.accdb" "c:\hoge\2003.mdb"
```

/convert 変換先.accdb 変換元.mdb