数日前、“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マクロを実行する場合は、クイック アクセス ツール バーを経由する、あるいはユーザーフォームを活用する、といった方法をお薦めします。

![[Mayhem]PowerPointマクロにショートカットキーを割り当てる。](https://www.ka-net.org/blog/wp-content/uploads/eyecatch-PowerPoint-120x120.png)



















この記事へのコメントはありません。