在 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()
在您的示例中,文本框命名为 Text1
到 Text5
,您似乎希望 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 中使用代码自动生成文本框的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 sql/vba 的结果填充文本框并出现 #Name 错误