2014-01-10 148 views
6

我在Excel VBA中使用.SendKeys()將鍵擊發送到使用shell .AppActive方法激活的外部窗口。問題在於SendKeys的行爲並不一致,有時會發送密鑰,有時不會。根據MSDN文檔,我認爲這與將密鑰存儲在緩衝區中有關。SendKeys並不總是工作

如何解決這個問題?

回答

1

我發現這個問題的解決方案是讓應用暫停一會兒。這似乎允許緩衝區清除(糾正我,如果我錯了)。

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

,然後每SendKeys命令後,我只是用:

Sleep 1 

爲了使Excel的VBA的睡眠,我通過在模塊的頂部寫暴露Windows API函數Sleep

從字面上看,1毫秒造成了所有差異,並且鍵總是正確發送。

+0

您遇到的問題是它將在您的DEV環境中工作,而不是PROD。或者......它將在PROD環境中工作......有時候......然後它將停止工作。硬編碼延遲永遠不會好。但這可能適合您的目的。 – robnick

4

您可以考慮使用比SendKeys更可靠的Autoit。從下面的鏈接 http://www.autoitscript.com/site/autoit/downloads/

下載AutoIt的添加在參考AutoIt的插件 AutoItX3 1.0類型庫

下面的示例代碼將打開計算器,然後鍵入123456789

Sub sendkeys() 

'Open a calc 
    StartCalculator 

    Dim au As New AutoItX3Lib.AutoItX3 
    au.AutoItSetOption "WinTitleMatchMode", 2 

    au.WinActivate "Calculator" 

    'send key strokes 
    au.ControlClick "Calculator", "", "Button5" 
    au.ControlClick "Calculator", "", "Button11" 
    au.ControlClick "Calculator", "", "Button16" 
    au.ControlClick "Calculator", "", "Button4" 
    au.ControlClick "Calculator", "", "Button10" 
    au.ControlClick "Calculator", "", "Button15" 
    au.ControlClick "Calculator", "", "Button3" 
    au.ControlClick "Calculator", "", "Button9" 
    au.ControlClick "Calculator", "", "Button14" 

End Sub 

Sub StartCalculator() 
    Dim Program As String 
    Dim TaskID As Double 
    On Error Resume Next 
    Program = "calc.exe" 
    TaskID = Shell(Program, 1) 
    If Err <> 0 Then 
     MsgBox "Can't start " & Program 
    End If 
End Sub 

enter image description here

+0

謝謝!愛你! :-) – GTAVLover