我有一个包含以下值的表:
现在,我想根据G列中的值调用H列中的Userform,但我无法确定如何根据单元格值调用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
项目:
非常感谢你的帮助!
答案 0 :(得分:3)
您正尝试将名称分配给蓝图。这是两个错误。
你必须将你的蓝图初始化为某种东西。像这样:
Dim form As New UserForm
然后,很可能您的UserForm
没有名为Name
的属性。它被称为Caption
。因此就是这样:
Sub TestMe()
Dim uf As New UserForm1 'judging from your screenshot
uf.Caption = "Testing"
uf.Show
End Sub
<强>声明:强>
有一种更好的方法来使用UserForms,而不是滥用蓝图,尽管几乎每个VBA书都显示了这个UserForm.Show
方法(事实上我到目前为止已经阅读过每一个方法)。
如果您有时间和OOP知识implement the ideas from here - 或来自my interpretation of the ideas。在StackOverflow中还有一篇关于它的文档文章,但它已被删除了整个文档的想法。
答案 1 :(得分:2)
您没有“调用”用户表单。你实例化它,然后你Show
它。
UserForm
是从中派生所有用户表单的“基类”。在VBA中看到是继承,而不是自定义类。
所以你有UserForm2
班,UserForm3
班,UserForm4
班,等等。
这些类需要实例化才能使用。
Dim theForm As UserForm
Set theForm = New UserForm2
theForm.Show
Set theForm = New UserForm3
theForm.Show
'...
所以你需要的是一种参数化这个Set theForm = New ?????
部分的方法。
你做不到。因为无论你要做什么,单元格的内容都将是一个字符串,并且你无法从UserForm3
获得String
的实例"UserForm3"
}}
创建一个执行翻译的 factory 函数:
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