VBA:更改用户窗体的父窗口

问题描述 投票:0回答:0

转发说明:
• 这里讨论的所有代码和用户窗体都在 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"

听起来他们也看到了我看到的症状,但找到了解决方法。可悲的是,我看不出他们的解决方法如何适用于我的案例(因为我没有创建任何工作簿,只是在现有书籍之间切换)。

excel vba window userform
© www.soinside.com 2019 - 2024. All rights reserved.