Const VK_H = 72
Const VK_E = 69
Const VK_L = 76
Const VK_O = 79
Const KEYEVENTF_KEYUP = &H2
Const INPUT_MOUSE = 0
Const INPUT_KEYBOARD = 1
Const INPUT_HARDWARE = 2
Private Type MOUSEINPUT
dx As Long
dy As Long
mouseData As Long
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type
Private Type KEYBDINPUT
wVk As Integer
wScan As Integer
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type
Private Type HARDWAREINPUT
uMsg As Long
wParamL As Integer
wParamH As Integer
End Type
Private Type GENERALINPUT
dwType As Long
xi(0 To 23) As Byte
End Type
Private Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Sub Form_KeyPress(KeyAscii As Integer)
'Print the key on the form
Me.Print Chr$(KeyAscii);
End Sub
Private Sub Form_Paint()
'KPD-Team 2000
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
'Clear the form
Me.Cls
'call the SendKey-function
SendKey VK_H
SendKey VK_E
SendKey VK_L
SendKey VK_L
SendKey VK_O
End Sub
Private Sub SendKey(bKey As Byte)
Dim GInput(0 To 1) As GENERALINPUT
Dim KInput As KEYBDINPUT
KInput.wVk = bKey 'the key we're going to press
KInput.dwFlags = 0 'press the key
'copy the structure into the input array's buffer.
GInput(0).dwType = INPUT_KEYBOARD ' keyboard input
CopyMemory GInput(0).xi(0), KInput, Len(KInput)
'do the same as above, but for releasing the key
KInput.wVk = bKey ' the key we're going to realease
KInput.dwFlags = KEYEVENTF_KEYUP ' release the key
GInput(1).dwType = INPUT_KEYBOARD ' keyboard input
CopyMemory GInput(1).xi(0), KInput, Len(KInput)
'send the input now
Call SendInput(2, GInput(0), Len(GInput(0)))
End Sub
Что я делаю: Есть столбик значений (~1000) который содержит только цифры (от 1 до 100). Я копирую каждую ячейку и вставляю в другую программу посредством стрелки "вниз".
Вопрос: Как мне переделать код таким образом чтобы он имитировал сочетание клавиш "Ctrl+V" (вставка) и стрелку "вниз" (сдвинуться вниз на 1 ячейку)?
Другие способы (SendKey) не работают поскольку вставляю значение из Exscel в другие приложения, в которых они блокируются.
Что-то не густо с ответами... Я подобное делаю скриптом AutoIt - в общем довольно несложный синтаксис, хороший хелп, форумы на разных ресурсах. Готовый скрипт можно сконвертировать в выполняемый файл - это чтоб не ставить на машину сам AutoIt. Но тут это offtop
Да, дело в памяти, но не в том направлении, как Вы себе представляете. ОС нужно некоторое время для обработки в памяти выполнения команд пользователя. В том виде, как у Вас сейчас отрабатывает макрос, непрерывность отсылки команд приводит к переполнению стека (аналог спама), и выполнение прерывается. Используйте функцию DoEvents, тогда проблема решится.
For Each i In Selection
'÷èñëî ìîæåò áûòü íå îäíîðàçðÿäíîå ...
If Len(i) > 0 Then
For v = 1 To Len(i)
SendKey i.Offset(0, v).Value
Next
End If
'Æì¸ì ñòðåëêó ÂÍÈÇ
SendKey VK_DOWN
DoEvents
Next
For Each i In Selection
For v = 1 To Len(i)
DoEvents
For n = 1 To 10
Next
SendKey i.Offset(0, v).Value
Next
DoEvents
For n = 1 To 10
Next
SendKey VK_DOWN
Next
Цикл до 100 ... и DoEvents был после пустого цикла - тоже не помогло.
Вчёра всё работало на примере офисных приложений: Excel, Outlook, Блокнот. Сегодня попыталась осуществить ввод данных в другой приложение - цифры вбиваются, а вот клавиши Enter и Down не работают. Хотя эти клавиши с клавиатуры нормально функционируют (т.е. если я нажимаю на этои клавиши они выполняются в сторонней программе своё предназначение).
Здравствуйте! А можно этой утилитой с листа. Excel перенести данные? Это просто? Нужно устанавливать на компьютер программу? На работе прав админа нет.
Ну я не настолько спец в AutoIt, чтоб так с ходу сказать пойдёт/непойдёт, но да, примерно так. Только там ещё нужны файлы GUIConstants.au3 ExcelCOM_UDF.au3 ну или другие, смотря как писать (у меня например есть Excel.au3, а ExcelCOM_UDF.au3 нет). Ставите сам AutoIt, пишите/отлаживаете код, затем можно результат труда конвертнуть в exe - тогда уже AutoIt для работы не нужен. Кстати кажется AutoIt работает без установки - достаточно просто скопировать папку. Так что админ может не понадобиться. Если освоите - лишним не будет, я часто использовал, чтоб рутины избегать.
Я попробую на AutoIt. Но ... я столько времени потратила на Excel ... вот почему не работают Enter и Down?! Ну хоть кто-нибудь, объясните пожалуйста, очень надо! Дело принципа!
Возвращаюсь к теме со стороны Excel: есть ли возможность приостанавливать выполнение макроса до момент нажатии пользователем на клавиши DOWN? Файл Excel при этот не должен становиться активным (оставаться активным должно то окно, которое было до нажатия клавиши).