2014-01-10 5 views
6

Excel VBA에서 .SendKeys()을 사용하여 쉘 .AppActive 메서드를 사용하여 활성 상태로 만드는 외부 윈도우에 키 입력을 보냅니다. 문제는 SendKeys이 단순히 일관되게 동작하지 않으며 때로는 키를 보내고 때로는 전송하지 않는 것입니다. MSDN 설명서에 따라 버퍼에 키를 저장하는 것과 관련이 있다고 생각합니다.SendKeys가 항상 작동하지 않는 경우

어떻게이 문제를 해결할 수 있습니까?

답변

1

이 문제에 대한 해결책은 잠시 동안 응용 프로그램을 일시 중지하는 것이 었습니다. 이것은 버퍼를 지우는 것을 허용하는 것 같다. 다음 모든 SendKeys 명령 후, 난 그냥 사용

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

그리고 :

Sleep 1 
엑셀 VBA 잠을하기 위해

, 나는 모듈의 상단에 작성하여 Windows API 함수 Sleep 노출

글자 그대로 1 밀리 초가 모든 차이를 만들었고 키는 항상 올바르게 전송되었습니다.

+0

당신이 실행할 문제는 PROD가 아니라 DEV 환경에서 작동한다는 것입니다. 또는 ... 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

관련 문제