none
VBAにおけるsendkeysの命令有効順番がおかしい。 RRS feed

  • 質問

  • 端的に申し上げます。以下コードにおいて、「sendkeys"200"」のコードはなぜか「Range("D1").Value = 10000」よりも後に有効になります。

    つまり、D1のセルには最終的に200が入力されます。これはいったいなぜでしょうか。

    どうかお知恵をお貸し頂けると幸いです。

    Public Sub a()

    Range("D1").Selection

    SendKeys "200", True

    Range("D1").Value = 10000


    End Sub

    2017年10月26日 7:00

回答

  • Execel2010ですが、私も同様の現象が発生しました。
    キーバッファからの出力がされないようなので、
    試しにDoEventsを呼び出したところ、私の環境では上手く動いてるようにみえます。

    Public Sub Test()
        Range("D1").Select
        SendKeys "200{ENTER}", True
        
        DoEvents
        
        Range("D1").Value = 10000
    End Sub


    2017年11月2日 9:12
  • おお、これで期待通りに動きますね。

    やっぱりキーバッファからの書き出しのタイミングが原因でしょう。

    • DoEvents 関数
      「DoEvents はオペレーティング システムに制御を渡します。オペレーティング システムがキュー内のイベントの処理を終了し、 SendKeys キューのすべてのキーを送信した後で、制御は返されます。」


    hebikuzure

    2017年11月3日 3:57

すべての返信

  • フォーラムオペレーターの栗下 望です。
    nanaki098 さん、ご投稿いただきありがとうございます。

    ご質問いただいた内容については、
    その後いかがでしょうか?

    本件につきましては、 MSDN フォーラムの Visual Basic for Application(VBA) フォーラム をお役立ていただいたほうが情報が集まりやすいかもしれません。

    また、少しでも情報が集まりやすくなるように、
    お知らせフォーラムに掲載しているスレッドをご紹介させていただきます。

    フォーラムのご利用方法(質問の投稿)について
    https://social.technet.microsoft.com/Forums/ja-JP/b2074c04-2e91-414d-8e9e-d634be311e31?forum=announceja


    どうぞよろしくお願いいたします。


    MSDN/TechNet Community Support 栗下 望


    2017年11月1日 2:21
    モデレータ
  • 移動のお願いが書かれている後でなんですが、理由は SendKeys はキーバッファへの送信を行うだけなので、そこからへの Excel への入力と、続行の VBA コードの実行が非同期だからではないでしょうか。

    SendKeys の後に wiat などでタイミングを調整するとどうなるでしょうか?

     


    hebikuzure

    2017年11月1日 7:39
  • 返信頂き、ありがとうございます。

    waitについての対策はすでに行ったことがあり、有効ではありませんでした。

    具体的には、「時間は待つが、sendkeyは最後に命令される」という結果になります。

    よろしくお願いいたします。

    2017年11月2日 7:52
  • 確かに手元(Excel 2016 ビルド 8528.2147)で試しても同じですね。以前のバージョンだとうまくいっていたはずなのですが....。

    お使いの Excel のバージョンはなにでしょう?

     

    hebikuzure

    2017年11月2日 8:57
  • Execel2010ですが、私も同様の現象が発生しました。
    キーバッファからの出力がされないようなので、
    試しにDoEventsを呼び出したところ、私の環境では上手く動いてるようにみえます。

    Public Sub Test()
        Range("D1").Select
        SendKeys "200{ENTER}", True
        
        DoEvents
        
        Range("D1").Value = 10000
    End Sub


    2017年11月2日 9:12
  • おお、これで期待通りに動きますね。

    やっぱりキーバッファからの書き出しのタイミングが原因でしょう。

    • DoEvents 関数
      「DoEvents はオペレーティング システムに制御を渡します。オペレーティング システムがキュー内のイベントの処理を終了し、 SendKeys キューのすべてのキーを送信した後で、制御は返されます。」


    hebikuzure

    2017年11月3日 3:57