在 Access VBA 中使用代码自动生成文本框

Posted

技术标签:

【中文标题】在 Access VBA 中使用代码自动生成文本框【英文标题】:Auto-Generate Textboxes with code in Access VBA 【发布时间】:2016-06-27 13:54:19 【问题描述】:

我尝试使用自动订阅,但我不能很好地理解..

我在一个表单中有多个(在本例中为 59 个)文本框/按钮,所有内容都带有 点击事件。但在 VBA 中,我不想让每一个都使用代码,因为我想让表单易于控制并将其用于不编码的人,并且拥有 59 Click Subs 将是相当丑陋,如果我想添加更多内容,我需要在 VBA 代码中创建另一个 Sub。

真正的问题是:有没有办法为每个具有不同变量的文本/按钮执行自动编码(子)?

例如:

Text1_Click + Code -> Variable: 1
Text2_Click + Code -> Variable: 2
Text3_Click + Code -> Variable: 3   --> Text(?)_Click + Code -> Variable: ?
Text4_Click + Code -> Variable: 4
Text5_Click + Code -> Variable: 5

【问题讨论】:

Array of items with buttons的可能重复 您可以使用事件接收,本质上是创建一个从控件继承的代码,然后为您提供修改事件的便利,例如点击 您可以使用Control Array。这允许一个潜艇处理许多控件。 和Array of items这个有点不同,因为我只想把当前的文本框和代码放在一起,而不是创建新的。 @destination-data: AFAIK,控件数组只存在于实际的 VB 中,而不存在于 Access / VBA 中。 【参考方案1】:

创建一个 VBA 函数并将其用于每个文本框的 On Click 属性:=MyFunction()

在您的示例中,文本框命名为 Text1Text5,您似乎希望 Variable 包含文本框名称中的数字。使用Mid() 很容易提取该号码。

Public Function MyFunction()
    Dim strControl As String
    Dim Variable As Variant

    strControl = Application.Screen.ActiveControl.Name
    Variable = Null
    If strControl Like "Text*" Then
        Variable = Val(Mid(strControl, 5))
    End If
    Debug.Print strControl & "_Click -> Variable: " & Nz(Variable, "Null")
End Function

如果您想将该方法扩展到带编号的命令按钮,请包含此 ...

    If strControl Like "Command*" Then
        Variable = Val(Mid(strControl, 8))
    End If

如果您需要以编程方式分配 On Click 属性,请遍历控件并设置每个 .OnClick = "=MyFunction()"

【讨论】:

这很好用,而且很容易使用,谢谢@HansUp【参考方案2】:

在您的表单中有按钮,以及以下代码

Option Explicit

Public colCustomControls As Collection

Private Sub Form_Open(Cancel As Integer)

Dim ctl As Control
Dim clsCustom As clsCustomButton

    Set colCustomControls = New Collection

    For Each ctl In Me.Controls
        Set clsCustom = New clsCustomButton
        clsCustom.INITIALISE ctl
        colCustomControls.Add clsCustom
    Next ctl

End Sub

然后是一个名为 clsCustomButton 的类

Option Explicit

Private WithEvents cbCustom As CommandButton

Public Sub INITIALISE(cb As CommandButton)
    Set cbCustom = cb
    cb.OnClick = "[Event Procedure]"
End Sub

Private Sub cbCustom_Click()
    Select Case cbCustom.Name
        Case "Command0": MsgBox "Button1 clicked"
        Case "Command1": MsgBox "Button2 clicked"
    End Select
End Sub

正在发生的事情是集合在模仿表单中的 me.Controls 集合,但我们将所有按钮都设为类,因此,使用类 _click 事件。您可以修改初始化以也接受一个过程名称事件,用于子调用,然后使用 application.Run 来调用代码。

像这样

Option Explicit

Private WithEvents cbCustom As CommandButton
Private strProcCall As String

Public Sub INITIALISE(cb As CommandButton, strProc As String)
    Set cbCustom = cb
    strProcCall = strProc
    cb.OnClick = "[Event Procedure]"
End Sub

Private Sub cbCustom_Click()
    Application.Run strProcCall
End Sub

Option Explicit

Public colCustomControls As Collection

Private Sub Form_Open(Cancel As Integer)

Dim ctl As Control
Dim clsCustom As clsCustomButton

    Set colCustomControls = New Collection

        Set clsCustom = New clsCustomButton
        clsCustom.INITIALISE Me.Controls("Command0"), "MACRO_1"
        colCustomControls.Add clsCustom

        Set clsCustom = New clsCustomButton
        clsCustom.INITIALISE Me.Controls("Command1"), "MACRO_2"
        colCustomControls.Add clsCustom

End Sub

【讨论】:

这行给了我类型匹配错误:clsCustom.INITIALISE ctl 您传递的只是命令按钮还是其他按钮?如果是这样,您需要在更改为自定义之前检查控件类型名称 (我对这门语言有点陌生)我设法解决了这个问题,但是我应该把最后两个代码放在哪里,或者我只是用另外两个代码切换?如果我无论如何都找不到解决这个问题,我可以给你我的项目,也许可以指导我使用这些名称和函数/类,因为我对此感到非常困惑。 第 2 个代码是第 1 个代码的替换,也允许传递子名称。 这是一个很好的学习方式,布局很好wiseowl.co.uk/blog/s242/event-sink.htm【参考方案3】:

是的,您可以通过以下方式引用控件:

n = 5
Set ctl = Me("Text" & CStr(n))

然后 ctl 将引用 Me!Text5

但请查看 WithEvents:How to write generic code ...

【讨论】:

感谢您的回答,我知道我可以引用控件,但是如何将其分配给按钮单击。 (我有点学习这门语言^^)

以上是关于在 Access VBA 中使用代码自动生成文本框的主要内容,如果未能解决你的问题,请参考以下文章

VBA 代码的结果在 Access 的文本框中不可见

尝试使用 sql/vba 的结果填充文本框并出现 #Name 错误

如何在 MS Access VBA 上将文本框注释值输入设置为表格数据插入

为什么Access VBA下拉方法不起作用?

使用 Access VBA 使用循环填充 Word 表单

Access VBA 引用 Active Form 上的文本框