Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Home Premium : Excel 2010)
Auto_Open 内ではSendkeysが動作しない?
投稿日時: 20/05/14 22:33:23
投稿者: shimoichimabu

いつもお世話になります。
 
ThisWorkbookに下記コードを記載しています。
 
Private Sub workbook_open()
 
Dim WSH As Object
 
    Set WSH = CreateObject("WScript.Shell")
 
    Application.OnKey "~", "タイトル検索PRG"
    Application.OnKey "{ENTER}", "タイトル検索PRG"
 
    Sheets("閲覧").Select
    Range("B3").Activate
    WSH.SendKeys "{F2}"
     
End Sub
 
本ファイルを開いた時、
SendKeys "{F2}" が動作しません。
標準モデュールでは動作します。
 
Application.SendKeys "{F2}"だと
ちゃんと動作します。
しかし、テンキー使用時、NUMLOCKがオフになっているようです。
 
そもそもAuto_Open内ではWSH.SendKeys "{F2}"は動作しないのでしようか?

回答
投稿日時: 20/05/14 23:21:48
投稿者: simple

同じ環境(OS,Excelとも)ですが、下記のコードは正常に動作します。
起動時に編集モードになっています。
 

Private Sub workbook_open()
    Dim WSH As Object

    Set WSH = CreateObject("WScript.Shell")
    Sheets(1).Select
    Range("B3").Activate
    WSH.SendKeys "{F2}"
End Sub

もともとSendKeysというのは、Application. も、wsh.のほうも
タイミングの関係で動作は必ずしも保証されない、と考えておいた方がよいと思います。
Sendkeysの前に DoEventsをいくつか入れてタイミングを調整してみるとか、
トライしてみてはいかがですか?
 
ちなみに、
>しかし、テンキー使用時、NUMLOCKがオフになっているようです。
これは、今回の話とどうつながるんでしょうか?( ~ が利かないのですか?)

投稿日時: 20/05/14 23:53:29
投稿者: shimoichimabu

simpleさん回答ありがとうございます。
 
修正です。
Auto_Open →  workbook_Open
 
そちらでは、うまく動作するのですね。
 
・・・・・・
Range("B3").Activate
DoEvents
DoEvents
DoEvents
DoEvents
WSH.SendKeys "{F2}"
・・・・・・・
 
DoEventsを4つ入れても駄目でした。
 
>これは、今回の話とどうつながるんでしょうか?( ~ が利かないのですか?)
Application.SendKeys "{F2}"で、Applicationにすると、動作する理由が不明です。
ただ、このコマンドはNUMLOCKに関してバグが発生しやすいと聞いています。
案の定、発生してしまいました。例えば、テンキーの1を入力すると、 end のコマンドになります。
このようなことが起こったので、Application.SendKeys "{F2}"は使えなく、少し話題にしました。
 

回答
投稿日時: 20/05/15 08:15:35
投稿者: MMYS

当方の環境では、正常に動作します。
 
 

shimoichimabu さんの引用:

Application.SendKeys "{F2}"で、Applicationにすると、動作する理由が不明です。
ただ、このコマンドはNUMLOCKに関してバグが発生しやすいと聞いています。
案の定、発生してしまいました。例えば、テンキーの1を入力すると、 end のコマンドになります。
このようなことが起こったので、Application.SendKeys "{F2}"は使えなく、少し話題にしました。

Windowsのキーボード入力の仕組みの理解が必要だと思います。
{F2}はどのウインドウに送られて、いつメッセージが届くのでしょう。
 
Application.SendKeysは、使わず、
自前で仮想キーを操作すると理解出来るかも。
検索するとVBAのサンプルも見つかります。
 
 
 
 
 
 
 

回答
投稿日時: 20/05/15 10:32:31
投稿者: simple

私の環境でも、別のシートをアクティブにした状態で保存したうえで
開いてみると、F2が実行されるタイミングを逸しているようです。
 
そこで、以下の方法を試してみたら改善されました。
参考にしてみてください。
 
(1)現在のWSHを使ってSendKeysする部分は、testと言う名前で、標準モジュールに移します。
(2)ThisWorkbookモジュールには、

    Private Sub Workbook_Open()
        Sheets("閲覧").Select
        Range("B3").Activate
        Application.OnTime Now(), "test"
    End Sub  
とします。
(3)これでもうまくいかなければ、Now()を Now() + TimeSerial(0,0,1) に変更してみるとか。

回答
投稿日時: 20/05/15 12:13:50
投稿者: simple

それから、回答もらったNumLockキーとの関連については、
今まで経験がなかったので勉強になりました。
そういうこともあるんですねえ。まったく対応策は見当つきません。
バグというか不具合というか、そういうことならユーザーに手立てはないような気がします。
Microsoft関連のQA会議室で質問して、注意喚起を促すのがよいかもしれません。

投稿日時: 20/05/15 20:46:48
投稿者: shimoichimabu

MMYSさん、simpleさん回答ありがとうございます。
 
MMYSさんの環境ではちゃんと動作するのですね。
 
本日、会社のPCでは最初提示したコードで、うまく動作しました。
 
Application.OnTime Now(), "test" でうまく動作しました。
同一ブック内のシートで保存して、起動してもうまく動作しました。
 
SendKeyはPC環境によって微妙に異なる動作しますね。