Vba 基于单元格中的Userform值调用Userform

Vba 基于单元格中的Userform值调用Userform,vba,excel,Vba,Excel,我有一个具有以下值的表: 现在,我想基于G列中的值调用H列中的Userform,但是我无法确定如何基于cell值调用Userform。错误发生在第行 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 D

我有一个具有以下值的表:

现在,我想基于G列中的值调用H列中的Userform,但是我无法确定如何基于cell值调用Userform。错误发生在第行

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
Sub-Check\u场景()
将wsAbsatz设置为工作表
将控件设置为工作表
将wsData设置为工作表
1的长度相同
2倍长
暗lngKW为长
Dim表单作为UserForm
设置wsAbsatz=ThisWorkbook.Worksheets(“生产”)
设置wsData=ThisWorkbook.Worksheets(“数据”)
设置wsControls=ThisWorkbook.Worksheets(“控件”)
lngKW=wsControls.Cells(1,2).Value+2
如果lngKW=3,则
出口接头
如果结束
对于loop1=wsControls.Cells(10,2)。值为wsControls.Cells(19,2)。值为步骤10
如果wsData.Cells(loop1+3,lngKW).Value为“”,则
MsgBox(wsData.Cells(loop1+3,lngKW.Value)
对于循环2=2到16
如果wsData.Cells(loop1+3,lngKW).Value=wsControls.Cells(loop2,7).Value,则
form.Name=wsControls.Cells(loop2,8).Value'错误出现在这里
表演
如果结束
下一个循环2
如果结束
下一个循环1
端接头
项目:


非常感谢你的帮助

您正在尝试为蓝图指定名称。这是两个错误

你必须初始化你的蓝图。像这样:

Dim表单作为新用户表单
然后,您的
UserForm
很可能没有名为
Name
的属性。它被称为
标题
。所以是这样的,

Sub TestMe()

    Dim uf As New UserForm1 'judging from your screenshot
    uf.Caption = "Testing"
    uf.Show

End Sub
免责声明: 虽然几乎每本VBA书籍都展示了这个
UserForm.Show
方法(事实上,到目前为止我读过的每一本),但是有一种更好的方法可以使用UserForms,而不是滥用蓝图


如果你有时间和面向对象的知识-或从。StackOverflow中也有一篇关于它的文档文章,但是它被删除了,因为它包含了整个文档的想法。

您正在尝试为蓝图指定一个名称。这是两个错误

你必须初始化你的蓝图。像这样:

Dim表单作为新用户表单
然后,您的
UserForm
很可能没有名为
Name
的属性。它被称为
标题
。所以是这样的,

Sub TestMe()

    Dim uf As New UserForm1 'judging from your screenshot
    uf.Caption = "Testing"
    uf.Show

End Sub
免责声明: 虽然几乎每本VBA书籍都展示了这个
UserForm.Show
方法(事实上,到目前为止我读过的每一本),但是有一种更好的方法可以使用UserForms,而不是滥用蓝图

如果你有时间和面向对象的知识-或从。在StackOverflow中也有一篇关于它的文档文章,但是它被删除了,因为它包含了整个文档的思想。

您不能“调用”用户表单。您可以实例化它,然后
显示它

UserForm
是派生所有用户表单的“基类”。请参见,VBA中存在继承,而不是自定义类

所以你有一个
UserForm2
类,一个
UserForm3
类,一个
UserForm4
类,依此类推

这些类在使用之前需要实例化

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

Set theForm = New UserForm3
theForm.Show

'...
因此,您需要的是一种方法来参数化这个
部分

而你不能。因为无论你要做什么,一个单元格的内容都是一个字符串,你不可能从一个写着
“UserForm3”
字符串中得到一个
UserForm3
的实例

制作一个工厂函数来进行转换:

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
您不能“调用”用户表单。您可以实例化它,然后
显示它

UserForm
是派生所有用户表单的“基类”。请参见,VBA中存在继承,而不是自定义类

所以你有一个
UserForm2
类,一个
UserForm3
类,一个
UserForm4
类,依此类推

这些类在使用之前需要实例化

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

Set theForm = New UserForm3
theForm.Show

'...
因此,您需要的是一种方法来参数化这个
部分

而你不能。因为无论你要做什么,一个单元格的内容都是一个字符串,你不可能从一个写着
“UserForm3”
字符串中得到一个
UserForm3
的实例

制作一个工厂函数来进行转换:

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

谢谢你的回复。如何通过用户名而不是标题来调用userform?我需要对所有5个用户表单使用相同的标题。@VBAPete您似乎不理解这段代码在做什么。它不是按标题调用用户表单,而是创建一个新的
userform
实例,设置其
caption
,然后
Show
ing它。。。这并不能完全回答你的问题,但我强烈建议你阅读给出的链接(免责声明:第一个是我写的,第二个是从我写的文档中得到的灵感)。你有一个很好的网站:)谢谢你的回复。如何通过用户名而不是标题来调用userform?我需要对所有5个用户表单使用相同的标题。@VBAPete您似乎不理解这段代码在做什么。它不是按标题调用用户表单,而是创建一个新的
userform
实例,设置其
caption
,然后
Show
ing它。。。这并不能完全回答你的问题,但我强烈建议你阅读给出的链接(免责声明:我写了第一个链接,并编写了第二个文档)。你有一个不错的网站:)你得到的具体错误是什么?对象变量或未设置块变量(错误91)@Mat'sMug-我会投票给
91-对象变量或带变量的
Good guess@vityta。不幸的是,我正在挣扎