Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;包括「;在excelvba中?_Excel_Vba_Include - Fatal编程技术网

&引用;包括「;在excelvba中?

&引用;包括「;在excelvba中?,excel,vba,include,Excel,Vba,Include,我有一个用户表单,它由许多子表单组成,作为宏分配给工作表上的一个按钮。当用户使用完此用户表单后,他们可以按下该表单上的按钮,这会导致其可见性变为false,再次输入时,所有内容都会显示其保留状态,从而产生类似于保存的功能 我现在需要将此应用于工作表上的多个按钮,每个用户表单都需要有完全相同的代码和相同的按钮,但必须是一个单独的表单,因为每个单独的按钮都需要它自己的类似保存的功能。我计划这样做的方式是复制现有的用户表单,并使用不同的名称粘贴多次。但是,如果需要修改,则需要很长时间才能执行。因此,是

我有一个用户表单,它由许多子表单组成,作为宏分配给工作表上的一个按钮。当用户使用完此用户表单后,他们可以按下该表单上的按钮,这会导致其可见性变为false,再次输入时,所有内容都会显示其保留状态,从而产生类似于保存的功能

我现在需要将此应用于工作表上的多个按钮,每个用户表单都需要有完全相同的代码和相同的按钮,但必须是一个单独的表单,因为每个单独的按钮都需要它自己的类似保存的功能。我计划这样做的方式是复制现有的用户表单,并使用不同的名称粘贴多次。但是,如果需要修改,则需要很长时间才能执行。因此,是否有“包括”之类的方法它可以使用一个基本模块来访问所有代码,这样如果我需要更改任何内容,我只需在一个模块上进行更改,其他所有内容都可以通过include进行更新

编辑:

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

Private Sub material_Change()
Call costing
End Sub
您不需要“包含”(VBA中不存在);您所需要做的就是创建一个模块并将公共方法公开

例如,如果您创建一个模块并具有如下功能:

Public Function Add(first As Integer, second As Integer) As Integer
    Add = first + second
End Function
然后,您可以像这样从另一个模块/表单/类模块访问它:

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

同一表单可以有多个实例。可以使用此选项保留多组表单值

试试这个:

像往常一样创建表单。我们把它叫做
MyForm

在工作表上创建几个按钮。我的示例使用ActiveX按钮,但也可以使用表单控件按钮。让我们称它们为
CommandButton1
CommandButton2

在表单模块中,包含一个
Terminate
子模块,其中包含此代码

Private Sub UserForm_Terminate()
    '  any other code you may need...
    Unload Me
End Sub
需要保存/隐藏表单的表单按钮

Private Sub btnSaveAndHide_Click()
    Me.Hide
End Sub
工作表按钮代码如下所示

  • 每个按钮的代码都是相同的(并调用一个公共子按钮),每个按钮都有自己的
    Static
    form变量。)

  • 需要错误处理程序来处理表单未正确关闭的情况。在这种情况下,实例不再存在,但局部静态变量也不是空的

  • 示例显示了显示为非模态的表单,如果需要,可以将其更改为模态

     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
    
最终结果:同一表单的多个副本,每个副本都有自己的值


作为回应,我将如何从外部访问每个用户表单中的变量

在上面的示例中,
表单
实例只能在命令按钮单击处理程序例程中或表单模块本身中访问。如果可以在表单模块中编写代码,则无需更改

<>为了使表单实例在其他地方可用,请考虑将它们的声明移动到标准模块的模块范围。您可以将它们声明为,例如单个变量、数组(静态或动态)、集合、字典。哪种结构最好将取决于您希望如何管理和访问表单实例

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

Option Explicit
Global MyForms(1 To 2) As MyForm
Sub Demo()
    Dim i As Long
    
    For i = LBound(MyForms) To UBound(MyForms)
        If Not MyForms(i) Is Nothing Then
            MsgBox "Form " & i & " Value = " & MyForms(i).TextBox1.Value
        End If
    Next
End Sub
命令按钮更新为

Private Sub CommandButton1_Click()
    ShowMyForm Module1.MyForms(1)
End Sub
    
Private Sub CommandButton2_Click()
    ShowMyForm Module1.MyForms(2)
End Sub
私有子ShowMyForm(frm作为MyForm)
无更改,与以前相同

代码的工作原理与以前相同,但现在可以在标准模块中访问全局变量

Option Explicit
Global MyForms(1 To 2) As MyForm
Sub Demo()
    Dim i As Long
    
    For i = LBound(MyForms) To UBound(MyForms)
        If Not MyForms(i) Is Nothing Then
            MsgBox "Form " & i & " Value = " & MyForms(i).TextBox1.Value
        End If
    Next
End Sub

检查一下这个答案:还有这个:如果
成本核算
是一个
函数
,它会返回一些东西——对吗?例如,如果
costing
返回一个数字,您可以编写
MyNumber=costing
我已经尝试过了,请参见上面的编辑。我也试过“成本核算”和“成本核算()”,两次我都会出错。你真是个天才!非常感谢您提供了这一美妙而优雅的解决方案。非常感谢你的帮助!!!你已经为我做了很多,但如果你能帮我做最后一件事,我将不胜感激。我将如何从外部访问每个用户表单内部的变量,例如从模块(在您的示例中,文本框的“1”和“2”中的值)访问变量,因为通常我会指定要查看的用户表单。非常感谢。