2014-01-27 185 views
0

我試圖從Excel中複製一些單元格到另一個Windows應用程序使用Sendkeys儘可能快。如果我不使用「等待」,Sendkeys將失敗。如果使用它,Sendkeys運行緩慢,如果可能的話,我需要全速運行。 任何人都可以幫助我? 對不起,我是一名巴西學生。 謝謝Excel VBA 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 
+1

什麼其他的Windows應用程序是你想粘貼到?它是否支持自動化?如果是這樣,不要使用'SendKeys'。 –

+0

我正嘗試向我的家庭經紀人(股票市場)發送訂單。我需要複製並粘貼代碼股票,股票數量和價格。 – dcampezano

+0

請嘗試下面的答案。否則,當我搜索「Homebroker」或「我的家庭經紀人」時,Google什麼都沒有。你確定這是應用程序的名稱嗎?我要去看看他們是否提供任何你可以參考的API ... –

回答

1

雖然這可能不是進行實時交易的最好方式,我覺得你可以修改你的SendKey語句,以包括等待。我相信這個Application.SendKeys "^v", True會強制你的代碼暫停,只要它執行命令,這可能比你編寫的代碼更快。

+0

確認:http://msdn.microsoft.com/en-us/library/office/aa202943(v=office.10).aspx –

+0

我試過但沒有工作我知道這不是一種正確的交易方式,我喜歡Excel並且保證我能做到這一點,只是它,我不會投資我的家庭基金!:)我會再次嘗試使用「.True」。非常感謝你的回答。 – dcampezano

0

請勿使用SendKeys。他們非常不可靠。使用FindWindow/FindWindowEx/SendMessage API

THIS例如,我對如何粘貼到第三方應用證明。

基於此,這裏是一個簡單的例子,說明如何從Excel粘貼到第三方應用程序。

示例代碼(UNTESTED

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 
+0

非常感謝,David,Siddhart,我將學習FindWindow/SendMessage。我不是程序員,但我喜歡Excel VBA,現在也喜歡這個網站! :) – dcampezano

+0

好吧,我有相同的SendKeys問題。我嘗試使用「無標題 - 記事本」代碼,我找到了「未找到第三方應用程序」(所以文本框還不是問題)。任何標識第三方應用程序窗口和GUI組件的代碼,以及如何查找WM_PASTE的值在這裏都可能有用。 –