Vba 基于单元格中的Userform值调用Userform
我有一个具有以下值的表: 现在,我想基于G列中的值调用H列中的Userform,但是我无法确定如何基于cell值调用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
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。不幸的是,我正在挣扎