如何在 VBA 中获取对文本框控件的引用而不是文本框的值
Posted
技术标签:
【中文标题】如何在 VBA 中获取对文本框控件的引用而不是文本框的值【英文标题】:How Do I Get a Reference to a Text Box Control Instead of the Text Box's Value in VBA 【发布时间】:2020-10-26 03:42:23 【问题描述】:这看起来很简单,但我不知道如何在表单的详细信息部分中获取对文本框控件的引用,而不是在 VBA 中获取文本框的值。
这是我的确切代码。我包装了 DoCmd.FindRecord 方法以支持在表单上的指定字段或表单上的任何位置进行搜索。要仅在指定字段中搜索,我传递了控件名称。
Public Function FindExactRecord(frm As Form, strField As String, strFind As String) As Boolean
On Error GoTo ERR_FUNC
Dim rc As Boolean
Dim ctrl As control
rc = True ' Presume true
If strField = "" Then
' Find the record anywhere on the form
Call DoCmd.FindRecord(strFind, acEntire, True, acSearchAll, False, acAll, True)
Else
' NOTE: Currently not working!
' Set the current field
Set ctrl = frm.Controls(strField)
frm.ctrl.SetFocus
' Find the record in the specified field
Call DoCmd.FindRecord(strFind, acEntire, True, acSearchAll, False, acCurrent, True)
' Check if record found
rc = (frm.ctrl = strFind)
End If
' Return success or failure
FindExactRecord = rc
End Function
您可能认为这会将 ctrl 设置为对 txtBox 控件的引用,但它实际上将 ctrl 设置为包含 txtBox 中包含的值的字符串(因为 Me.txtBox 实际上是对 txtBox 的默认属性的隐式引用,这是价值)。这会导致调用 frm.ctrl.SetFocus 引发错误 #2465(应用程序定义或对象定义错误)。如果我传入控件名称的空字符串(因此搜索整个表单),我不会收到错误消息(因为我根本没有引用控件)。
我尝试了各种其他方法来避免获取默认属性,但它们都不起作用。
获得对控件的引用有什么魔力?
【问题讨论】:
fmsinc.com/tpapers/primer 谢谢,但我在发帖前已经阅读过了。您指的是特定的部分吗? 套装适合我。当然,如果它是数据控件,ctrl 的默认属性将是 Value。如果您不想要 Value,请指定您想要的属性。显示真正有问题的代码。你想用 ctrl 做什么? Ctrl 未设置为字符串,而是设置为文本框控件对象。 Ctrl 是一个具有属性的对象,如果它是一个数据控件,则包括 Value。因此,当您引用 Ctrl 而不指定属性时,它使用默认值。为什么你认为你需要这个对象变量? 我已经编辑了我最初的帖子以显示确切的代码。我正在尝试在表单的详细信息部分中引用一个文本框。文本框已锁定。 【参考方案1】:正如 June7 所写,您误解了某些东西(您没有展示什么)。
ctrl
确实是对文本框控件的引用。
试试这个:
Dim ctrl As Control
Set ctrl = Me.txtBox
' These wouldn't work, if ctrl was simply the string in txtBox
Debug.Print ctrl.Name
Debug.Print ctrl.BackColor
' These will both print the content
Debug.Print ctrl
Debug.Print ctrl.Value
frm.ctrl.SetFocus
这会在表单对象中查找属性ctrl
(但失败)。
只需使用ctrl.SetFocus
,并将frm.ctrl
替换为ctrl
即可。
【讨论】:
【参考方案2】:试试这个:
' Set the current field
Set ctrl = frm.Controls(strField)
ctrl.SetFocus
' Make sure, that frm is the selected and active form.
' Find the record in the specified field
Call DoCmd.FindRecord(strFind, acEntire, True, acSearchAll, False, acCurrent, True)
' Check if record found
rc = (ctrl.Value = strFind)
【讨论】:
卫生署!我的笨蛋帽在哪里。 :-X 谢谢,我将您的回复标记为答案。以上是关于如何在 VBA 中获取对文本框控件的引用而不是文本框的值的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft Access,计算 - 文本框控件源与 VBA 函数
C#中怎样从一个form的文本框获取另一个form中Comobox控件的值
vb6 webbrowser 如何判断当前网页中获取焦点的是否一个文本框?