Excel表格:如何从类模块调用窗体内部的sub

f4t66c6m  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(135)

在Excel中,我在用户表单中有一个公共子表,我试图从类模块调用它。当我以正常方式运行它时,我得到一个运行时错误91“Objectvariable或blockvariable With is not set”。然后,当我进入调试模式到错误发生的位置(在类模块内)并按F8前进一步时,它确实移动到下一步,实际上进入并执行用户表单内的sub。我做错了什么?
一些旁注:

  • 我使用Class Module的原因是我在用户表单上的控件是动态生成的(用户表单可能会显示多达30次相同的按钮,每次都引用不同的“记录”(相当于一个项目行))
  • 在类模块本身中有更多的代码,并且在操作用户窗体上的控件时运行良好
  • 用户表单中的Sub是Public,当我在Class Module中键入名称时,它会自动完成
  • 当我从用户表单中调用它时,公共子程序本身也可以完美地工作

代码的简化版本:
在类模块中,我有:

Private Sub MinEvents_click()
Dim MinArt As MSForms.TextBox

    'A piece of code that works fine

    Call ScanTool.CheckPickingCompleet

    'More code that works fine

End sub

在名为“ScanTool”的用户表单中,我有:

Public Sub CheckPickingCompleet()

    If ArtScan.Text = Me.Controls("Label_AantalArtikelen_" & GescandArtikel) Then
    
        'Here I do the actions required
    
    ElseIf ArtScan.Text > Me.Controls("Label_AantalArtikelen_" & GescandArtikel) Then
    
        'And here I have other actions
    
    End If

End Sub

提前感谢您的帮助,因为我这边很可能有一个非常基本的疏忽。

cyej8jka

cyej8jka1#

您必须创建一个对forms类模块的引用,类似于以下内容

Private Sub MinEvents_click()
Dim MinArt As MSForms.TextBox
Dim formclass as Scantool
Set formclass = New Scantool
    'A piece of code that works fine

    Call formclass.CheckPickingCompleet

    'More code that works fine

End sub
u0sqgete

u0sqgete2#

在黑猫的帮助下(谢谢)和一些进一步的实验,我现在已经得到了它的工作。我必须在form类中显式地引用form,而不是使用“Me”。form类中的代码现在为

Public Sub CheckPickingCompleet()

Set ThisForm = ScanTool

Set ArtScan = ThisForm.Controls("StuksGepickt_" & GescandArtikel)

If ArtScan.Text = ThisForm.Controls("Label_AantalArtikelen_" & GescandArtikel) Then

    'Here I do the nice stuff
    
End If

End Sub

我必须在form类的sub中执行SET,而不是在class模块中,并且我必须忽略New。我假设这是因为我不想创建新的示例,因为它是我现有的示例,所有动态创建的控件都在其中

相关问题