【发布时间】:2017-09-20 22:00:20
【问题描述】:
我有一个关于 Excel VBA 与我的 PC 中运行的其他软件的问题。
我创建了一个 excel 文件并使用 DDE 连接来自交易软件 (SPTrader) 的数据。
现在我想将交易记录检索回 excel 文件以用于其他目的。
然后我使用 WinAPI FindWindow 和 FindWindowEX 在 SPTrader 的账户部分下找到交易记录字段的窗口。我还可以使用 ShowWindow (SW_MAXIMIZE/SW_RESTORE) 来测试窗口并证明我得到了正确的区域。
在这些区域,软件只允许使用鼠标右键单击然后从下拉列表中选择“复制所有交易”。不允许 Ctrl+C。
但是当我使用 SendMessage (CB_GETLBTEXT, CB_SELECTSTRING, LB_GETTEXT, LB_GETITEMDATA, LB_GETTEXTLEN) 并指向窗口(通过 hwnd)获取记录但它返回 0。
现在我只需使用 VBA 代码将整个软件设置为窗口的指定位置和大小。然后将鼠标光标移动到该位置并右键单击并选择“复制所有交易”,然后粘贴到excel文件中。
所以,我的问题是: 是否可以通过 VBA 从交易记录区检索数据? 这个区域的类型是什么?表、列表框、记录集……? 交易完成后如何在不手动运行函数的情况下检索数据?
非常感谢!
Public Sub TradesOrder()
Dim mainwnd As String
Dim mainwnd_ac As String
Dim hwnd As String
Dim Chwnd1 As String
Dim Chwnd2 As String
Dim Chwnd3 As String
Dim Chwnd4 As String
Dim Chwnd5 As String
Dim Chwnd6 As String
Dim Chwnd7 As String
Dim wkb As Workbook
Dim wb As String
Dim sht As String
Dim dirty As Long
wb = "SPTrader_Excel_KK.xlsm"
sht = "SPTrader_XLS"
On Error Resume Next
Set wkb = Workbooks("SPTrader_Excel_KK.xlsm")
If wkb Is Nothing Then
Workbooks.Open (ThisWorkbook.Path & "\" & wb)
Workbooks(wb).Activate
Worksheets(sht).Activate
Else
Workbooks(wb).Activate
Worksheets(sht).Activate
On Error GoTo 0
End If
mainwnd = Worksheets(sht).Range("AC1").Value
mainwnd_ac = Worksheets(sht).Range("AC2").Value
hwnd = FindWindow(vbNullString, mainwnd)
Chwnd1 = FindWindowEx(hwnd, 0&, "MDIClient", vbNullString)
Chwnd2 = FindWindowEx(Chwnd1, 0&, "TfrmAccBox", vbNullString)
Chwnd3 = FindWindowEx(Chwnd2, 0&, "TPageControl", vbNullString)
Chwnd4 = FindWindowEx(Chwnd3, 0&, "TTabSheet", "Order")
Chwnd5 = FindWindowEx(Chwnd4, 0&, "TAdvStringGrid", vbNullString)
Chwnd6 = FindWindowEx(Chwnd5, 0&, "TAdvRichEdit", vbNullString) 'TAdvRichEdit 'TGridDatePicker
SetWindowPos hwnd, HWND_NOTOPMOST, 0, 0, 850, 620, SWP_SHOWWINDOW
BringWindowToTop Chwnd2
BringWindowToTop Chwnd4
ShowWindow Chwnd4, SW_NORMAL
SetCursorPos 500, 540 'x and y mouse position
mouse_event MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0 'RightClick
mouse_event MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 'RightClick
Sleep 100
mouse_event MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0 'RightClick
mouse_event MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 'RightClick
SendKeys "{DOWN}"
SendKeys "{DOWN}"
Sleep 100
SendKeys "{ENTER}"
Worksheets(sht).Activate
Worksheets(sht).Range("C25").Select
Range("C25").PasteSpecial xlPasteAll
End Sub
【问题讨论】:
-
“交易记录”的窗口类是什么?你试过 Spy++ 吗?
-
嗨! EyIM,感谢您的关注!从类页面下的 Spy++ 中,类名称为 window TAdvRichEdit,类样式为 00000008 & CS_DBCLKS,类字节数为 0。
-
这看起来像一个自定义控件。您可以从复合网格控件读取单个单元格的机会几乎为零,除非该控件实现自动化接口。跨进程边界发送随机消息不会让你走得太远。这显然不是一个列表框或组合框,所以不要指望列表框和组合框特定的消息有任何好处。
-
谢谢,IInspectable!我的问题似乎很难。我试图在互联网上搜索主题“从自定义控件窗口表单中检索数据”。所以,我看到DataGridView可能和我的情况差不多,但我好像只针对VB.net~~不过我也发现视频正是我想要的。 youtube.com/watch?v=DxzfLpbvWEA&feature=youtu.be
-
我还没有解决这个问题,有人可以帮忙吗?