SendKeys не всегда работает
Я использую .SendKeys() в Excel VBA для отправки штрихов клавиш во внешнее окно, которое я делаю активным с помощью shell .AppActive метод. Проблема в том, что SendKeys просто не ведет себя последовательно и иногда отправляет ключи, а иногда и нет. Я думаю, что это имеет какое-то отношение к хранению ключей в буфере в соответствии с документацией MSDN.
как обойти это?
2 ответов
вы можете использовать Autoit, который более надежен, чем SendKeys.
загрузить Autoit из ссылки ниже http://www.autoitscript.com/site/autoit/downloads/
добавить в ссылку autoit addin 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

я обнаружил, что решение этой проблемы состояло в том, чтобы просто сделать паузу приложения на короткое время. Это, кажется, позволяет буферу очистить (поправьте меня, если я ошибаюсь, пожалуйста).
чтобы сделать Excel VBA sleep, я выставил функцию Windows API Sleep написав в верхней части модуля:
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
а потом после каждого SendKeys команда, я просто использовал:
Sleep 1
и буквально, 1 миллисекунда сделала всю разницу, и ключи всегда были отправлено правильно.