如何在VBA中获取对文本框控件的引用而不是文本框的值
这看起来很简单,但我不知道如何在窗体的详细信息部分获取对文本框控件的引用,而不是在VBA中获取文本框的值 这是我的确切密码。我正在包装DoCmd.FindRecord方法,以支持在表单上的指定字段或表单上的任何位置进行搜索。要仅在指定字段中搜索,我传递控件名如何在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
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!我的傻瓜帽呢-谢谢,我把你的答复记为答案。