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)』

Microsoft Windowアプリ開発『仮想キー コード』

Add a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください