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

選択中の図形の文字列を蛍光ペンでハイライトするPowerPointマクロ前のページ

[Google Apps Script]Google スライドでスクリプトを実行する次のページ

関連記事

  1. Office関連

    住所から郵便番号を取得するVBAマクロ

    「住所から郵便番号 VBA」といったキーワード検索でのアクセスがあった…

  2. アイコン一覧

    Office 2013 アイコン一覧(G)

    ・Office 2013 アイコン一覧 NUM…

  3. Office関連

    「クラシックスタイルメニュー for Office 2010」のOffice 2013対応状況

    私が下記ページで公開しているフリーソフト「クラシックスタイルメニュー …

  4. Excel

    アドインやテンプレートのバージョンチェックを行うVBAマクロ

    色々なアプリケーションに実装されている、「最新バージョンの確認」機能、…

  5. Office関連

    「いちばんやさしいPowerPoint VBAの教本」レビュー

    「インストラクターのネタ帳」で有名な伊藤さんが執筆された書籍第二弾、「…

  6. Office関連

    Office 2013 Consumer Preview(カスタマー プレビュー)をインストールして…

    2012/10/26 追記:RTM版公開に伴い記事を追加しました。…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP