如何在VBA中获取对文本框控件的引用而不是文本框的值

如何在VBA中获取对文本框控件的引用而不是文本框的值,vba,ms-access,Vba,Ms Access,这看起来很简单,但我不知道如何在窗体的详细信息部分获取对文本框控件的引用,而不是在VBA中获取文本框的值 这是我的确切密码。我正在包装DoCmd.FindRecord方法,以支持在表单上的指定字段或表单上的任何位置进行搜索。要仅在指定字段中搜索,我传递控件名 Public Function FindExactRecord(frm As Form, strField As String, strFind As String) As Boolean On Error GoTo ER

这看起来很简单,但我不知道如何在窗体的详细信息部分获取对文本框控件的引用,而不是在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的默认属性value的隐式引用。这会导致调用frm.ctrl.SetFocus调用抛出错误2465应用程序定义的错误或对象定义的错误。如果传入控件名的空字符串,然后搜索整个表单,则不会得到错误,因为我根本不引用该控件

我尝试过各种其他方法来避免获取默认属性,但都不起作用


获取控件引用的魔力是什么?

正如6月7日所写,您误解了您没有显示的内容

ctrl实际上是对textbox控件的引用。 试试这个:

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
这将在表单对象中查找属性ctrl,但失败


只需使用ctrl.SetFocus,并在其他任何地方用ctrl替换frm.ctrl。

正如6月7日所写,您误解了您没有显示的内容

ctrl实际上是对textbox控件的引用。 试试这个:

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
这将在表单对象中查找属性ctrl,但失败

只需使用ctrl.SetFocus,并在其他任何地方用ctrl替换frm.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
'设置当前字段 设置ctrl=frm.ControlsstrField ctrl.SetFocus '确保frm是选定的活动表单。 '在指定字段中查找记录 调用DoCmd.FindRecordstrFind、acEntire、True、acSearchAll、False、acCurrent、True '检查是否找到记录 rc=ctrl.Value=strFind 试试这个:

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
'设置当前字段 设置ctrl=frm.ControlsstrField ctrl.SetFocus '确保frm是选定的活动表单。 '在指定字段中查找记录 调用DoCmd.FindRecordstrFind、acEntire、True、acSearchAll、False、acCurrent、True '检查是否找到记录 rc=ctrl.Value=strFind
谢谢,但我在发帖之前已经看过了。你指的是某个特定的部分吗?这套对我来说很有用。当然,如果ctrl是数据控件,它的默认属性将是Value。如果不需要值,请指定所需的属性。显示真正有问题的代码。您想用ctrl做什么?ctrl并没有设置为字符串,而是设置为文本框控件对象。Ctrl是具有属性的对象,如果是数据控件,则包括值。因此,当您引用Ctrl而不指定属性时,它将使用默认值。为什么你认为你需要这个对象变量?我已经编辑了我的第一篇文章来显示确切的代码。我试图引用表单详细信息部分的文本框。文本框已锁定。谢谢,但我在发布之前已经读过了。你指的是某个特定的部分吗?这套对我来说很有用。当然,如果ctrl是数据控件,它的默认属性将是Value。如果不需要值,请指定所需的属性。显示真正有问题的代码。您想用ctrl做什么?ctrl并没有设置为字符串,而是设置为文本框控件对象。Ctrl是具有属性的对象,如果是数据控件,则包括值。因此,当您引用Ctrl而不指定属性时,它将使用默认值。为什么你认为你需要这个对象变量?我已经编辑了我的第一篇文章来显示确切的代码。我试图引用表单详细信息部分的文本框。文本框已锁定。DOH!我的傻瓜帽呢-谢谢,我把你的回答记下来了。DOH!我的傻瓜帽呢-谢谢,我把你的答复记为答案。