在Excel VBA中“包含”?

我有一个由许多子组成的用户forms,这被指定为工作表上的一个button的macros。 当用户完成这个用户表单时,他们可以按下一个button,导致它的可见性变成错误的,当再次进入时,所有的东西都会显示出来,从而产生一个类似于保存的function。

我现在需要将其应用于工作表上的多个button,并且每个用户表单都需要具有完全相同的代码和相同的button,但是作为单独的表单,因为每个单独的button都需要它自己的保存function。 我打算这样做的方式是复制现有的用户表单,并用不同的名称粘贴多次,但如果需要修改,则需要很长时间才能执行,因此,是否存在诸如“包含”它可以使用一个基本模块,从中可以访问所有的代码,所以如果我需要改变任何东西,我只是在一个模块上做,而其他的一切都是通过include来更新的?

编辑:

我现在有一个名为costing()的公共函数,当我使用时出现错误:

Private Sub material_Change() Call costing End Sub 

您可以有多个相同表单的实例。 您可以使用它来保留多组表单值

尝试这个:

像往常一样创build你的表单。 让我们称之为MyForm

在工作表上创build几个button。 我的例子使用ActiveXbutton,但也可以使用Form Controlbutton。 让我们叫他们CommandButton1CommandButton2

在你的表单模块中,包含一个包含这个代码的Terminate Sub

 Private Sub UserForm_Terminate() ' any other code you may need... Unload Me End Sub 

表格保存/隐藏表单需要

 Private Sub btnSaveAndHide_Click() Me.Hide End Sub 

工作表button代码如下

  • 每个button的代码是相同的(并调用一个通用的Sub),每个button都有自己的Static表单variables。)
  • 需要error handling程序来处理表单被正确closures的情况。 在这种情况下,实例不再存在,但本地Staticvariables也不是Nothing
  • 示例显示的窗体显示为Modeless,如果需要,可以将其更改为Modal。

     Private Sub CommandButton1_Click() Static frm As MyForm ShowMyForm frm End Sub Private Sub CommandButton2_Click() Static frm As MyForm ShowMyForm frm End Sub Private Sub ShowMyForm(frm As MyForm) If frm Is Nothing Then Set frm = New MyForm On Error GoTo EH frm.Show vbModeless Exit Sub EH: If Err.Number = -2147418105 Then On Error GoTo 0 Set frm = Nothing Set frm = New MyForm frm.Show End If On Error GoTo 0 End Sub 

最终结果:同一表单的多个副本,每个副本都有自己的值

在这里输入图像说明


UPDATE

在回应评论我如何访问外部的每个用户的forms内部的variables

在ubove的例子中, Form实例只能在From模块本身的Command Button Click Handler例程中访问。 如果您可以在表单模块中编写代码,则不需要进行更改。

要使表单实例在其他地方可用,请考虑将其声明移至标准模块的模块范围。 你可以声明他们作为,例如单个variables,一个数组(静态或dynamic),一个集合,一个词典。 哪种结构最好取决于你想要如何pipe理和访问你的表单实例。

对于例如,标准模块中的静态数组:代码

 Option Explicit Global MyForms(1 To 2) As MyForm 

CommandButton代码更新为

 Private Sub CommandButton1_Click() ShowMyForm Module1.MyForms(1) End Sub Private Sub CommandButton2_Click() ShowMyForm Module1.MyForms(2) End Sub 

Private Sub ShowMyForm(frm As MyForm)没有变化,和以前一样

代码和以前一样工作,但现在可以在标准模块中访问Globalvariables

 Sub Demo() Dim i As Long For i = LBound(MyForms) To UBound(MyForms) If Not MyForms(i) Is Nothing Then MsgBox "For " & i & " Value = " & MyForms(i).TextBox1.Value End If Next End Sub 

您不需要“包含”(VBA中不存在); 所有你需要做的是创build一个模块,并公开的方法。

例如,如果您创build了一个模块并具有这样的function:

 Public Function Add(first As Integer, second As Integer) As Integer Add = first + second End Function 

然后你可以像这样从另一个模块/表单/类模块访问它:

 Sub test() MsgBox Add(3, 6) End Sub