こんにちは、Ryoです。
コピー~貼付けなどをVBAで処理する場合は当然ながらExcel内で完結することが多いのですが、SendKeysメソッドでキーコード(Ctrl+Vなど)を使用することで他アプリケーションへ貼り付けることもできます。今回はセル範囲をコピー、ペイント起動&貼付ける方法について書いていきます。
1.サンプル概要
以下画像に示す表のセル範囲をコピーし、ペイントを起動します。その後Sendkeysメソッドを使ってCtrl+vキーを送り、貼付けを行います。
2.サンプルコード
Sub Sample1() 'セルA1を含む範囲をコピーする Cells(1, 1).CurrentRegion.Copy '「ペイント」を起動 Shell pathname:="mspaint.exe", windowstyle:=vbNormalFocus '起動準備としての待ち時間を設定(サンプルでは3sec) Application.Wait Now + TimeValue("00:00:03") '「^」⇒Ctrlキー + 「v」キーを送り、貼付け実行 SendKeys "^v", True End Sub
セルA1を含むセル範囲をコピーし、Shell関数でペイントを起動しますが、起動後にWaitメソッドを利用しているはペイントが起動する前にキー送信処理を行ってしまうことを避けるためです。
サンプルではWaitを3secで設定していますが私の環境では1~2secでも問題無く動作しているので、使用環境に応じて適宜変更するのも良いと思います。
設定した待ち時間経過後、SendKeysメソッドを使用してCtrl+vキーを送ることでデータの貼付けを実行しています。
このSendKeysメソッドに指定する値、キーとコードについては以下の通りです。
オブジェクト.Sendkeys string , wait
stringは転送するキーコードを表す文字列式を指定し、waitは処理が終了するまで実行を一時中断するかどうかをTrue/Falseで指定します。Falseを指定した場合、送られたキー操作の終了を待たずに次行に制御を移しますので、ご留意ください。
◆キー/コード
キー | コード |
BackSpace | {BACKSPACE},{BS},{BKSP} |
Ctrl + Break | {BREAK} |
CapsLock | {CAPSLOCK} |
Del/Delete | {DELETE},{DEL} |
↓ | {DOWN} |
End | {END} |
Enter | {ENTER} |
Esc | {ESC} |
Help | {HELP} |
Home | {HOME} |
Ins/Insert | {INSERT},{INS} |
← | {LEFT} |
NumLock | {NUMLOCK} |
PageDown | {PGDN} |
PageUp | {PGUP} |
PrintScreen | {PRTSC} |
→ | {RIGHT} |
ScrollLock | {SCROLLLOCK} |
Tab | {TAB} |
↑ | {UP} |
F1~F16 | {F1}~{F16} |
Shift | + |
Ctrl | ^ |
Alt | % |
表内記載の通りCtrlは^なので、貼付けを実行するCtrl+vであれば ”^v”となります。
■参考1:NumLock強制解除について
以前の別記事でSendKeys使用によるNumLock強制解除について触れていますので、こちらもよければご参照ください。
SendKeysメソッド使用によるNumLock強制解除になるというバグがを回避する例としては、以下のように記述することで回避できますので、ご参考までに。
Sub Sample2() '**SendKeysメソッドはNumLockが強制解除 ' される為、WshShellオブジェクトの ' SendKeysを使用する '↓↓追加部分↓↓ Set WshShell = CreateObject("WScript.Shell") Cells(1, 1).CurrentRegion.Copy Shell pathname:="mspaint.exe", windowstyle:=vbNormalFocus Application.Wait Now + TimeValue("00:00:03") '↓↓修正/追加部分↓↓ WshShell.SendKeys "^v", True Set WshShell = Nothing End Sub
■参考2:ペイント貼付け後の処理
このサンプル動作はExcelの範囲コピー→ペイントへ貼付けで終了なのでSheet上にコピー元指定範囲が残るのですが、個人的に気になったのでSheetの範囲指定を解除するところまで実行させると以下のようになります。
Sub Sample3() Set WshShell = CreateObject("WScript.Shell") Cells(1, 1).CurrentRegion.Copy Shell pathname:="mspaint.exe", windowstyle:=vbNormalFocus Application.Wait Now + TimeValue("00:00:03") WshShell.SendKeys "^v", True Set WshShell = Nothing '↓↓貼付け処理後の待ち時間設定↓↓ Application.Wait Now + TimeValue("00:00:03") 'Excel側のコピー元範囲指定状態を解除 Application.CutCopyMode = False End Sub
範囲指定を解除するのはApplication.CutCopyMode = FalseとすればOKなのですが、ペイント側での処理後にWaitメソッドを使用した待ち時間を設けないと範囲指定解除する前に処理が終わってしまうようなので、2~3秒はWait設定した方が良いようです。
3.まとめ
今回はキーコードを用いることで他のアプリケーションを操作することもできるということについて書いてみました。
ただSendKeysメソッドのNumLock強制解除バグは致命的ではないものの地味に困るので、多少の対処は必要ですが知っておくと便利なことも多いと思います。
以上、SendKeysでキーコードを転送する方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo