Office関連

[Win32 API]PowerPointマクロにショートカットキーを割り当てる。

数日前、“PowerPointだとマクロにショートカットキーを割り当てるのが難しい”というツイートが流れてきました。

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

関連記事

  1. Office関連

    指定したスライドにユーザー設定レイアウトを適用するPowerPointマクロ

    PowerPointにはオリジナルのレイアウト(ユーザー設定レイアウト…

  2. Office関連

    [Excel Services ECMAScript]セルにデータを入力する。

    埋め込んだExcelワークブックのセルにデータを入力するコードです。…

  3. Office関連

    日経ソフトウエア 2014年 10月号 「VBAでExcelを業務アプリ化」

    購読している雑誌、日経ソフトウエア 2014年 10月号に「イベントプ…

  4. Office関連

    VBAでインターネット上のファイルをダウンロードする方法をまとめてみました。

    「VBA ファイル ダウンロード」といったキーワード検索でのアクセスが…

  5. Office アドイン

    [Office用アプリ]画像を挿入する。

    DocumentオブジェクトのsetSelectedDataAsync…

コメント

  • コメント (0)

  • トラックバックは利用できません。

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

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP