MS Access, как подчиненная форма может получить значение из другой подчиненной формы? - PullRequest
3 голосов
/ 03 ноября 2011

У меня есть основная форма, которая содержит две другие дочерние подчиненные формы. Когда значение текстового поля изменяется в подчиненной форме (A), я хотел бы установить значение текстового поля в подчиненной форме (B) равным измененному текстовому полю в подчиненной форме (A).

Так что, будучи совершенно новым для Access, я немного погуглил, и, похоже, это можно сделать с помощью некоторого VBA. Поэтому в текстовое поле subform (A) 'after update' я добавил этот VBA.

Private Sub ID_AfterUpdate()
    Me.Parent.Forms.formA.textboxDestination.Value = Me.textboxSource.Value
End Sub

Я делаю это с помощью построителя кода. Затем я сохраняю и запускаю форму. Ничего не произошло. Нет ошибок .. ничего, я даже не уверен, что кусок кода работает. Я даже не уверен, как отлаживать VBA в Access. Кто-нибудь может мне помочь?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 03 ноября 2011

Событие после обновления для элемента управления запускается, когда пользователь изменяет его значение.Если ID связан с полем автонумерации, механизм БД предоставит его значение при добавлении новой записи.Однако, так как пользователь не сделал это изменение, событие после обновления не срабатывает.

Для общих целей отладки вы можете добавить оператор Debug.Print или MsgBox.

Debug.Print "my event fired"
MsgBox "my event fired"

Просмотр вывода из Debug.Print в окне Immediate окна VB Editor.Вы можете перейти из главного окна Access с помощью сочетания клавиш Ctrl + g.

Другой способ - установить точку останова на строке вашего кода.Щелкните правой кнопкой мыши строку кода, затем выберите Toggle-> Breakpoint из контекстного меню.Или щелкните в левом поле, чтобы появилась красноватая точка, обозначающая точку останова.Или нажмите клавишу F9.Или выберите Debug-> Toggle Breakpoint в главном меню VB Editor.

Вы также можете набрать Stop на отдельной строке, чтобы активировать режим прерывания.Тем не менее, вам нужно будет удалить его позже.Те другие точки останова, которые я упомянул, являются временными и не сохраняются в модуле кода.

Однако, если вы переходите в режим прерывания, вы можете затем пройти код по одной строке за раз с помощью клавиши F8.Это покажет вам, какие строки выполняются.Вы также можете проверить значение переменной в любое время в режиме прерывания, введя знак вопроса, затем имя переменной, а затем клавишу Enter в окне немедленных действий:

? MyVariable

Изучите главное меню редактора VB.найти дополнительные параметры отладки.Например, окно просмотра позволит вам отслеживать значения выбранных переменных при переходе по коду.

1 голос
/ 24 мая 2013

Вам не нужно указывать имя родительской формы.

Me.Parent.CONTROLNAME.Value является своего рода рабочим кодом.

Привет

1 голос
/ 04 ноября 2011

В свойстве update текстового поля, которое вы изменяете, укажите следующее:

[Forms]![frmContainingValueYouWantToChange]![txtTextboxYouWantToChange] = "newValueHere"

Сообщите нам, как вы попали?

0 голосов
/ 13 мая 2017

Я знаю, что это было 6 лет назад, но я думаю, что ошибка здесь заключалась в том, что вы обновляли значение с formA до того же formA.

Me.Parent.Forms.formA на самом деле до Meпотому что вы звонили:

текстовое поле subform (A) 'после обновления'

Это должно быть formB и слово "Форма" должно быть помещенопосле (и слово «Значение» не обязательно):

Private Sub textboxSource_AfterUpdate()
    Me.Parent.formB.Form.textboxDestination.Value = Me.textboxSource.Value
End Sub

Здесь вы можете узнать больше информации о том, как Обратиться к свойствам и элементам управления формы и подчиненной формы

Привет

...