Изменение окна родительской книги пользовательской формы надстройки - PullRequest
2 голосов
/ 01 ноября 2019

Я уже давно борюсь с этим вопросом.

У меня есть пользовательская форма, которая вызывается из созданной мной надстройки Excel, которая затем проверяет, содержит ли текущая активная книга определенную структуру. Если нет, то создается новая рабочая книга с такой точной структурой. Я установил эту книгу, а также другую книгу, которую я открыл как wb1 и wb2.

Проблема заключается в том, что пользовательская форма изначально вызывается из активной рабочей книги (может быть любой рабочей книгой) во время нажатия кнопки ленты ив основном привязывается только к ЭТОЙ книге.

Можно ли каким-либо образом отсоединить пользовательскую форму от этой книги и изменить ее, чтобы показывать мой wb2 на фоне моей пользовательской формы?

Я пробовал следующий код, но он просто закрывает моюпользовательская форма и не работает.

 Option Explicit
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal clsName As String, ByVal wndName As String) As Long
Private Declare PtrSafe Function SetParent Lib "user32" (ByVal hChild As Long, ByVal hParent As Long) As Long

Private Sub CommandButton1_Click()
  Static h As Long
  If h <= 0 Then h = FindWindow("ThunderDFrame", Me.Caption)
  If h <= 0 Then Exit Sub
  Dim wb As Workbook: Set wb = Workbooks.Add
  SetParent h, Application.Windows(wb.Name).Hwnd
  wb.Activate
End Sub

Есть идеи?

1 Ответ

1 голос
/ 01 ноября 2019

Вот мой код из моего Addin, чтобы показать все листы во всех открытых книгах в одной немодальной пользовательской форме и активировать (по dblcick) выбранный. Вызов: Call 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

Module1 в файле надстройки

'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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...