转发说明:
• 这里讨论的所有代码和用户窗体都在 Excel 插件中
• Office 是 64 位系统上的 365
我的目标是将无模式用户窗体的“父级”移动到在用户窗体处于活动状态时被激活的任何工作簿(具有给定的名称类型)。 当使用以下命令激活工作簿时,我通过重新加载用户窗体成功地做到了这一点:
''' Code in an EventClassModule:
Private Sub ExcelApp_WorkbookActivate(ByVal wbActivated As Workbook)
'… Conditional and Supporting Code …
Unload UD_SearchImageNotes
UD_SearchImageNotes.Show vbModeless
虽然可行,但这意味着必须保存表单字段并在 .Show 之后重新填写 (这看起来效率低下且笨拙)
在寻找可能更好(和更简单)的解决方案时,我在这里遇到了类似的问题和解决方案:58658670
我已经根据以下内容实施了建议的解决方案(略有改动):
''' Code (in an EventClassModule):
Private Sub ExcelApp_WindowActivate(ByVal wbBook As Workbook, ByVal wnWindow As Window)
Dim lpHWnd As LongPtr, lpHWndActivated As LongPtr
lpHWndActivated = wnWindow.hwnd
lpHWnd = FindWindowA(vbNullString, "Search Image Notes")
If lpHWnd > 0 And wbBook.Name Like "*Image Data*" Then
If GetParent(lpHWnd) <> lpHWndActivated Then
SetParent lpHWnd, lpHWndActivated
End If
End If
procFinish: Set wbBook = Nothing: Set wnWindow = Nothing
End Sub
''' Supporting Code (in a standard module):
Public Declare PtrSafe Function SetParent Lib "user32" (ByVal hWndChild As LongPtr, ByVal hWndParent As LongPtr) As LongPtr
Public Declare PtrSafe Function FindWindowA Lib "user32" (ByVal stClassName$, ByVal stWindowName$) As LongPtr
但是(遗憾的是)以上方法不起作用。事件处理程序与 FindWindowA 一样工作,但用户窗体已关闭,而不是为用户窗体分配一个新的父级。
我在 58658670:
阅读了开幕海报关于解决方案的评论"… as soon as I open another workbook from my code, it closes my Userform" and
"… managed to get it working by creating my new workbook first and then opening the workbook"
听起来他们也看到了我看到的症状,但找到了解决方法。可悲的是,我看不出他们的解决方法如何适用于我的案例(因为我没有创建任何工作簿,只是在现有书籍之间切换)。