エクセル実践塾 > エクセル実践塾2016

Shiftキーが押されているか否かを、 マクロ実行時に知りたい

 

Windows APIに用意されている GetKeyState 関数を呼び出せば、 Shiftキーが押されているか否かを調べることができます

GetKeyState 関数は、Windows API の一部で、指定したキーの現在の状態(押されているかどうか、およびトグル状態かどうか)を取得するための関数です。

VBA では、次のようなDeclare 文を使って、はじめにこの関数を呼び出しておきます。

 


#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

 

@VBAマクロを作るための「開発」タブは、適当なタブを右クリックして、「リボンのユーザー設定」を実行すれば、追加できます

 

 

A「開発」にチェックマークをつけて、「OK」をクリックします

B「開発」タブから「Visual Basic」を実行すれば、Visual Basic Editorを起動できます

Cマクロを実行するシートをダブルクリックして、そのコードウィンドウを開きます

その先頭で、GetKeyState 関数を、Windows APIから呼び出しておきます。

そして、次のようなマクロで、Shiftキーが現在押されているかどうかを確認します。

 

Sub CheckShiftKey()

 Dim KeyState As Integer

Sub CheckShiftKey() はこのマクロの開始を示すサブルーチンです。CheckShiftKey という名前は任意ですが、マクロが何を行うかを示すために意味のある名前をつけています。

Dim KeyState As Integer は、KeyState という名前の変数を宣言しています。KeyState は Shiftキーの状態 を格納するために使用されます。この変数は、小数点を持たない整数を格納するための Integer 型にします。

 ' Shiftキーの状態を取得

 KeyState = GetKeyState(vbKeyShift) ' vbKeyShift は、Shiftキーの仮想キーコード

KeyState = GetKeyState(vbKeyShift) で、GetKeyState 関数 を使って Shiftキーの状態を取得します。

vbKeyShift は Shiftキー の仮想キーコード(16)で、GetKeyState に渡すことで、Shiftキーの状態を調べることができるようになります。

GetKeyState は 16ビットの整数を返します。この整数の最上位ビット(ビット15)が 1 の場合、Shiftキーが押されていると判定します。

 ' Shiftキーが押されているかどうかを確認

 If KeyState And &H8000 Then

  MsgBox "Shift キーが押されています。"

 Else

  MsgBox "Shift キーは押されていません。"

 End If

End Sub

 

If KeyState And &H8000 Then は、最上位ビット(ビット15)が1かどうかを確認しています。
&H8000 は16進数で 1000 0000 0000 0000 というビットパターンを表します。これを KeyState の値と 論理積(AND) をとることで、Shiftキーが押されている場合にビット15が 1 になるかどうかを判定しています。
ビット15が 1 の場合、Shiftキーが押されていることを意味します。

If 文の中の処理は、もし Shiftキーが押されている場合で、押されていれば、MsgBox "Shift キーが押されています。" というメッセージボックスが表示されます。

Else 文の中の処理は、Shiftキーが押されていない場合には、MsgBox "Shift キーは押されていません。" というメッセージボックスが表示されます。

DCheckShiftKeyマクロは、「開発」タブの「マクロ」から実行できます

 

EShiftキーを押さえながら「実行」した場合と、そのまま「実行」した場合で、メッセージの異なるダイアログボックスが表示されます

キー 仮想キーコード 
Shiftキー vbKeyShift
Ctrlキー vbKeyControl
Altキー vbKeyMenu
Caps Lock vbKeyCapital
Num Lock vbKeyNumlock
Scroll Lock vbKeyScroll
Aキー vbKeyA
Escキー vbKeyEscape
Enterキー

vbKeyReturn

 

FGetKeyState は、左表のような 仮想キーコード(Virtual-Key Code) を指定することで、さまざまなキーの状態を取得できます

   
   
   
   
   
   
   
   
   
   
   
 

 

●A列のセルと同じ色で塗りつぶされているセルの個数を表示する、 ユーザー定義関数を作る動画です

関連する他のページ

労働時間を計算するユーザー定義関数を使って、 残業時間を求めるユーザー定義関数を作りたい
既存のユーザー定義関数は、 別のユーザー定義関数内で実行して、 その結果を利用することができます

選択したセル範囲のデータから、一意のものを取り出したい
マクロなら可能です

選択したセル範囲のデータを、一列にまとめたい
10行程度のマクロでも行えます

組み合わせ一覧を表示するマクロを、 要素数と選び出す数を自由に指定できるものにしたい
入れ子構造のマクロでは汎用的にできないので、 再帰処理を使ったマクロにします

ABCの観点別評価の組み合わせパターンを知りたい
入れ子構造のマクロで求めることができます

ドロップダウンリストで選んだデータを、 選んだ直後に、 対応する別データに置換して入力したい
セル値の変化を監視するマクロで実行できます

置換リストを使って、 複数の置換をまとめて行いたい
10行程度のマクロで、 置換リストを使った一斉処理が可能です

セルに入力されている文字列を、そのシート名にしたい
簡単なマクロで実現できます

マクロ実行の対象範囲を固定したい
セルやセル範囲は、 Rangeで指定できます

選択中のセル範囲に含まれる空セルを、 マクロ処理の対象から除外したい
空セルでないことを条件に、 マクロを実行するよう、 If文を追加します

選択中のセル範囲に対してのマクロ実行結果を、 別のセルに表示したい
Offsetを使うと、 対象のセルの位置を行列単位でずらすことができます

選択中のセル範囲に対するマクロを作りたい
For Each〜Nextで、 選択中のセル範囲(Selection)に対する処理を記述します