在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。 让我们叫他们CommandButton1
和CommandButton2
在你的表单模块中,包含一个包含这个代码的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