根据单元格

时间:2017-12-11 14:56:09

标签: excel vba excel-vba

我有一个包含以下值的表:

enter image description here

现在,我想根据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

项目:

enter image description here

非常感谢你的帮助!

2 个答案:

答案 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