Вызов из одного файла пользовательской формы в другом
Напишите код 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
Изменено / улучшено на основе общей логики, представленной здесь:
НОТА
Я думаю 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