gpt4 book ai didi

excel - Excel VBA中的"Include"?

转载 作者:行者123 更新时间:2023-12-04 20:06:45 24 4
gpt4 key购买 nike

我有一个由许多子组成的用户表单,它作为宏分配给工作表上的按钮。当用户完成此用户表单时,他们可以按下其上的按钮,这会导致其可见性变为错误,并且当再次输入时,所有内容都会显示它是如何离开的,从而导致类似保存的功能。

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

编辑:

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

Private Sub material_Change()
Call costing
End Sub

最佳答案

您可以拥有同一表单的多个实例。您可以使用它来保留多组表单值
尝试这个:
像往常一样创建表单。我们就叫它MyForm在工作表上创建几个按钮。我的示例使用 ActiveX 按钮,但也可以使用表单控件按钮。我们就叫他们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
工作表按钮代码如下
  • 每个按钮的代码都是相同的(并调用一个公共(public) Sub),每个按钮都有自己的 Static形式变量。)
  • 需要错误处理程序来处理表单未正确关闭的情况。在这种情况下,实例不再存在,但局部静态变量也不是 Nothing
  • 示例显示的表单显示为无模式,您可以根据需要将其更改为模态。
     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

  • 最终结果:同一表格的多个副本,每个副本都有自己的值
    enter image description here

    回应评论我将如何从外部访问每个用户表单内部的变量
    在上面的示例中, Form实例只能在命令按钮单击处理程序例程中或在表单模块本身中访问。如果您可以在表单模块中编写代码,则无需进行任何更改。
    要使 Form 实例在其他地方可用,请考虑将其声明移至标准模块的模块范围。您可以将它们声明为,例如,单个变量、数组(静态或动态)、集合、字典。哪种结构最好取决于您希望如何管理和访问表单实例。
    例如,静态数组:标准模块中的代码
    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)没有变化,和以前一样
    代码的工作方式与以前相同,但您现在可以在标准模块中访问全局变量
    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

    关于excel - Excel VBA中的"Include"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23155054/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com