Отправить ключи Excel VBA без промедления

Я пытаюсь как можно быстрее скопировать некоторые ячейки из Excel в другое приложение Windows с помощью Sendkeys. Если я не использую "ждать", Sendkeys не работает. И если использовать его, Sendkeys работают медленно, а мне нужно на полной скорости, если возможно, в реальном времени. Кто-нибудь может мне помочь? Простите за английский, я студентка из Бразилии. Спасибо

Public Const MOUSEEVENTF_RIGHTUP As Long = &H10



Private Sub SingleClick()
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub

Private Sub DoubleClick()
  'Simulate a double click as a quick series of two clicks
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub

Private Sub RightClick()
  'Simulate a right click
  mouse_event MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_RIGHTTUP, 0, 0, 0, 0
End Sub


Sub Botão1_Clique()

'copy b2 and past in a specific area (another windows application)
Range("B2").Copy
SetCursorPos 765, 70
SingleClick
Application.SendKeys "^v"

Application.Wait (Now + 0.000007) ' It is the faster I can use but it's not enough

Range("B3").Copy
SetCursorPos 765, 80
SingleClick
Application.SendKeys "^v"

Application.Wait (Now + 0.000007)

Range("B4").Copy
SetCursorPos 765, 90
SingleClick
Application.SendKeys "^v"


End Sub

person dcampezano    schedule 27.01.2014    source источник
comment
В какое другое приложение Windows вы пытаетесь вставить это? И поддерживает ли он автоматизацию? В таком случае не используйте SendKeys.   -  person David Zemens    schedule 27.01.2014
comment
Я пытаюсь отправить заказ своему домашнему брокеру (фондовый рынок). Мне нужно скопировать и вставить код, количество акций и цену.   -  person dcampezano    schedule 27.01.2014
comment
Попробуйте ответ ниже. В противном случае Google ничего не обнаружит, когда я ищу Homebroker или My Homebroker. Вы уверены, что это название приложения? Я собирался посмотреть, предоставляют ли они какой-либо API, на который вы могли бы сослаться ...   -  person David Zemens    schedule 28.01.2014
comment
Извините! Homebroker - это не специальное приложение. Так мы называем виртуальное место, где мы торгуем. Я могу опубликовать ссылку, но она есть только на португальском языке :( link приложение называется Оператор +   -  person dcampezano    schedule 28.01.2014
comment
Не используйте SendKeys. Они очень ненадежны. Используйте API FindWindow / SendMessage   -  person Siddharth Rout    schedule 28.01.2014


Ответы (2)


Хотя это, вероятно, не лучший способ вести торговлю в реальном времени, я думаю, вы можете изменить свой оператор SendKey, включив в него ожидание. Я считаю, что это Application.SendKeys "^v", True заставит ваш код останавливаться на время, пока требуется выполнение команды, что может быть быстрее, чем то, что вы закодировали.

person Seth    schedule 27.01.2014
comment
Подтверждено: msdn.microsoft.com/en -us / library / office / - person David Zemens; 28.01.2014
comment
Я пробовал, но не работает. Я знаю, что это неправильный способ торговли. Я люблю Excel и обещаю, что справлюсь с этой системой. Только это. Я не буду вкладывать свои семейные средства! :) Попробую еще раз с .True. Большое спасибо за ответ. - person dcampezano; 28.01.2014

Не используйте SendKeys. Они очень ненадежны. Используйте FindWindow / FindWindowEx / SendMessage API

См. ЭТО пример, в котором я продемонстрировал, как вставить данные в стороннее приложение.

Исходя из этого, вот простой пример того, как вставить из Excel в стороннее приложение.

Пример кода (НЕ ПРОВЕРЕНО)

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long

Private Const WM_PASTE As Long = &H302

Sub Botão1_Clique()
    Dim Ret
    Dim i As Long

    '~~> Change "BLAHBLAH" to the caption of the 3rd party app.
    Ret = FindWindow(vbNullString, "BLAHBLAH")

    If Ret <> 0 Then
        '~~> Change "BLAHBLAH" to the type of textbox
        '~~> Assuming that you want to paste to textbox else change it
        Ret = FindWindowEx(Ret, ByVal 0&, "BLAHBLAH", vbNullString)

        If Ret <> 0 Then
            '~~> Looping through only 5 cells
            '~~> Change as applicable
            For i = 1 To 5
                ThisWorkbook.Sheets("Sheet1").Range("B" & i).Copy

                '~~> Paste
                SendMessage Ret, WM_PASTE, 0, ByVal 0

                DoEvents
            Next i
        Else
            Debug.Print "TextBox in 3rd Party Application Not Found"
        End If
    Else
        Debug.Print "3rd party Application Not Found"
        Exit Sub
    End If
End Sub
person Siddharth Rout    schedule 28.01.2014
comment
Большое спасибо, Дэвид, Сиддхарт, я изучу FindWindow / SendMessage. Я не программист, но мне нравится Excel VBA, а теперь мне нравится и этот сайт! :) - person dcampezano; 28.01.2014
comment
Хорошо, у меня такие же проблемы с SendKeys. Я пробовал этот код с помощью Untitled - Notepad, у меня стороннее приложение не найдено (так что текстовое поле еще не проблема). Здесь может быть полезен любой код, который идентифицирует окно стороннего приложения и компоненты графического интерфейса, а также то, как найти значение для WM_PASTE. - person Jason K.; 11.07.2014