PR

【VBA】SendKeysでキーコードを転送する

これで楽に!?VBA活用
記事内に広告が含まれています。

こんにちは、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強制解除について触れていますので、こちらもよければご参照ください。

【VBA】カレントフォルダを別フォルダに変更する
こんにちは、Ryoです。 Excelを扱う中で例えばファイルを開こうとする操作の際に、Excel側で設定されたフォルダがカレントフォルダとして開くわけですが、そのフォルダを変えたい場合に都度変える作業を煩わしく思うことがありますよね。そこで...

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

タイトルとURLをコピーしました