
Excelで行選択するときに使うショートカットキーはShift + Spaceキー。
ただ、日本語入力がONの状態だとショートカットが効いてくれない。
ググるとIMEでShift+Spaceを削除するという荒業の解説を見つけたがこれはいただけない。
この設定をするとExcel以外のアプリで、日本語入力時に半角スペースを入力しようとしてShift+Spaceを押しても半角スペースを入力できなくなる。
AutoHotKey使いだったら、Excelで日本語入力状態でもShift+Spaceで行選択できるは朝飯前だ。
この記事では以下のことを解説しています。
ココがポイント
- Excelで行選択する時にいちいちIMEのONとOFFを気にしなくて良くなる
- Excelで行選択ショートカットが出来るようになるとますます捗るExcel作業
Excelつかって20年、AutoHotKey歴10年のシステムエンジニアの私が捗る方法を解説します。
なお、AutoHotKeyのインストールがまだの人は以下を読み込んで戻ってきてください。↓
-
-
AutoHotKeyでF1キーを無効にする~F1とイルカ~
私がシステムエンジニアとして仕事を初めた1998年。当時のマイクロソフトOFFICEにはF1キーでヘルプ画面を出そうとするとイルカが出現。そのために当時の低スペックなパソコンはハードディ ...
続きを見る
目次【本記事の内容】
- 1.Excelで行選択する時にいちいちIMEのONとOFFを気にしなくて良くなる
- 1-1.AutoHotKeyのソースコード
- 1-2.AutoHotKeyでIMEを制御するライブラリ
- 1-3.Excelで稼働確認
- 2.Excelで行選択ショートカットが出来るようになるとますます捗るExcel作業
- 2-1.Excelで行挿入、行削除が捗る
- 2-2.Excelで行をコピーして挿入が捗る
- 2-3.AutoHotKeyは関係ないが列選択もついでに覚えて捗る
- 3.まとめ
- 4.2019/10/22追記 Ctrl+Shift+Space対策
Excelで行選択する時にいちいちIMEのONとOFFを気にしなくて良くなる
AutoHotKeyのソースコード
以下がそのソースコードだ、読めなくてもいい。以下のソースを自分がスタートアップで起動しているAutoHotKeyのファイルである拡張子がahkのファイルに貼り付けよう。
;Excelがアクティブな状態かどうかをチェックする処理
#IfWinActive , ahk_class XLMAIN
{
;Shift+Spaceが押されたらIMEの状態を取得してIMEがOFFならShift+Space
+Space::
getIMEMode := IME_Get()
if (%getIMEMode% = 0)
{
Send,+{Space}
return
}
;IMEがOnならIMEをOFFにしてShift+Space
else
{
IME_SET(0)
Sleep 30
Send,+{Space}
Sleep 30
IME_SET(1)
return
}
Return
#IfWinActive
}
AutoHotKeyでIMEを制御するライブラリ
このソースを実行するためにはIMEの状態を制御できるライブラリが必要だ。
ちょっと長いがこれもコピペしてIME.ahkというファイルを作り、以下のパスに格納しておこう。
C:\Program Files\AutoHotkey\IME.ahk
/*****************************************************************************
IME制御用 関数群 (IME.ahk)
グローバル変数 : なし
各関数の依存性 : なし(必要関数だけ切出してコピペでも使えます)
AutoHotkey: L 1.1.08.01
Language: Japanease
Platform: NT系
Author: eamat. http://www6.atwiki.jp/eamat/
*****************************************************************************
履歴
2008.07.11 v1.0.47以降の 関数ライブラリスクリプト対応用にファイル名を変更
2008.12.10 コメント修正
2009.07.03 IME_GetConverting() 追加
Last Found Windowが有効にならない問題修正、他。
2009.12.03
・IME 状態チェック GUIThreadInfo 利用版 入れ込み
(IEや秀丸8βでもIME状態が取れるように)
http://blechmusik.xrea.jp/resources/keyboard_layout/DvorakJ/inc/IME.ahk
・Google日本語入力β 向け調整
入力モード 及び 変換モードは取れないっぽい
IME_GET/SET() と IME_GetConverting()は有効
2012.11.10 x64 & Unicode対応
実行環境を AHK_L U64に (本家およびA32,U32版との互換性は維持したつもり)
・LongPtr対策:ポインタサイズをA_PtrSizeで見るようにした
;==================================
; GUIThreadInfo
;=================================
; 構造体 GUITreadInfo
;typedef struct tagGUITHREADINFO {(x86) (x64)
; DWORD cbSize; 0 0
; DWORD flags; 4 4 ※
; HWND hwndActive; 8 8
; HWND hwndFocus; 12 16 ※
; HWND hwndCapture; 16 24
; HWND hwndMenuOwner; 20 32
; HWND hwndMoveSize; 24 40
; HWND hwndCaret; 28 48
; RECT rcCaret; 32 56
;} GUITHREADINFO, *PGUITHREADINFO;
・WinTitleパラメータが実質無意味化していたのを修正
対象がアクティブウィンドウの時のみ GetGUIThreadInfoを使い
そうでないときはControlハンドルを使用
一応バックグラウンドのIME情報も取れるように戻した
(取得ハンドルをWindowからControlに変えたことでブラウザ以外の大半の
アプリではバックグラウンドでも正しく値が取れるようになった。
※ブラウザ系でもアクティブ窓のみでの使用なら問題ないと思う、たぶん)
*/
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; 動作確認用 内部ルーチン (マウスカーソル位置のウィンドウのIME状態を見る)
; 単体起動時のテスト用なので削除しても問題なし
_ImeAutoExecuteSample:
Hotkey,#1,_ImeGetTest
Hotkey,#2,_ImeSetTest
Hotkey,#3,_ImeIsConvertingTest
Hotkey,+ESC,_ImeTestExt
SetTimer,_ImeInfoTimer,ON
return
;--- IME状態表示タイマ ---
_ImeInfoTimer:
Tooltip,% "IME_GET : " . IME_GET(_mhwnd()) . "`n"
. "IME_GetConvMode : " . IME_GetConvMode(_mhwnd()) . "`n"
. "IME_GetSentenceMode : " . IME_GetSentenceMode(_mhwnd()) . "`n"
. "IME_GetConverting : " . IME_GetConverting(_mhwnd())
return
;--- IME Get Test [Win]+[1] ---
_ImeGetTest:
MsgBox,% "IME_GET : " . IME_GET(_mhwnd()) . "`n"
. "IME_GetConvMode : " . IME_GetConvMode(_mhwnd()) . "`n"
. "IME_GetSentenceMode : " . IME_GetSentenceMode(_mhwnd()) . "`n"
return
;--- IME Get Test [Win]+[2] ---
_ImeSetTest:
MsgBox,% "IME_SET : " . IME_SET(1,_mhwnd()) . "`n"
. "IME_SetConvMode : " . IME_SetConvMode(0x08,_mhwnd()) . "`n"
. "IME_SetSentenceMode : " . IME_SetSentenceMode(1,_mhwnd()) . "`n"
return
_mhwnd(){ ;background test
MouseGetPos,x,,hwnd
return "ahk_id " . hwnd
}
;------------------------------------------------------------------
; IME窓のクラス名を調べるテストルーチン
; 入力or変換状態でIme窓にマウスカーソル持ってって [Win]+[3]押す
; Clipboardに Class名がコピーされる。入力窓/候補窓 それぞれ調べる。
; 調べたクラス名は 正規表現になおして
; IME_GetConverting("A","入力窓クラス","候補窓クラス")
; とかやって使う。(もしくは IME_GetConverting()の中に直接追加する)
;
; あああ ← 入力窓の上に マウスカーソル持ってって [Win]+[3]押す
;  ̄ ̄ ̄ Clipboardに Class名がコピーされる。
; ※ MS Office系のシームレス入力状態では取れないっぽい
; DetectHiddenWindows,ONでもダメ。シームレスOFFにしないと無理
;
; 愛
; |愛 | ← 候補窓の上にマウスカーソル持ってって [Win]+[3]押す
; |亜依 | Clipboardに Class名がコピーされる。
; |あい |
; |藍 |
; | : |
;  ̄ ̄ ̄ ̄
;------------------------------------------------------------------
_ImeIsConvertingTest:
_ImeTestClassCheck()
return
_ImeTestClassCheck() {
MouseGetPos,,,hwnd
WinGetClass,Imeclass,ahk_id %hwnd%
Clipboard := Imeclass
;IME_GetConverting() 動作チェック & IME 入力窓/候補窓 Class名確認
MsgBox,% Imeclass "`n" IME_GetConverting()
}
;--- 常駐テスト終了 [Shift]+[ESC] ---
_ImeTestExt:
ExitApp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;---------------------------------------------------------------------------
; 汎用関数 (多分どのIMEでもいけるはず)
;-----------------------------------------------------------
; IMEの状態の取得
; WinTitle="A" 対象Window
; 戻り値 1:ON / 0:OFF
;-----------------------------------------------------------
IME_GET(WinTitle="A") {
ControlGet,hwnd,HWND,,,%WinTitle%
if (WinActive(WinTitle)) {
ptrSize := !A_PtrSize ? 4 : A_PtrSize
VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0)
NumPut(cbSize, stGTI, 0, "UInt") ; DWORD cbSize;
hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI)
? NumGet(stGTI,8+PtrSize,"UInt") : hwnd
}
return DllCall("SendMessage"
, UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwnd)
, UInt, 0x0283 ;Message : WM_IME_CONTROL
, Int, 0x0005 ;wParam : IMC_GETOPENSTATUS
, Int, 0) ;lParam : 0
}
;-----------------------------------------------------------
; IMEの状態をセット
; SetSts 1:ON / 0:OFF
; WinTitle="A" 対象Window
; 戻り値 0:成功 / 0以外:失敗
;-----------------------------------------------------------
IME_SET(SetSts, WinTitle="A") {
ControlGet,hwnd,HWND,,,%WinTitle%
if (WinActive(WinTitle)) {
ptrSize := !A_PtrSize ? 4 : A_PtrSize
VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0)
NumPut(cbSize, stGTI, 0, "UInt") ; DWORD cbSize;
hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI)
? NumGet(stGTI,8+PtrSize,"UInt") : hwnd
}
return DllCall("SendMessage"
, UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwnd)
, UInt, 0x0283 ;Message : WM_IME_CONTROL
, Int, 0x006 ;wParam : IMC_SETOPENSTATUS
, Int, SetSts) ;lParam : 0 or 1
}
;===========================================================================
; IME 入力モード (どの IMEでも共通っぽい)
; DEC HEX BIN
; 0 (0x00 0000 0000) かな 半英数
; 3 (0x03 0000 0011) 半カナ
; 8 (0x08 0000 1000) 全英数
; 9 (0x09 0000 1001) ひらがな
; 11 (0x0B 0000 1011) 全カタカナ
; 16 (0x10 0001 0000) ローマ字半英数
; 19 (0x13 0001 0011) 半カナ
; 24 (0x18 0001 1000) 全英数
; 25 (0x19 0001 1001) ひらがな
; 27 (0x1B 0001 1011) 全カタカナ
; ※ 地域と言語のオプション - [詳細] - 詳細設定
; - 詳細なテキストサービスのサポートをプログラムのすべてに拡張する
; が ONになってると値が取れない模様
; (Google日本語入力βはここをONにしないと駄目なので値が取れないっぽい)
;-------------------------------------------------------
; IME 入力モード取得
; WinTitle="A" 対象Window
; 戻り値 入力モード
;--------------------------------------------------------
IME_GetConvMode(WinTitle="A") {
ControlGet,hwnd,HWND,,,%WinTitle%
if (WinActive(WinTitle)) {
ptrSize := !A_PtrSize ? 4 : A_PtrSize
VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0)
NumPut(cbSize, stGTI, 0, "UInt") ; DWORD cbSize;
hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI)
? NumGet(stGTI,8+PtrSize,"UInt") : hwnd
}
return DllCall("SendMessage"
, UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwnd)
, UInt, 0x0283 ;Message : WM_IME_CONTROL
, Int, 0x001 ;wParam : IMC_GETCONVERSIONMODE
, Int, 0) ;lParam : 0
}
;-------------------------------------------------------
; IME 入力モードセット
; ConvMode 入力モード
; WinTitle="A" 対象Window
; 戻り値 0:成功 / 0以外:失敗
;--------------------------------------------------------
IME_SetConvMode(ConvMode,WinTitle="A") {
ControlGet,hwnd,HWND,,,%WinTitle%
if (WinActive(WinTitle)) {
ptrSize := !A_PtrSize ? 4 : A_PtrSize
VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0)
NumPut(cbSize, stGTI, 0, "UInt") ; DWORD cbSize;
hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI)
? NumGet(stGTI,8+PtrSize,"UInt") : hwnd
}
return DllCall("SendMessage"
, UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwnd)
, UInt, 0x0283 ;Message : WM_IME_CONTROL
, Int, 0x002 ;wParam : IMC_SETCONVERSIONMODE
, Int, ConvMode) ;lParam : CONVERSIONMODE
}
;===========================================================================
; IME 変換モード (ATOKはver.16で調査、バージョンで多少違うかも)
; MS-IME 0:無変換 / 1:人名/地名 / 8:一般 /16:話し言葉
; ATOK系 0:固定 / 1:複合語 / 4:自動 / 8:連文節
; WXG / 1:複合語 / 2:無変換 / 4:自動 / 8:連文節
; SKK系 / 1:ノーマル (他のモードは存在しない?)
; Googleβ / 8:ノーマル
;------------------------------------------------------------------
; IME 変換モード取得
; WinTitle="A" 対象Window
; 戻り値 MS-IME 0:無変換 1:人名/地名 8:一般 16:話し言葉
; ATOK系 0:固定 1:複合語 4:自動 8:連文節
; WXG4 1:複合語 2:無変換 4:自動 8:連文節
;------------------------------------------------------------------
IME_GetSentenceMode(WinTitle="A") {
ControlGet,hwnd,HWND,,,%WinTitle%
if (WinActive(WinTitle)) {
ptrSize := !A_PtrSize ? 4 : A_PtrSize
VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0)
NumPut(cbSize, stGTI, 0, "UInt") ; DWORD cbSize;
hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI)
? NumGet(stGTI,8+PtrSize,"UInt") : hwnd
}
return DllCall("SendMessage"
, UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwnd)
, UInt, 0x0283 ;Message : WM_IME_CONTROL
, Int, 0x003 ;wParam : IMC_GETSENTENCEMODE
, Int, 0) ;lParam : 0
}
;----------------------------------------------------------------
; IME 変換モードセット
; SentenceMode
; MS-IME 0:無変換 1:人名/地名 8:一般 16:話し言葉
; ATOK系 0:固定 1:複合語 4:自動 8:連文節
; WXG 1:複合語 2:無変換 4:自動 8:連文節
; WinTitle="A" 対象Window
; 戻り値 0:成功 / 0以外:失敗
;-----------------------------------------------------------------
IME_SetSentenceMode(SentenceMode,WinTitle="A") {
ControlGet,hwnd,HWND,,,%WinTitle%
if (WinActive(WinTitle)) {
ptrSize := !A_PtrSize ? 4 : A_PtrSize
VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0)
NumPut(cbSize, stGTI, 0, "UInt") ; DWORD cbSize;
hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI)
? NumGet(stGTI,8+PtrSize,"UInt") : hwnd
}
return DllCall("SendMessage"
, UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwnd)
, UInt, 0x0283 ;Message : WM_IME_CONTROL
, Int, 0x004 ;wParam : IMC_SETSENTENCEMODE
, Int, SentenceMode) ;lParam : SentenceMode
}
;---------------------------------------------------------------------------
; IMEの種類を選ぶかもしれない関数
;==========================================================================
; IME 文字入力の状態を返す
; (パクリ元 : http://sites.google.com/site/agkh6mze/scripts#TOC-IME- )
; 標準対応IME : ATOK系 / MS-IME2002 2007 / WXG / SKKIME
; その他のIMEは 入力窓/変換窓を追加指定することで対応可能
;
; WinTitle="A" 対象Window
; ConvCls="" 入力窓のクラス名 (正規表現表記)
; CandCls="" 候補窓のクラス名 (正規表現表記)
; 戻り値 1 : 文字入力中 or 変換中
; 2 : 変換候補窓が出ている
; 0 : その他の状態
;
; ※ MS-Office系で 入力窓のクラス名 を正しく取得するにはIMEのシームレス表示を
; OFFにする必要がある
; オプション-編集と日本語入力-編集中の文字列を文書に挿入モードで入力する
; のチェックを外す
;==========================================================================
IME_GetConverting(WinTitle="A",ConvCls="",CandCls="") {
;IME毎の 入力窓/候補窓Class一覧 ("|" 区切りで適当に足してけばOK)
ConvCls .= (ConvCls ? "|" : "") ;--- 入力窓 ---
. "ATOK\d+CompStr" ; ATOK系
. "|imejpstcnv\d+" ; MS-IME系
. "|WXGIMEConv" ; WXG
. "|SKKIME\d+\.*\d+UCompStr" ; SKKIME Unicode
. "|MSCTFIME Composition" ; Google日本語入力
CandCls .= (CandCls ? "|" : "") ;--- 候補窓 ---
. "ATOK\d+Cand" ; ATOK系
. "|imejpstCandList\d+|imejpstcand\d+" ; MS-IME 2002(8.1)XP付属
. "|mscandui\d+\.candidate" ; MS Office IME-2007
. "|WXGIMECand" ; WXG
. "|SKKIME\d+\.*\d+UCand" ; SKKIME Unicode
CandGCls := "GoogleJapaneseInputCandidateWindow" ;Google日本語入力
ControlGet,hwnd,HWND,,,%WinTitle%
if (WinActive(WinTitle)) {
ptrSize := !A_PtrSize ? 4 : A_PtrSize
VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0)
NumPut(cbSize, stGTI, 0, "UInt") ; DWORD cbSize;
hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI)
? NumGet(stGTI,8+PtrSize,"UInt") : hwnd
}
WinGet, pid, PID,% "ahk_id " hwnd
tmm:=A_TitleMatchMode
SetTitleMatchMode, RegEx
ret := WinExist("ahk_class " . CandCls . " ahk_pid " pid) ? 2
: WinExist("ahk_class " . CandGCls ) ? 2
: WinExist("ahk_class " . ConvCls . " ahk_pid " pid) ? 1
: 0
SetTitleMatchMode, %tmm%
return ret
}
意味はわからなくていい。私も全くわからない。上のIME.ahkを作ってくれた先人のAutoHotKey使いの人に感謝したい。
Excelで稼働確認
さて、以上の作業ができたら、タスクバーに常駐しているAutoHotKeyスクリプトをリロードして実験だ。
IMEのONとOFFを気にしなくて良いから素晴らしく快適だ。

