VBE (Visual Basic Editor)

Last-modified: 2006-11-10 (金) 20:40:27
 

イミディエイト・ウィンドウをクリアする(キーボード・ショートカット)

  1. イミディエイト・ウィンドウにカーソルを移動(Ctrl+Gでフォーカスを移動できる)
  2. Ctrl+A
  3. Delete

イミディエイト・ウィンドウをクリアする(コード)

イミディエイト・ウィンドウをクリアするコードをAPIのSendInput Functionを使って書いてみた。
キー送信のサンプルというとSendKeyを使うコードや、APIでもkeybd_eventやGetKeyboardState/SetKeyboardStateを使うものが多いと思う。
SendInputの良いところは、キーの設定を一度に処理するので、ひとつひとつキー送信するのに比べて安全なこと。
APIを使っているので難しそうに見えるかもしれないけれど、やっていることはCtrl + g + a + Delete の4つのキーをまとめて送信しているだけ。

Option Explicit
Type INPUT_TYPE
dwType As Long
xi(0 To 23) As Byte
End Type
Type KEYBDINPUT
wVk As Integer
wScan As Integer
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type
Declare Function SendInput Lib "user32" _
(ByVal nInputs As Long, pInputs As INPUT_TYPE, _
ByVal cbSize As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)
Const INPUT_KEYBOARD = 1
Const KEYEVENTF_KEYUP = &H2
Const VK_CONTROL = &H11
Sub prcClearIM()
Dim inputevents(0 To 7) As INPUT_TYPE
Dim keyevent As KEYBDINPUT
Dim myArray As Variant
Dim n As Integer
'Set key name to send
myArray = Array(VK_CONTROL, vbKeyG, vbKeyA, vbKeyDelete)
For n = 0 To UBound(myArray)
keyevent.wVk = myArray(n) 'key name
keyevent.wScan = 0
keyevent.dwFlags = 0 '0 means press the key down
keyevent.time = 0
keyevent.dwExtraInfo = 0
inputevents(n).dwType = INPUT_KEYBOARD
CopyMemory inputevents(n).xi(0), keyevent, Len(keyevent)
Next
For n = 0 To UBound(myArray)
keyevent.wVk = myArray(n)
keyevent.wScan = 0
keyevent.dwFlags = KEYEVENTF_KEYUP 'release the key
keyevent.time = 0
keyevent.dwExtraInfo = 0
inputevents(n + UBound(myArray) + 1).dwType = INPUT_KEYBOARD
CopyMemory inputevents(n + UBound(myArray) + 1).xi(0), keyevent, Len(keyevent)
Next
'place the events into the stream
SendInput n + UBound(myArray) + 1, inputevents(0), Len(inputevents(0))
End Sub

プロシージャ(prcClearIM)を直接実行して使うか、別のプロシージャの中からコールして使う。
ただしコード内でコールして使うときはステップモードで実行するか、ブレークポイントを設定すること。コード内でコールするとSendInputがコード全体が終わってから実行されるため、コード内に設定しているDebug.Printの結果が全てクリアされる意味のない結果になってしまう。
使い方のサンプルコードはこんな感じ。

Sub Main_Sample()
Debug.Print "ブレークポイントを設定する前は見えません。"
Call prcClearIM
Debug.Print Now 'ここにブレークポイントを設定する
Debug.Print "ブレークポイントを設定すると、このメッセージが見えます。"
End Sub

FaceIdを一覧表示

メニューバーやツールバーを自作するときに使うFaceIDの一覧を簡単に参照する方法はないかと思って検索していたら、すばらしいコードを見つけた。
検索した結果、予め作成してあるGIFを一覧表として表示するものがほとんどだった中、これはCommandBarsを使ってFaceIDをコントロールボタンとして追加して表示している。コード自体が参考になるのはもちろんのこと、「自由にコピーして各自のマクロにコピーしても構いません」という親切さ。
2001年の作品のようだが、Excel2002でも問題なく使えた。

AddinBox(FaceId一覧)