根据单元格中的UserForm值调用UserForm

我有一个表具有以下值:

在这里输入图像说明

现在,我想根据列G中的值调用列H中的用户窗体,但是我不能根据单元格值调用用户窗体。 错误发生在行中

form.Name = wsControls.Cells(loop2, 8).Value 

这是我的代码:

 Sub Check_Scenarios() Dim wsAbsatz As Worksheet Dim wsControls As Worksheet Dim wsData As Worksheet Dim loop1 As Long Dim loop2 As Long Dim lngKW As Long Dim form As UserForm Set wsAbsatz = ThisWorkbook.Worksheets("Production") Set wsData = ThisWorkbook.Worksheets("Data") Set wsControls = ThisWorkbook.Worksheets("Controls") lngKW = wsControls.Cells(1, 2).Value + 2 If lngKW = 3 Then Exit Sub End If For loop1 = wsControls.Cells(10, 2).Value To wsControls.Cells(19, 2).Value Step 10 If wsData.Cells(loop1 + 3, lngKW).Value <> "" Then MsgBox (wsData.Cells(loop1 + 3, lngKW).Value) For loop2 = 2 To 16 If wsData.Cells(loop1 + 3, lngKW).Value = wsControls.Cells(loop2, 7).Value Then form.Name = wsControls.Cells(loop2, 8).Value 'error occurs here form.Show End If Next loop2 End If Next loop1 End Sub 

项目:

在这里输入图像说明

非常感谢您的帮助!

您不要“调用”用户窗体。 你实例化它,然后你Show它。

UserForm是派生所有用户表单的“基类”。 请参阅VBA 中的inheritance,而不是自定义类。

所以你有一个UserForm2类,一个UserForm3类,一个UserForm4类,等等。

这些类需要实例化之后才能使用。

 Dim theForm As UserForm Set theForm = New UserForm2 theForm.Show Set theForm = New UserForm3 theForm.Show '... 

所以你需要的是一个参数化的方法Set theForm = New ????? 部分。

而你不能。 因为无论你要做什么,一个单元格的内容将会是一个string,并且你不可能从一个名为"UserForm3"String中获得一个UserForm3的实例。

做一个工厂的function,做翻译:

 Public Function CreateForm(ByVal formName As String) As UserForm Select Case formName Case "UserForm1" Set CreateForm = New UserForm1 Case "UserForm2" Set CreateForm = New UserForm2 Case "UserForm3" Set CreateForm = New UserForm3 '... End Select End Function 

然后调用该函数来获取表单对象:

 Set form = CreateForm(wsControls.Cells(loop2, 8).Value) If Not form Is Nothing Then form.Show 

您正尝试将名称分配给蓝图 。 这是两个错误。

你必须初始化你的蓝图。 喜欢这个:

Dim form As New UserForm然后,最有可能您的UserForm没有名为的属性。 它被称为Caption 。 因此,它是这样的:

 Sub TestMe() Dim uf As New UserForm1 'judging from your screenshot uf.Caption = "Testing" uf.Show End Sub 

免责声明:有一种更好的方式来处理用户窗体,而不是滥用蓝图,尽pipe几乎每个VBA书都显示了这个UserForm.Show方法(事实上我读过的每一个)。

如果你有时间和面向对象的知识来执行这里的想法 – 或从我的理念的解释 。 在StackOverflow中也有关于它的文档文章,但是它被整个文档的想法所删除。