TL;DR — Excel には、キーボードからマクロを実行するための まったく別の仕組みが二つ あります。「マクロ オプション」のショートカットキー(Alt+F8 >「オプション」、コードなら
Application.MacroOptions)はブックの中に保存され、そのファイルを開いている間だけ有効です。使えるのは Ctrl+英字か Ctrl+Shift+英字だけです。Application.OnKeyはコードで設定し、ファンクションキーを含むほぼすべてのキーを受け付け、リセットするまで Excel のセッション全体、つまりすべてのブックで有効です。割り当てには Ctrl+Shift+英字 を使ってください。Ctrl+英字は、Ctrl+C のような Excel 標準のショートカットを黙って置き換えてしまいます。OnKeyはすべてWorkbook_BeforeCloseでリセットします。そして、マクロがブックを開くなら、先に Shift キーが離されるのを待ってください。そうしないと Excel はWorkbooks.Openの直後でコードを止めてしまいます。
' 仕組み 1:ファイルに保存され、このブックを開いている間だけ有効
Application.MacroOptions Macro:="FormatReport", _
HasShortcutKey:=True, ShortcutKey:="R" ' 大文字の R = Ctrl+Shift+R
' 仕組み 2:リセットするまで Excel のセッション内に残る
Application.OnKey "{F9}", "RefreshAll" ' 割り当て
Application.OnKey "{F9}" ' Excel 本来の F9 に戻す
この記事は、Excel があなたの代わりに実行するマクロ を扱うシリーズの第一回です。キーから、OnTime による時刻指定 から、あるいは SendKeys で偽装したキー入力から起動するマクロです。三つをつなぐ考え方は一つで、その意外な挙動の大半もこれで説明できます。どれもマクロを直接呼び出してはいない。それぞれが Excel のキューに要求を入れ、Excel は手が空いて準備ができたときにだけそれを実行する。 ですから、キューを前提に設計する必要があります。何が要求を足止めし、何が要求を取り除き、ブックを閉じたときに何がまだ待っているのか、です。
この記事で学べること
- 考え方の軸:有効範囲と寿命が異なる二つのショートカットの仕組み
- 「マクロ」ダイアログと
MacroOptionsでショートカットキーを割り当てる OnKey:キーコードと、呼び出しの三つの形- Ctrl+英字が罠である理由、そしてヨーロッパでは Ctrl+Alt が罠である理由
Workbooks.Openのあとでマクロを止めてしまう Shift キー- ブックを閉じたあとにキーの割り当てを残さない後片付け
- ブックに割り当てられているショートカットを調べる方法
考え方の軸:二つの仕組み、二つの寿命
Excel でキーを押すと、Excel は実行すべきものを探します。探す場所は二つあり、その振る舞いはまったく違います。
| 「マクロ オプション」のショートカットキー | Application.OnKey |
|
|---|---|---|
| 設定方法 | Alt+F8 >「オプション」、または MacroOptions |
コード。たいていは Workbook_Open の中 |
| 保存場所 | ブックの中、マクロと一緒 | どこにもない。実行中の Excel の中だけ |
| 有効範囲 | そのブックを開いている間 | セッション全体、すべてのブックで |
| 使えるキー | Ctrl+英字か Ctrl+Shift+英字 | ほぼあらゆる組み合わせ、ファンクションキー、Enter、Delete |
| 終わるとき | ブックを閉じたとき | リセットしたとき、または Excel を終了したとき |
左の列はファイルの属性です。右の列は Excel そのものへの変更で、コードが行い、コードが元に戻さない限り残り続けます。ショートカットのバグはほとんどすべて、自分がどちらを使ったのかを忘れたところから生まれます。
どちらの仕組みにも、シリーズ共通のルールが一つ当てはまります。Excel がキーを見るのは 準備ができているとき だけです。セルが編集モードのとき、ダイアログやモーダルのユーザーフォームが開いているとき、別のマクロが実行中のときは、ショートカットを押しても何も起きません。
仕組み 1:「マクロ オプション」のショートカットキー
手作業でのやり方はこうです。Alt+F8 を押してマクロを選び、「オプション」 ボタンをクリックし、「ショートカットキー」欄に英字を一文字入力します。小文字なら Ctrl+英字、Shift を押しながら入力すれば Ctrl+Shift+英字になります。
同じことをコードで書くとこうなります。VBA からブックを組み立てたり修復したりするときに便利です。
Sub AssignReportShortcut()
Application.MacroOptions Macro:="FormatReport", _
Description:="Format the active report sheet", _
HasShortcutKey:=True, _
ShortcutKey:="R" ' "r" = Ctrl+R、"R" = Ctrl+Shift+R
End Sub
ショートカットキーはブックと一緒に保存されるので、設定後はファイルを保存してください。このブックが開いている限り、どのブックを操作していても有効で、ファイルを閉じれば消えます。だからこそ、一つのブックに属するマクロにはこれが正解です。ショートカットキーはファイルと一緒に移動し、後始末も勝手に済みます。
制約もあります。使えるのは英字だけ(ファンクションキーも Enter も不可)、Alt の組み合わせは不可、そしてマクロは標準モジュールにある引数なしの Public な Sub でなければなりません。
仕組み 2:Application.OnKey
OnKey は、キーコードとプロシージャ名を受け取ります。
Application.OnKey "^+r", "FormatReport" ' Ctrl+Shift+R
Application.OnKey "{F9}", "RefreshAll" ' F9
Application.OnKey "^{DEL}", "ClearInputs" ' Ctrl+Delete
キーコードでは、修飾キーを三つの接頭文字で、名前付きのキーを波かっこで表します。
| コード | キー |
|---|---|
^ |
Ctrl |
+ |
Shift |
% |
Alt |
{F1} ~ {F15} |
ファンクションキー |
{ENTER} または ~ |
Enter(~ はメインの Enter キー) |
{DEL}、{INSERT}、{HOME}、{END} |
編集用のキー |
{PGUP}、{PGDN}、{UP}、{DOWN} |
移動用のキー |
{ESC}、{TAB}、{BS} |
Esc、Tab、BackSpace |
いちばん大事なルールは、同じメソッドが二つ目の引数によってまったく別の三つの仕事をする ことです。
Application.OnKey "^+r", "FormatReport" ' 引数二つ:このマクロを実行する
Application.OnKey "^+r", "" ' 空文字列:キーを押しても何も起きない
Application.OnKey "^+r" ' 二つ目の引数なし:Excel の既定の動作に戻す
よく混同されるのは後ろの二つです。自分の割り当てを元に戻したいなら、使うべきは 引数一つ の形です。空文字列はキーを意図的に無効にするためのもので、たとえばテンプレートでセルの切り取りを禁止したいときの Application.OnKey "^x", "" がそれです。この無効化は、何かがリセットするまで続きます。
Ctrl+英字は Excel 標準のショートカットを置き換える
マクロを Ctrl+C、Ctrl+S、Ctrl+Z に割り当てても、Excel は何の警告も出しません。そのブックが開いている間、そのキーはコピーや保存や元に戻す代わりにあなたのマクロを実行します。最悪なのは Ctrl+Z です。ユーザーは操作ミスを取り消そうとして押し、マクロが走り、しかもマクロの実行は元に戻せません。
Ctrl+英字はほぼすべて Excel が使用済みです。Ctrl+Shift+英字はほとんど空いています。だからルールは単純です。どちらの仕組みでも、常に Ctrl+Shift+英字。
日本語キーボードには AltGr キーがありませんが、ファイルをヨーロッパの同僚(ドイツ語・フランス語・スペイン語などのキーボード)と共有するなら、もう一つ罠があります。Windows にとって AltGr は Ctrl+Alt なのです。@ や €、各種かっこのような文字は AltGr で入力します。ドイツ語キーボードでは AltGr+Q で @、多くの配列では AltGr+E で € です。US や日本語のキーボードで書いた OnKey "^%q"(Ctrl+Alt+Q)の割り当ては、そうしたキー入力を横取りしてしまい、ユーザーは突然メールアドレスすら入力できなくなります。ヨーロッパのキーボードで使われる可能性があるファイルでは、Ctrl+Alt の組み合わせは一切避けてください。
Workbooks.Open のあとでマクロを止める Shift キー
これは「ショートカットで実行すると途中で止まるのに、実行ボタンからなら最後まで動く」という形で現れます。そのマクロには Ctrl+Shift のショートカットがあり、ブックを開いています。
Sub ImportMonthly() ' Ctrl+Shift+I に割り当て済み
Workbooks.Open "C:\Data\monthly.xlsx"
MsgBox "Imported" ' ショートカットから実行するとここに届かない
End Sub
ブックを開く間に Shift を押している のは、Excel にとって「そのファイルの自動実行マクロを飛ばせ」という合図です。Ctrl+Shift+I でマクロを起動すると、Workbooks.Open が実行される時点でまだ指が Shift の上にあり、Excel は自動実行マクロと一緒に実行中のコードまで終わらせてしまいます。エラーもメッセージもなく、コードはただ止まります。
直し方は、何かを開く前に Shift が離されるまで待つことです。
#If VBA7 Then
Private Declare PtrSafe Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
#Else
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
#End If
Private Const VK_SHIFT As Long = &H10
Sub ImportMonthly()
Do While GetKeyState(VK_SHIFT) < 0 ' 負の値 = Shift が押されている
DoEvents
Loop
Workbooks.Open "C:\Data\monthly.xlsx"
MsgBox "Imported"
End Sub
ループに DoEvents が必要な理由は DoEvents のガイド で説明しています。Excel にキーが離されたことを読み取らせるためです。別の手として、ファイルを開くマクロには OnKey でファンクションキーのような Shift なしのショートカットを割り当てる方法もあります。
後片付け:キーの割り当てをブックより長生きさせない
OnKey の割り当ては Excel のものであり、ブックのものではありません。ブックを閉じてもキーはそのマクロを指したままで、押すとマクロを実行するためにファイルが再び開かれるか、Cannot run the macro(「マクロ '...' を実行できません。」)で失敗します。ですから、パターンは常にペアです。開くときに設定し、閉じるときにリセットします。
' ThisWorkbook モジュールに記述
Private Sub Workbook_Open()
Application.OnKey "{F9}", "RefreshAll"
Application.OnKey "^+r", "FormatReport"
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnKey "{F9}" ' 引数一つ = 既定の動作に戻す
Application.OnKey "^+r"
End Sub
ユーザーが複数のブックを同時に使っていて、キーを自分のブックだけで有効にしたいなら、代わりに Workbook_Activate と Workbook_Deactivate を使います。これらのイベントについては、ユーザーが閉じる操作をキャンセルした場合も含めて Workbook_Open と BeforeClose のガイドで扱っています。
キーの一覧は一か所にまとめておきましょう。たとえば両方のイベントから呼ぶ SetKeys(enable As Boolean) というプロシージャを作れば、あとから追加したキーをリセットし忘れることがなくなります。
このブックにはどんなショートカットがあるのか
「マクロ オプション」のショートカットキーを一覧するプロパティはありません。Excel は各ショートカットをプロシージャの隠し属性として保存しており、モジュールをエクスポート(右クリック >「ファイルのエクスポート」)して .bas ファイルをテキストエディターで開くと見えます。
Sub FormatReport()
Attribute FormatReport.VB_ProcData.VB_Invoke_Func = "R\n14"
R がキーで、大文字は Ctrl+Shift を意味します。この行は VBE には表示されません。だからこそ、誰もが存在を忘れたあとも、ショートカットが何年も生き残ることがあるのです。OnKey の割り当てはどこにも保存されないので、一覧と呼べるのは自分の Workbook_Open のコードだけです。これも、割り当てを一つのプロシージャにまとめるべき理由の一つです。
判断の分かれ目:ファイルにはファイルのショートカット、ツールには OnKey
一つのブックに属するマクロには 「マクロ オプション」のショートカットキー を使います。ファイルと一緒に保存され、ファイルと一緒に終わり、後片付けのコードも要りません。
OnKey を使うのは、それにしかできないことが必要なときだけです。つまり、ファンクションキーなど英字以外のキーか、アドインや Personal.xlsb がすべてのブックに提供するショートカットです。その場合は、ユーザーの Excel に加えた変更として扱い、元に戻す責任を負ってください。設定したキーにはすべてリセットを用意します。
どちらの場合も、Ctrl+Shift+英字を使い、Ctrl+英字は使わず、ヨーロッパのキーボードに渡るファイルでは Ctrl+Alt を使わないこと。ショートカットが役に立つのは、ユーザーがすでに頼りにしているキーを壊さない場合だけです。
ExcelMaster の活用
ショートカットの問題は目に見えにくいものです。割り当ては隠し属性かイベントプロシージャの一行にすぎず、症状は何もコピーしないキーや、エラーも出さずに止まるマクロとして現れます。
ExcelMaster はブックのモジュールを読み、見つかったショートカットと OnKey の割り当てをすべて一覧にし、Excel 標準のキーを上書きしているものやリセットされていないものを指摘し、対になる Workbook_Open と Workbook_BeforeClose のペアを書くこともできます。
よくある質問
Excel でマクロにショートカットキーを割り当てるには?
Alt+F8 を押してマクロを選び、「オプション」をクリックして、「ショートカットキー」欄に英字を入力します。Shift を押しながら入力すると Ctrl+Shift+英字になり、Excel 標準のショートカットを置き換えずに済みます。コードでは、Application.MacroOptions に HasShortcutKey:=True と ShortcutKey:="R" を指定します。
OnKey とマクロのショートカットキーの違いは何ですか?
「マクロ オプション」のショートカットキーはブックに保存され、そのファイルを開いている間だけ有効ですが、使えるのは英字だけです。Application.OnKey はコードで設定し、ファンクションキーを含むほぼすべてのキーで使え、リセットされるまで Excel のセッション全体にわたって有効です。
Application.OnKey で設定したキーを元に戻すには?
キーコードだけを渡して OnKey を呼びます。たとえば Application.OnKey "{F9}" です。二つ目の引数に空文字列を渡してもキーはリセットされず、無効になるだけです。
ショートカットで実行すると Workbooks.Open のあとでマクロが止まるのはなぜですか?
ブックを開く間に Shift を押していると、Excel はそのブックの自動実行マクロを飛ばし、その際に実行中のコードも終わらせてしまいます。GetKeyState を使ったループで Shift が離されるまで待つか、Shift を使わないショートカットにしてください。
Excel でファンクションキーをマクロのショートカットにできますか?
「マクロ オプション」ダイアログではできません。受け付けるのは英字だけです。Workbook_Open で Application.OnKey "{F9}", "MyMacro" を設定し、Workbook_BeforeClose で Application.OnKey "{F9}" によってリセットしてください。
検証環境
検証環境: Excel 365 (Windows 11)、VBA 7.1 — 最終確認 2026-10-03。
関連ガイド: VBA OnTime · VBA SendKeys · VBA Workbook_Open · VBA Workbook_BeforeClose · VBA DoEvents · VBA Open Workbook · VBA Application.Run · VBA Sub
