ExcelVBA覚書 AutoExecを走らせないようにAccessファイルを開く
AccessではAutoExecなどという起動時に走らせるマクロがある。
ExcelならばAuto_Openなどというプロシージャで昔は作っていたようだ。(今だとThisWorkbook_Openとかだろうか)
Accessファイルを起動するとき、このマクロを起動させたくなければ、一旦Shiftキーを押しながらファイルを開くのだが、これをVBAで実施したいときどうすればよいのだろうか・・・
Excelファイルを開くときは、
Excel.Application.EnableEvents = False
とすればよいのだが、Access.Applicationにはそのようなプロパティがない。
というので、前にちらっとSendKeyでShiftキーを押して起動しているコードを見たこともあり、同じようなものを作ってみることにした。
ただ、SendKeyはちょっと嫌なのでSendInputというAPIを使った方法にすることにした。(どっちも嫌だけど)
まずはTypeの定義
Private Type KEYBDINPUT VK As Integer Scan As Integer Flags As Long Time As Long ExtraInfo As Long Dummy1 As Long Dummy2 As Long End Type Private Type INPUT_TYPE IType As Long KI As KEYBDINPUT End Type
WinAPIの定義(64bitの場合PtrSafeをお忘れなく)
Private Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As INPUT_TYPE, ByVal cbsize As Long) As Long
利用する定数の定義
Private Const VK_SHIFT As Long = &H10 'Shiftキー Private Const KEYEVENTF_KEYUP As Integer = &H2 'KeyUp(KeyDownのほうは0) Private Const KEYEVENTF_EXTENDEDKEY As Integer = &H1 '拡張コード Private Const INPUT_KEYBOARD As Integer = 1 'KeyboardイベントでSendInputを利用する
ここまでで定義が済んだので、Accessファイル起動処理を書いていく。
SendInputについての情報は以下の通り。
- SendInputはMouseイベントなどでも利用できるので、Keyboardイベントであることを指定する。
- Shiftキーを押した→ファイルを起動した・・・とここまでで終わりではなく、Shiftキーを戻す(KeyUp)の処理まで行わないと、ずっとShiftキーが押された状態のままになってしまう。
- SendInputの最初の引数はイベントの数で今回は1つなので1。例えば、Dキー⇒Oキー⇒Enterキーと押す場合は3。
- SendInputの第2引数は押下するキーの情報(配列)、第3引数は第2引数のデータ長。
Dim ac As Object set ac = CreateObject("Access.Application") Dim it(0) As INPUT_TYPE 'Shiftキー押下 With it(0) .IType = INPUT_KEYBOARD .KI.Vk = VK_SHIFT .KI.Scan = 0 .KI.Flags = KEYEVENTF_EXTENDEDKEY Or 0 'DOWN .KI.Time = 0 .KI.ExtraInfo = 0 End With SendInput 1, it(0), Len(it(0)) 'Accessファイルを開く ac.OpenCurrentDatabase {起動するファイル名}, True, {パスワード} 'Shiftキー押下の戻し it(0).KI.Flags = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP 'UP SendInput 1, it(0), Len(it(0))
最終的にAccessを閉じて処理終了
ac.Quit acQuitSaveNone
フラグを渡すのに「KEYEVENTF_EXTENDEDKEY Or 」というのをつけないと、反映されなかった。
ここに手間取り結構時間がかかったのと、あとはとにかく「こんなことやりたいねん!」って検索しても出てこない、っていうところで時間がかかった。
VBA Access Autoexec 無効 とかキーにしても、Shiftキー押しながら起動すればいいよ!としか出なくて腹立つぅ~~~!!
って思ってしまった。検索能力ってIT技術の1つだなぁ~とつくづく実感。
参考URL
VBレスキュー(花ちゃん) 『3.SendInput 関数を使ってプログラム上からキーボードを操作する(12_Key_03)』