【问题标题】:How to reference control names dynamically in MS Access如何在 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,但这也不起作用。

我不想为我需要运行的每种语言重复相同的代码。如何在 MS Access 中动态引用控件名称?我错过了什么?

【问题讨论】:

  • 什么是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 建议了错误处理,该错误处理将弹出此类控件不存在的消息。

标签: ms-access vba ms-access-2010


【解决方案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

【讨论】:

  • 我使用您的代码进行错误处理。在我也更改了命名问题后完美运行。也感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多