如何在 MS Access 中动态引用控件名称

Posted

技术标签:

【中文标题】如何在 MS Access 中动态引用控件名称【英文标题】:How to reference control names dynamically in MS Access 【发布时间】:2016-08-17 14:34:26 【问题描述】:

我在 MS Access Form 对象中有以下代码。

Private Sub UpdatePMText(sLang As String)
'Used to pass both Mandate and Language Info to called Sub that will execute the queries
Dim iMandate As Integer

'Check if there is text in the box.
If Me.Controls("txtInput_PM_" & sLang & "_DRAFT") = Null Or Me.Controls("txtInput_PM_" & sLang & "_DRAFT") = "" Then
    MsgBox ("There is no text in the " & sLang & " DRAFT Field." & vbNewLine & "The operation will not be executed.")
    Exit Sub
End If

iMandate = Me.txtMandateID
Call modUpdateText.macro_PMText(iMandate, sLang)

End Sub

如果我直接引用控件并简单地输入表单的名称,例如txtInput_PM_EN_DRAFT,那么代码将按预期工作。

我收到的错误消息是,当我在第一个 IF 语句行时,Access 找不到我所指的“字段”。我尝试将.Controls 更改为.Fields,但这也不起作用。

我不想为我需要运行的每种语言重复相同的代码。?我错过了什么?

【问题讨论】:

什么是txtInput_PM_EN_DRAFT?它是表单还是控件?如果这是包含在子表单控件中的表单的名称,您需要使用控件的名称...可以不同于它包含的表单的名称。 它是直接在表单上的控件的名称。没有子窗体。但是,它位于选项卡控件表单中,如果这有所不同的话。 似乎 Access 认为该表单不包含名为 txtInput_PM_EN_DRAF‌​T 的控件。我建议你检查一下 Access 认为表单包含的控件的名称。在表单视图中打开表单后,在“立即”窗口中将其作为单行尝试:for each ctl in Forms!YourFormNameHere.Controls : ? ctl.name : next 稍后您将需要更改您的代码,因为没有任何东西等于 Null,甚至没有另一个 Null。但这不是您现在面临的问题的原因。 您能否举一个例子,说明 sLang 的价值以及表单上的一些控件名称。确保字符串 "txtInput_PM_" & sLang & "_DRAFT" 使控件名称准确地出现在表单上,​​控件名称不区分大小写,请注意。所以我猜控件名称可能是 txtInput_PM_EN_DRAFT。如果表单上不存在该控件,为了处理这种情况,@dbmitch 建议了错误处理,该错误处理将弹出此类控件不存在的消息。 【参考方案1】:

我认为您需要添加一些基本的故障排除。答案可能比你想象的要简单。您可能只是在尝试查找名称拼写错误的文本框,或者它在 Null 比较中失败(如 @HansUp 所建议的那样)

我会尝试修改您的基本子程序并使用此子程序对其进行测试。只要您的代码在您当前的表单中并且您没有引用子表单,您的方法就可以工作。

Private Sub UpdatePMText(sLang As String)

    Const ERR_MISSING_CONTROL   As Long = 2465

On Error GoTo Err_UpdatePMText
    Dim sTextBox    As String

    sTextBox = "txtInput_PM_" & sLang & "_DRAFT"

    'Check if there is text in the box.
    If Nz(Me.Controls(sTextBox).Value, "") = "" Then
        MsgBox ("There is no text in the " & sLang & " DRAFT Field." & vbNewLine & "The operation will not be executed.")
        Exit Sub
    End If

    Exit Sub

Err_UpdatePMText:
    If Err.Number = ERR_MISSING_CONTROL Then
        MsgBox "Error: No Such Textbox: " & sTextBox
    Else
        MsgBox "Error Looking Up Textbox: """ & sTextBox & """" & vbCrLf & Err.Description
    End If
End Sub

【讨论】:

我使用您的代码进行错误处理。在我也更改了命名问题后完美运行。也感谢您的帮助!

以上是关于如何在 MS Access 中动态引用控件名称的主要内容,如果未能解决你的问题,请参考以下文章

MS Access = 引用子表单中的控件

MS Access 2010 宏生成器:父窗体上控件的 SetProperty

如何在 MS-Access 的表单上显示 Web 浏览器控件中的表格字段内容?

如何使用 vb.net 从 MS Access DB 表单中找出 Activex 控件

选项卡式控件上的 MS Access 2007 引用子窗体控件返回 null

如何从 ADO 记录集字段将图片加载到 MS-Access Image 控件中?