如何在 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控件的值

VBA 多文本框验证控件

vb6 webbrowser 如何判断当前网页中获取焦点的是否一个文本框?

VBA:为从 SQL Server 数据库中选择的十进制数获取逗号分隔符而不是点

获取文本框文本,javascript 已更改 [重复]