2015-06-14 88 views
0

我使用工作中的应用程序在我的公司数据库上进行搜索。应用程序将搜索结果导出到“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问题就解决了。

+2

将Excel作为COM组件调用。它更简单,更可靠。 – Tarik

回答

1

更改您的宏,以便它不使用ActiveWorkbook而是使用或者ThisWorkbook指本身或Workbooks("book_name.xlsm")指命名为“book_name.xlsm”工作簿。这样,任何单元格或工作表引用都会引用正确的工作簿,而不管其他书是打开的还是哪些是活动工作簿。

相关问题