目次

処理の順番が前後する

VBA の「SendKeys」と「SendKeys」の間に「SendKeys」以外の VBA の処理を挟んだところ、処理の順番が前後してしまってイメージ通りに処理が行われないので、その対処方法をテストしてみました。

SendKeys と SendKeys の間にワークシートのセル選択を行う VBA の処理を挟む。
SendKeys と SendKeys の間にワークシートのセル選択を行う VBA の処理を挟む。

目次まで戻る

ご注意ください

私の場合、 SendKeys ステートメントを使用したマクロを実行する度に「NumLock」が OFF になってしまいます。

原因は不明ですが、「NumLock」キーを押すと ON に戻ったので、そのままにしています。

目次まで戻る

修正前のマクロ

VBA の処理の順番が前後してしまうマクロは、下記のソースコードの内容になっています。 SendKeys の途中に「Range("c2").Select」の命令を挟んでいます。

Sub VBAの処理の順番が前後してしまうマクロ()

Cells.ClearContents '全セル内容消去

SendKeys "a{ENTER}", True 'a を入力
SendKeys "b{ENTER}", True
SendKeys "c{ENTER}", True

Range("c2").Select 'c2 セルを選択

SendKeys "d{ENTER}", True
SendKeys "e{ENTER}", True
SendKeys "f{ENTER}", True 'f を入力

End Sub

上記マクロを「B2」セルを選択した状態で実行すると、「C2:C7」の範囲に a ~ f の文字が入力されてしまいます。

「Range("c2").Select」の VBA の処理を途中に挟んでいるので、「B2:B4」の範囲に a ~ c 、「C2:C4」の範囲に d ~ f が入力されるものと思っていましたが、イメージ通りに動作しません。

「Range("c2").Select」の命令自体は、「B2」セルでマクロを実行して「C2」セルから文字の入力がスタートしているので動作はしているようです。

何故か「SendKeys」の前に実行されているようです。

1 回目の「SendKeys」の前に記述してある「Cells.ClearContents」の命令は動作しているようです。

目次まで戻る

マクロの実行結果

下記の画像の状態で上記のマクロを実行してみます。「B2」セルが選択されていて、「B2:B4」の範囲に 1,2,3 と入力されています。

Excel アプリの「ツール > オプション > 編集」の「入力後にセルを移動する」のチェックは「ON」、方向は「下」になっています。

文字の半角全角の入力モードは「半角」にしています。

マクロ実行前の Excel の画面です。「B2:B4」の範囲に 1,2,3 と入力されています。「B2」セルが選択状態になっています。
マクロ実行前の Excel の画面です。「B2:B4」の範囲に 1,2,3 と入力されています。「B2」セルが選択状態になっています。

マクロを実行してみると、以下の画像の結果になりました。「C2:C7」の範囲に a ~ f の文字が入力されています。

全セルの内容消去「Cells.ClearContents」は「SendKeys」で文字が入力される前に実行されているようです。

「C2:C7」の範囲に a ~ f の文字が入力されています。
「C2:C7」の範囲に a ~ f の文字が入力されています。

目次まで戻る

DoEvents を追加したマクロ

色々と試してみた結果、正しい方法なのかは分かりませんが、「DoEvents」を追加して実行してみるとイメージ通りの結果になりました。

SendKeys 以外の VBA の操作が行われるように途中で制御が戻って来たようです。

Sub DoEvents追加_VBAの処理の順番が前後してしまうマクロ()

Cells.ClearContents '全セル内容消去

SendKeys "a{ENTER}", True 'a を入力
SendKeys "b{ENTER}", True
SendKeys "c{ENTER}", True

DoEvents 'SendKeys 以外の VBA の命令の前に追加しました
Range("c2").Select 'c2 セルを選択

SendKeys "d{ENTER}", True
SendKeys "e{ENTER}", True
SendKeys "f{ENTER}", True

End Sub

上記マクロを実行してみると、以下の画像の結果になりました。

「SendKeys」と「SendKeys」の間の「Range("c2").Select 」の命令が途中で順番通りに実行されたようです。

「B2:B4」の範囲に a ~ c 、「C2:C4」の範囲に d ~ f が入力されている。
「B2:B4」の範囲に a ~ c 、「C2:C4」の範囲に d ~ f が入力されている。

目次まで戻る

テスト環境

  • Windows 10(64 ビット)
  • Microsoft Office Excel 2003

以上、閲覧ありがとうございました。

 

目次まで戻る

同じカテゴリの投稿(Excel VBA)

前後の投稿