普段HHKBの英字配列を使っており、日英切替(IMEオンオフ)にCtrl-Spaceを割り当てています。
しかしCtrl-Spaceは、Excelの列選択のショートカットキーとかぶっています。
これでは、Excel利用時に列選択しようとするとかわりにIMEオンオフが起動してしまって困ります。
なので、Excel側でデフォルトのショートカットキー割当を変更して対処しました。
具体的な方法を記録に残します。
解決法:Excel VBAのApplication.Onkeyを使う
解決方法は、キーボード入力をフックして任意の処理を呼び出すVBAのプロシージャ「Application.Onkey」を利用してショートカットキーの割当を変更する、です。
考え方
Excel起動時に、Excelのショートカットキー割当が以下の通り変更されるよう、VBAを仕込みます。
- Ctrl-Spaceを無効にする(IMEオンオフで使うので)
- Ctrl-Shift-Spaceを列選択に割り当てる
もともとCtrl-Shift-Spaceは「表全体の選択」のショートカットキーですが、Ctrl-aとほぼ同義で使わないので無視しました。
具体的な方法
Excelを開くとき「アドイン」が自動的に読み込まれることを利用し、Excel起動時に毎回ショートカットキー変更処理が走るようにします。
- 「myAddins.xlam」というマクロ専用ブックを準備する
- Excelの「オプション>アドイン」から、「myAddins.xlam」を読み込むよう設定する
- 「myAddins.xlam」のVBAProject配下に、以下の通りコードを配置する
'Excel起動時に読み込まれるプロシージャ
Private Sub Workbook_Open()
Set xlAPP = Application
Application.OnTime Now + TimeSerial(0, 0, 1), "appFirst"
End Sub
'Excel起動時に自動実行するプロシージャ
Public Sub appFirst()
'ファイル読込みに時間がかかるとエラーになるためスキップする
On Error GoTo nextProc
'自動実行したい処理の本体
'Ctrl-Shift-Spaceに列選択を割り当てる
Application.OnKey "+^ ", "列選択"
'Ctrl-Spaceを無効にする
Application.OnKey "^ ", ""
nextProc:
End Sub
'列選択処理の本体
Sub 列選択()
Selection.EntireColumn.Select
End Sub
参考にさせていただいた記事
なお、本方法やコードを書く際に、以下記事をおおいに参考にさせていただきました。
参考 【VBA】列を選択状態にする(1列だけ、連続した複数列、離れた複数列) | えくとしょ | 初心者のためのエクセルとVBAの図書館
→Ctrl-Spaceと同じ仕様の列選択はVBA上では「EntireColumn.Select」であることを知る
参考 マクロにショートカットキーを設定する:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug
→Application.OnKeyで、キーボード入力をフックしてVBAの関数が呼び出せることを知る
参考 OnKey メソッド (Excel) | Microsoft Docs
→Application.OnKeyの一般的な仕様を知る(でもスペースの使い方がない)
参考 OnKey for “Ctrl Space” | MrExcel Message Board
→OnKeyメソッドでスペースを使う方法を知る
参考 ブックを開いた時やExcel起動時にマクロを自動実行する – Sumihirablog.
→Excel起動時にマクロを自動実行する方法をしる
解決法を施した結果
- Excelを使うときはCtrl-Shift-Spaceで列選択できるようになった
- Excel含めあらゆるシーンでCtrl-Spaceで日英切替(IMEオンオフ)ができるようになた
- 結果、仕事用Windows PCと私用Chromebook、双方で日英切替がCtrl-Spaceに統一できた
どのPCでもHHKBを使っているので、日英切替(IMEオンオフ)含め運指を統一したい、というのがぼくの思いです。
今回の解決法で、仕事PCと私用PCで操作が統一されたため、理想に一方近づけました。
あとはAndroidのIME切替(Shift-Space)です
まとめ:Excelのデフォルトショートカットキーは変更できる
Excelの列選択と日英切替(IMEオンオフ)のショートカットキーかぶり、ずっと目の上のたんこぶでした。
あまりに気になるし、仕事効率にも影響するので、HHKBキーマップ変更ソフトやAutoHotKeyや使ってキーマップ自体を変更することも考えました。
が、問題が起こるのがExcelのみですし、キーマップ自体をいじるのはやりすぎかも……という思いもあり。
結果、Excelの世界の中で解決する方法が見つかり、気持ちよく解決できました。
Excelのデフォルトのショートカットキーは任意変更できることがわかったのも収穫でした。
この記事が、同じような悩みを持たれている方の参考になれば幸いです。
以上「ショートカットキー「Ctrl-Space」が、Excel列選択と日英切替(IMEオンオフ)で競合しないようにするVBAの設定方法」でした。
お世話になっております。
転職先が英語キーボードMicrosoftだったので、こちらの「具体的な方法」を参考にさせていただいたのですが、
Excelを新たに開いて、 .xlamファイルが起動されているようであることは読み取れたものの、
実際に試してみると、Ctrl+SpaceはIMEオンオフのままでよいのですが、Ctrl+Shift+Spaceを押下しても、全角スペースが入力されてしまう状態です。(列選択にならない)
こちら、思い当たる解決策・問題点はございますでしょうか?
コメントありがとうごあいます。
Ctrl-Shift-Spaceは、
・IMEがオンの状態→全角スペース
・IMEがオフの状態→列選択
となるかと思います。
IMEオンの状態で列選択するようなスクリプトは現時点で作れておらず・・・
IMEオフからのCtrl-Shift-Space、と操作いただければと思います。
ありがとうございます。IMEオフでも正常に動作しないため、あきらめようと思います。。
大変参考になりました、と言いたかったところですが。。。残念ながら、
オリジナルのCtrl+Space挙動が異なりActive CellがRow 1になるため画面が一番上に移動してしまうので個人的には使い物にならないです。
もし修正方法があれば教えていただけると幸いです。
コメントありがとうございます。
うーん、困りましたね・・・
解決策は環境依存になってしまいます。
オリジナルのCtrl+Spaceの挙動をなにが決めているのか(IMEなのかPowerToys的なキーマップ変更ツールなのか)、それがExcelのVBAによるリマップ処理の先に来るのか後に来るのか・・・などによって、できることが変わってくるんです。
なので、「これで解決!」と言い切れる方法の提示が難しく・・・。