更改外接程序用户窗体的父工作簿窗口

时间:2019-11-01 11:41:55

标签: excel vba

我已经为这个问题苦苦挣扎了一段时间了。

我有一个用户窗体,该窗体是从我构建的Excel加载项中调用的,然后可以测试当前活动的工作簿是否包含特定的结构。如果没有,它将创建具有该确切结构的新工作簿。我设置了该工作簿以及我打开的另一个工作簿,分别为wb1和wb2。

问题在于,在单击功能区按钮时,最初是从活动工作簿(可以是任何工作簿)中调用用户窗体的,而基本上是单独锁定到THAT工作簿上的。

有什么办法可以将用户窗体与该工作簿分离,并进行更改以在用户窗体的背景中显示我的wb2?

我尝试了以下代码,但是它只是关闭了我的用户窗体,因此无法正常工作。

@Grapes([
        @Grab("org.gebish:geb-core:3.2"),
        @Grab("org.seleniumhq.selenium:selenium-firefox-driver:3.141.59"),
        @Grab("org.seleniumhq.selenium:selenium-support:3.141.59")
])
import geb.Browser
browser = new Browser()
println "Hello from test"

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这是我的外接程序中的代码,以一种无模式的用户窗体显示所有打开的工作簿中的所有工作表,并激活了(由dblcick选择)。呼叫:致电ShowModeless

外接程序文件中的WinActivate类

' Class WinActivate
Public WithEvents AppEvents As Application

Private Declare PtrSafe Function SetParent Lib "user32" _
   (ByVal hWndChild As LongPtr, ByVal hWndNewParent As LongPtr) As LongPtr

Private Sub AppEvents_WindowActivate(ByVal Wb As Workbook, ByVal Wn As Window)
    'Change precedent object of UserForm for new created windows
    If Val(Application.Version) >= 15 Then SetParent UserFormHandle, Wn.hWnd
End Sub

插件文件中的模块1

'Module1 code
Option Explicit

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
  (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Dim WA                  As New WinActivate

Public UserFormHandle   As Long

' DajArkusze is my Userform in Addin file
Sub ShowModeless()
    Set WA.AppEvents = Application
    DajArkusze.Show 0
    UserFormHandle = FindWindow("ThunderDFrame", DajArkusze.Caption)
End Sub