Excelで行選択ショートカットが出来るようになるとますます捗るExcel作業
Excelで行挿入、行削除が捗る
行を選択する目的の一つに行を挿入するということがあると思う。
挿入したい場所でShift+Spaceで行選択をしたら、Ctrlとテンキーの+(プラス)で行が選択される。
複数行選択したかったらShift+Spaceで行選択。そのあとShiftキーを押しながら下矢印で複数行を選択しCtrlとテンキーの+で複数行を挿入することが出来るぞ。
もしノートPCでテンキーがないという人は+マークがShift+;(セミコロン)になってしまう。Ctrl+;(セミコロン)はExcelで頻繁につかう日付を挿入するショートカットなのでAutoHotKeyでテンキーの+をあまり使わない変換キーにでも割り当てると幸せになれる。
ノートPCを使っている人でもデスクワークが主体なら外付けキーボードを使用することを激しくすすめる。タイピングのスピードが桁違いで世界が変わるから働き方改革間違いなしだ。キーボードについては以下の記事でいいやつを紹介しているので読んでくれると嬉しすぎて鳥肌が立つ。
-
-
Blogの書き方がGoogle音声入力からキーボードに戻る
少し前までブログを書く手順としてはGoogleドキュメントの音声入力である程度書いてから構文チェックをするようにしていた。それが最近キーボードでの入力に戻った。 というのは会社で使っていたキーボードの ...
続きを見る
Ctrl + -(マイナス)で選択している行削除だからわかりやすい。無駄な行はどんどん消していこう。
Excelで行をコピーして挿入が捗る
行挿入が捗るということは行全体を選択→コピー→挿入作業も捗るぞ。
マウスなんか使わずにキーボードを使いこなして選択範囲できれば仕事爆速化間違いなしだ。
AutoHotKeyは関係ないが列選択もついでに覚えて捗る
行選択覚えたんだったら列選択もついでだから覚えちゃおう。Ctrl+Spaceだ。
Shift +SpaceとCtrl + Spaceで行と列の選択は自由自在だ。たまにマウス使ってダラダラ行選択している人を見るとイラッと来るがそこは我慢するのが大人だと自分に言い聞かせている。
まとめ
Excelをプロジェクタに写しながら会議するときには、その人のExcelスキルが全員の目にさらされる。もたもたしていると仕事ができないやつという烙印を押されかねない。会議するときにはノートPCなのだが、私は普段の操作性を会議中も発揮したいため、キーボードを持っていく。それで普段どおりショートカットを駆使して仕事ができる人に思われるのは鳥肌が立つような快感だよ。
2019/10/22追記 Ctrl+Shift+Space対策
行選択をするShift + Space
列選択をするCtrl + Space
これを更に組み合わせるとCtrl + Shift + Spaceで今いるセルのデータが入力される範囲を全選択してくれる。
普通は
1.表の左上の先頭に異動してから
2.Ctrl + Shift + ↓ で最終行まで移動。
3.Ctrl + Shift + → で最終列まで移動。
ってやってデータが入力されている範囲を選択すると思う。3つの手順をを一発で引き金を引くショートカットがCtrl + Shift + Space。
ただし、Ctrl + Shift + Spaceも日本語入力ONの状態だとスペースが入力されてしまう。
だからAutoHotKeyで日本語入力の状態を取得してIMEがONだったらOFにしてからCtrl + Shift + Spaceのショートカットを送り込む。
;エクセルでIMEの制御を考慮したテーブル選択
^+Space::
getIMEMode := IME_Get()
if (%getIMEMode% = 0)
{
Send,^+{Space}
return
}
else
{
IME_SET(0)
Sleep 30
Send,^+{Space}
Sleep 30
IME_SET(1)
return
}
Return
Excelのショートカットについて地味だけど便利なショートカットを以下の記事にまとめました。もしよかったら御覧ください。
-
-
Excelの地味だけど便利な8つのショートカット集
今日の仕事はExcelさんとお戯れ。今日の君は2回も落ちてくれたね。それでふと思ったよ。そういえばExcelのショートカットって便利だけど使わない人は使わない。 よく紹介されているショートカットキーも ...
続きを見る