#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 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 (ошибка, определяемая приложением или объектом). Если я передаю пустую строку для имени элемента управления (и, следовательно, выполняю поиск по всей форме), я не получаю ошибку (потому что я вообще не ссылаюсь на элемент управления).
Я пробовал различные другие способы избежать получения свойства по умолчанию, но ни один из них не работает.
В чем волшебство, чтобы получить ссылку на элемент управления?
Комментарии:
2. Спасибо, но я уже прочитал это перед публикацией. Есть ли конкретная часть, на которую вы ссылаетесь?
3. Set работает для меня. Конечно, свойство ctrl по умолчанию будет равно Value, если это элемент управления данными. Если вам не нужно значение, укажите нужное свойство. Показать код, который является реальной проблемой. Что вы хотите сделать с помощью ctrl?
4. Ctrl НЕ установлен на строку, он установлен на объект управления текстовым полем. Ctrl — это объект со свойствами, включая значение, если это элемент управления данными. Поэтому, когда вы ссылаетесь на Ctrl без указания свойства, оно использует default. Как вы думаете, зачем вам нужна эта объектная переменная?
5. Я отредактировал свой первоначальный пост, чтобы показать точный код. Я пытаюсь сослаться на текстовое поле в разделе Сведений формы. Текстовое поле заблокировано.
Ответ №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)
Комментарии:
1. ДОХ! Где мой дурацкий колпачок. :-X Спасибо, и я пометил ваш ответ как ответ.