2014-01-27 187 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的值在这里都可能有用。 –