我使用工作中的应用程序在我的公司数据库上进行搜索。应用程序将搜索结果导出到“AppData \ Local \ Temp \”文件夹中的excel文件。我需要这个excel文件来处理我的主宏。通过外部应用程序打开的新工作簿导致宏停止
通常我手动点击应用程序中的按钮来进行搜索,然后我发现我可以使用windows api来为我做一个宏。然后我写这个宏:
Public Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Public Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const WM_CLOSE As Long = &H10
Public Const BM_CLICK As Long = &HF5&
Sub Makro1()
advanced_search = FindWindow("WindowsForms10.Window.8.app.0.33c0d9d", vbNullString)
window_group_1 = FindWindowEx(advanced_search, 0&, "WindowsForms10.Window.8.app.0.33c0d9d", vbNullString)
window_group_2 = FindWindowEx(advanced_search, window_group_1, "WindowsForms10.Window.8.app.0.33c0d9d", vbNullString)
search_button = FindWindowEx(window_group_2, 0&, "WindowsForms10.BUTTON.app.0.33c0d9d", "Search")
excel_button = FindWindowEx(window_group_2, 0&, "WindowsForms10.BUTTON.app.0.33c0d9d", "Export to Excel")
Call PostMessage(search_button, BM_CLICK, 0, 0)
Do
DoEvents
search_results_info = FindWindow("WindowsForms10.Window.8.app.0.33c0d9d", "Search Results")
Loop Until search_results_info > 0
search_results_info_button = FindWindowEx(search_results_info, 0&, "WindowsForms10.BUTTON.app.0.33c0d9d", vbNullString)
Call PostMessage(search_results_info_button, BM_CLICK, 0, 0)
Call PostMessage(excel_button, BM_CLICK, 0, 0)
Do
DoEvents
search_results_excel = FindWindow("XLMAIN", "Microsoft Excel - search_results")
Loop Until search_results_excel > 0
Call SendMessage(search_results_excel, WM_CLOSE, 0, ByVal 0&)
End Sub
代码运行,直到下面的行执行。 Call PostMessage(excel_button, BM_CLICK, 0, 0)
在此行后,temp文件夹中的excel文件打开并成为活动工作簿,因此我的宏停止工作。
当搜索结果信息窗口出现时,我遇到了同样的问题,但后来我将sendmessage切换到发布消息并解决了问题。 是否有任何方法让我的宏运行并忽略由外部应用程序打开的excel文件?
编辑:改变 Call SendMessage(search_results_excel, WM_CLOSE, 0, ByVal 0&)
到 Call PostMessage(search_results_excel, WM_CLOSE, 0, ByVal 0&) ThisWorkbook.Activate
问题就解决了。
将Excel作为COM组件调用。它更简单,更可靠。 – Tarik