数日前、“PowerPointだとマクロにショートカットキーを割り当てるのが難しい”というツイートが流れてきました。
パワポのマクロにキーボードのショートカットを割り付けるのがめっちゃ難しくて。
ExcelとかWordだと簡単なんだけど・・・。— 佐藤嘉浩(Excelの魔法使い・5さい) (@yosatonet) 2018年9月2日
たしかに、PowerPointではExcelやWordと違って、OnKeyメソッドやマクロのオプションによるキー割り当てができないため、ショートカットキーからマクロを実行することは難しいです。
そこで、当ブログでも数年前にツールを使った方法やクイック アクセス ツール バーを使った方法について記事を書きました。
これらとは別に、RegisterHotKey関数を使ったマクロも書いていた記憶があったので、PCの中を漁ったところ、当時のコードが出てきました。
'標準モジュール '※64ビット版PowerPointで実行する場合はコード要変更 Option Explicit Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long Private Declare Function GlobalAddAtom Lib "kernel32" Alias "GlobalAddAtomA" (ByVal lpString As String) As Integer Private Declare Function GlobalDeleteAtom Lib "kernel32" (ByVal nAtom As Integer) As Integer Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function UnregisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long) As Long Private Const GWL_WNDPROC = (-4) 'WM_HOTKEY Message 'https://docs.microsoft.com/ja-jp/windows/desktop/inputdev/wm-hotkey Private Const WM_HOTKEY = &H312 Private Const MOD_ALT = &H1 Private Const MOD_CONTROL = &H2 Private Const MOD_SHIFT = &H4 Private Const MOD_WIN = &H8 Private hApp As Long Private hWndProc As Long Private iAtom1 As Integer Private iAtom2 As Integer Private Sub Macro1() 'ホットキーで実行するマクロ1 MsgBox "【Macro1】が実行されました。", vbExclamation + vbSystemModal End Sub Private Sub Macro2() 'ホットキーで実行するマクロ2 MsgBox "【Macro2】が実行されました。", vbInformation + vbSystemModal End Sub Public Sub StartHook() 'ホットキー設定 If hWndProc <> 0 Then Exit Sub 'PowerPointのハンドル取得 ※バージョンによっては要修正 hApp = FindWindowEx(0, 0, "PPTFrameClass", vbNullString) If hApp = 0 Then Exit Sub 'アトム取得 'https://msdn.microsoft.com/ja-jp/library/cc429867.aspx iAtom1 = GlobalAddAtom("HOTKEY1") iAtom2 = GlobalAddAtom("HOTKEY2") 'ホットキー登録 'https://msdn.microsoft.com/ja-jp/library/cc411006.aspx RegisterHotKey hApp, iAtom1, MOD_ALT, vbKeyF8 'Alt + F8キー設定 RegisterHotKey hApp, iAtom2, MOD_ALT, vbKeyF11 'Alt + F11キー設定 hWndProc = SetWindowLong(hApp, GWL_WNDPROC, AddressOf WndProc) Debug.Print "--- ホットキー設定開始 --- (" & Hex(hWndProc) & ")" End Sub Public Sub EndHook() 'ホットキー解除 ※必ず実行 If hWndProc = 0 Then Exit Sub SetWindowLong hApp, GWL_WNDPROC, hWndProc 'ホットキー削除 'https://msdn.microsoft.com/ja-jp/library/cc364856.aspx UnregisterHotKey hApp, iAtom1 UnregisterHotKey hApp, iAtom2 'アトム削除 'https://msdn.microsoft.com/ja-jp/library/cc429847.aspx GlobalDeleteAtom iAtom1 GlobalDeleteAtom iAtom2 hWndProc = 0 Debug.Print "--- ホットキー解除 ---" End Sub Private Function WndProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If uMsg = WM_HOTKEY Then Select Case wParam Case iAtom1: Macro1 Case iAtom2: Macro2 End Select End If WndProc = CallWindowProc(hWndProc, hWnd, uMsg, wParam, lParam) End Function
「StartHook」を実行すると、Alt + F8キーを押すと「Macro1」が、Alt + F11キーを押すと「Macro2」が実行されるようになります。
※ファイルを閉じる前に必ず「EndHook」を実行する必要があります。
上記コードで、一応マクロにショートカットキーを割り当てることができますが、フック処理を伴うコードなので、正直お薦めはしません。
記事を書いておいて何ですが、「こういった方法もあるんだ!」程度に留めておいていただければと思います。
実際にショートカットキーからPowerPointマクロを実行する場合は、クイック アクセス ツール バーを経由する、あるいはユーザーフォームを活用する、といった方法をお薦めします。
この記事へのコメントはありません。