【问题标题】:Calling set of event functions of objects in other sub function在其他子函数中调用对象的事件函数集
【发布时间】:2018-05-29 14:44:34
【问题描述】:

我在 Excel VBA 中有一个用户窗体,其中包含不同的对象,如 CheckBox、RadioButtons、TextEdit Box 等。每个对象都有不同的事件函数,但我想在用户定义的子函数中调用一些事件函数,如 UserForm_Init() 函数按顺序重新利用用它们编写的相同代码。

例子:

Private Sub  CheckBox1_Click() [Later changed to public also]
    If CheckBox1.Value Then
         --- Code
    End If
End Sub

Private Sub    CheckBox2_Click()
      If CheckBox2.Value Then
         --- Code
      End If
End Sub

Private Sub    RadioButton1_Click()
    If RadioButton1.Value Then
         --- Code
    End If
End Sub

' User Defined Function
Sub UserForm_Init()
     CheckBox1_Click()
     CheckBox2_Click()
     RadioButton1_Click()
End Sub

但是当我尝试编译时显示编译错误,如何在用户定义的子函数中执行这些对象事件函数。

我知道我可以在事件函数中编写单独的函数,并为用户定义的子函数调用这些单独的函数。但是在这种情况下,重新更改整个代码将太困难了。我只能选择在子函数中调用这些事件函数来执行。

如何执行这些操作,在用户定义的子函数 [UserForm_Init()] 中调用事件函数?

【问题讨论】:

  • 您的代码不是 VBA,如果没有清晰的图片,很难确定您要做什么。 (请参阅“minimal reproducible example”。)现在,请参阅 this searchthis Stack Overflow question
  • @ashleedawg 当我选中或启用时,我已经为 CheckBox 和 Radio 按钮编写了代码。所以,下次当我打开相同的用户窗体时,我想运行相同的代码,所以我想通过直接调用事件函数来做到这一点。我无法做到这一点并显示编译错误。
  • 如我的回答中所述,正确的做法是将共享代码放在共享模块中。我了解您编写的代码可能需要一些更改,但这是学习过程的一部分。
  • @ashleedwag 对不起,我已经上传了 C 格式的代码。我已经更正了代码

标签: vba excel


【解决方案1】:

VBA 不使用花括号。此代码不会与这些一起编译。 VBA 需要SubEnd Sub 来定义过程。

Sub CheckBox1_Click()

  if CheckBox1.Value Then
     --- Code
  end if
End Sub

Sub CheckBox2_Click()

  if CheckBox2.Value Then
     --- Code
  end if
End Sub

Sub RadioButton1_Click()

  if RadioButton1.Value Then
     --- Code
  End If
End Sub


Sub UserForm_Init()
 CheckBox1_Click()
 CheckBox2_Click()
 RadioButton1_Click()
End Sub

注意:如果您的自定义函数 UserForm_Init 不在表单的代码模块中,您需要限定过程名称,例如:

Sub UserForm_Init()
 UserForm1.CheckBox1_Click()
 UserForm1.CheckBox2_Click()
 UserForm1.RadioButton1_Click()
End Sub

根据您的实施可能会产生额外的复杂性,但我希望这可以帮助您入门。

【讨论】:

  • 谢谢,它成功了。我忘记通过 UserForm1.EventFunction() 调用事件函数。将事件函数设为公共对于调用其他函数中的函数也很重要。
【解决方案2】:

您的示例中缺少部分代码;如果没有清晰的画面,很难确定您要做什么。可以从另一个调用事件过程,出于多种原因,这是一个坏主意。

而不是像您尝试的那样调用私有过程,有点像这样:

Private Sub myEvent()
    'event code here
End Sub

Sub mySub()
    myEvent()
End Sub

...您最好将需要共享的代码移至共享模块,如下所示:

Public Sub mySubInSharedModule()
    'event code here
End Sub

Private Sub myEvent()
    Call mySubInSharedModule()
End Sub

Public Sub mySub()
    Call mySubInSharedModule()
End Sub

在本网站和其他网站上有大量文章进一步解释了这一点。要帮助您入门,请参阅 this searchthis Stack Overflow question

【讨论】:

  • 我也尝试过使用 Public 而不是 private,但它仍然显示编译错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
相关资源
最近更新 更多