Вызов из одного файла пользовательской формы в другом

Напишите код VBA, который вызывает пользовательскую форму одного файла Excel для всех других файлов Excel, находящихся в папке с именем john и мастер Excel (состоит из следующего кода и пользовательской формы) находится в другом месте:

 Private Sub Workbook_OnClick()
    Dim mypath As String
    Dim file As String
    Dim wb As Workbook
    Dim pat As String
    Application.ScreenUpdating = False
    ChDrive "C:"
    ChDir "C:\Users\Administrator\Desktop\John"
    'john is a folder that consists of the excel files 
    mypath = Range("B1").Value
    'mypath has the same value as chDir
    file = Dir(mypath & "\" & "*.xlsx")
    Do While file <> ""
        Set wb = Application.Workbooks.Open(file)
        If Not IsEmpty(wb) Then
            Application.Visible = False
            userform1.Show
        End If
        wb.Close
        file = Dir()
    Loop
End Sub

Код извлекает пользовательскую форму из основного файла Excel вместо файлов Excel, представленных в john папка.

2 ответа

Решение

Рабочая книга, содержащая пользовательскую форму, которую вы хотите отобразить, должна также иметь процедуру, которая отображает форму. Вам нужно будет вызвать эту процедуру для отображения пользовательской формы. Это может быть функция или подпрограмма, я предпочитаю функцию, потому что тогда вы можете вернуть успех / неудачу для обработки ошибок.

В книге UserForm вы добавите процедуру, подобную этой, в Module1 (или любом другом модуле, но вам нужно будет сослаться на это позже):

Public Function ShowTheForm(Optional Modal As Boolean = False)
    'API to display a userform in THIS workbook, from another workbook

     On Error Resume Next
     UserForm1.Show IIF(Modal,vbModal,vbModeless)
     ShowTheForm = (Err.Number = 0)
End Function

Затем в рабочей книге, которая пытается назвать эту форму открытой, вам нужно будет вызвать ShowTheForm процедура, вот так:

Do While file <> ""
    Set wb = Application.Workbooks.Open(file)
    If Not IsEmpty(wb) Then
        Application.Visible = False
        Application.Run("'" & wb.Name & "'!Module1.ShowTheForm")
    End If
    wb.Close
    file = Dir()
Loop

Потому что вы дали ShowTheForm в качестве функции с возвращаемым значением вы можете перехватывать ошибки, например:

If Not Application.Run("'" & wb.Name & "'!Module1.ShowTheForm") Then
    MsgBox "Unable to display..."
    Exit Sub
End If

Изменено / улучшено на основе общей логики, представленной здесь:

http://answers.microsoft.com/en-us/office/forum/office_2007-excel/how-do-you-open-userform-in-another-workbook/e97b2c06-2a79-4cef-89bc-4f67b0f3c03a?db=5&auth=1

НОТА

Я думаю IsEmpty не является подходящим тестом для объекта книги, вы можете захотеть посмотреть на это. Я не уверен, что вы пытаетесь сделать с этой линией, но я почти уверен, что она не делает то, что, по вашему мнению, делает.

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

Workbooks("Book1.xls").VBProject.VBComponents.Item("UserForm1")

это работает, но я не могу использовать .Show метод:

Sub UFtest()
Dim UF_test As Object
    Set UF_test = ThisWorkbook.VBProject.VBComponents.Item("UserForm1")
    UF_test.Show
End Sub

Вот ваш полный код:

Private Sub Workbook_OnClick()
    Dim mypath As String
    Dim file As String
    Dim wb As Workbook
    Dim pat As String
    Application.ScreenUpdating = False
    ChDrive "C:"
    ChDir "C:\Users\Administrator\Desktop\John"
    'john is a folder that consists of the excel files
    mypath = Range("B1").Value
    'mypath has the same value as chDir
    file = Dir(mypath & "\" & "*.xlsx")
    Do While file <> ""
        Set wb = Application.Workbooks.Open(file)
        If Not IsEmpty(wb) Then
            Application.Visible = False
            wb.VBProject.VBComponents.Item("UserForm1").Show
        End If
        wb.Close
        file = Dir()
    Loop
End Sub
Другие вопросы по тегам