如何在 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_DRAFT
的控件。我建议你检查一下 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 2010 宏生成器:父窗体上控件的 SetProperty
如何在 MS-Access 的表单上显示 Web 浏览器控件中的表格字段内容?
如何使用 vb.net 从 MS Access DB 表单中找出 Activex 控件