図形をカーソルキーで自由に移動させるVBAコード
前回の図形(オートシェイプ)を操作する方法を流用して、今回はキーボードのカーソルキー(上下左右の矢印キー)で図形を自由に移動させるVBAコードをサンプル公開します。
動作イメージは以下の通りで星をカーソルキーで自由に移動させます。
尚、カーソルで移動可能な範囲は四角形内とします。
指定されたキーが押されたか判定する関数
カーソルキーが押されたかどうかを判定する為にはUser32.dllに含まれるWin32APIの関数「GetAsyncKeyState」を使います。
最初に標準モジュールに以下のコードを記載しましょう。
Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long
ちなみに標準モジュールはVBE(Visual Basic Editor)を起動([Alt]+[F11])して、[挿入(I)] → [標準モジュール(M)]で作成する事が出来ます。
GetAsyncKeyState関数は指定されたキーが押されている間、0以外の数値を返しますので以下の用法でキーが押されたかどうかを判定します。
'矢印左キー(←)の引数は37 If GetAsyncKeyState(37) <> 0 Then MsgBox "←キーが押されています。" End If
尚、今回利用するキーの引数は以下の通りです。
- ←キー:37
- →キー:39
- ↑キー:38
- ↓キー:40
- ESCキー:27
尚、その他のキーについてはこちらのサイトをご参考下さい⇒EXCEL VBA GetAsyncKeyState:キーコード一覧
VBAコード
上記を踏まえて実際にVBAコードを作成します。
サンプルではボタンをクリックした際の動作に以下のコードを設定しています。
Private Sub CommandButton1_Click() Dim i As Long Dim objStar As Shape Dim starWidth As Long Dim starHeight As Long Dim boxLeft As Long Dim boxRight As Long Dim boxTop As Long Dim boxBottom As Long Dim lngLeft As Long Dim lngTop As Long 'オートシェイプ(星16)のサイズを取得 starWidth = ActiveSheet.Shapes("star16").Width starHeight = ActiveSheet.Shapes("star16").Height 'オートシェイプ(四角形)のサイズを取得 boxLeft = ActiveSheet.Shapes("正方形/長方形 10").Left boxRight = boxLeft + ActiveSheet.Shapes("正方形/長方形 10").Width _ - starWidth boxTop = ActiveSheet.Shapes("正方形/長方形 10").Top boxBottom = boxTop + ActiveSheet.Shapes("正方形/長方形 10").Height _ - starHeight 'オートシェイプ(星16)の初期位置を設定 lngLeft = boxLeft '左位置 lngTop = boxTop '上位置 Do '右(→)の処理 If GetAsyncKeyState(39) <> 0 Then If lngLeft > boxRight Then lngLeft = boxRight Else lngLeft = lngLeft + 1 End If '左位置を設定する ActiveSheet.Shapes("star16").Left = lngLeft '画面に表示する DoEvents End If '左(←)の処理 If GetAsyncKeyState(37) <> 0 Then If lngLeft < boxLeft Then lngLeft = boxLeft Else lngLeft = lngLeft - 1 End If '左位置を設定する ActiveSheet.Shapes("star16").Left = lngLeft '画面に表示する DoEvents End If '上(↑)の処理 If GetAsyncKeyState(38) <> 0 Then If lngTop < boxTop Then lngTop = boxTop Else lngTop = lngTop - 1 End If '上位置を設定する ActiveSheet.Shapes("star16").Top = lngTop '画面に表示する DoEvents End If '下(↓)の処理 If GetAsyncKeyState(40) <> 0 Then If lngTop > boxBottom Then lngTop = boxBottom Else lngTop = lngTop + 1 End If '上位置を設定する ActiveSheet.Shapes("star16").Top = lngTop '画面に表示する DoEvents End If 'Escの処理 If GetAsyncKeyState(27) <> 0 Then '左位置を設定する ActiveSheet.Shapes("star16").Left = boxLeft '上位置を設定する ActiveSheet.Shapes("star16").Top = boxTop '画面に表示する DoEvents Exit Sub End If Loop End Sub
コードの解説
指定範囲内で図形(star16)を移動させるための上記VBAを簡単に解説します。
稼働範囲の位置を取得
14~15行目で図形 星16 の高さ(Heightプロパティ)と幅(Widthプロパティ)を取得します。
同様に18~24行目で移動範囲の四角形のサイズを取得します。
キーボードの状態を取得する
29~95行目までDo~Loopステートメントを使い、永久ループで上下左右のカーソルキー、ESCキーの状態を取得します。
対象のキーが押された場合、左右矢印キーの場合は図形(オートシェイプ)の左位置(Leftプロパティ)を1ポイント増減させ位置を移動させます。
また、上下矢印キーの場合は上位置(Topプロパティ)を1ポイント増減させ位置を移動させます。
ESCキーが押された場合は位置を初期に戻して処理をループ処理を終了させています。
以上、今回はExcelの図形(オートシェイプ)をカーソルキーで自由に移動させる為のVBAコードでした。
今回のサンプルファイルは以下のリンクからダウンロード可能です。