Лучший подход в этих случаях - не пытаться передавать кучу переменных. Это слишком много кода и негибко. Например, если вам нужно передать два значения, что произойдет за эти годы, когда это требование возрастет до 5 значений? Попытка сохранить и передать целый набор значений - слишком трудоемкий код.
Имейте в виду, что каждая форма в ms-access на самом деле является объектом класса, которым вы можете манипулировать в коде. Итак, используйте здесь объектный подход, и вы обнаружите, что вы не только пишете меньше кода, но и ваш код будет более чистым, более модульным, не будет нуждаться в глобальных переменных, а код, который вы пишете, часто может использоваться повторно между различными формами. *
Вот как:
Как правило, когда одна форма запускает другую форму во 2-й форме в событии открытия форм (на самом деле вы можете использовать его даже позже, чем событие загрузки), вы можете получить ссылку на объект формы ПРЕДЫДУЩАЯ. , Другими словами, вы можете использовать объектный подход здесь.
На уровне модуля форм, для формы я объявляю объект формы как:
Option Compare Database
Option Explicit
dim frmPrevious as form
Затем в событии загрузки по формам мы идем:
Set frmPrevious = Screen.ActiveForm
Теперь любой код в нашей форме может БЕСПЛАТНО использовать код, события, даже переменные, объявленные как открытые из предыдущей формы в коде.
Итак, если вы хотите форсировать запись на диск предыдущей формы и перезагрузить данные.
frmPrevious.Refresh
Если вы хотите установить значение идентификатора, перейдите:
frmPrevious!ID = some value
И, обратите внимание, что вы даже можете объявить предыдущую форму как переменную PUBLIC для этой формы, и, таким образом, если у вас две формы глубины, вы можете перейти:
frmPrevious.frmPrevious!ID = some value
Итак, просто объявите объект формы в КАЖДОМ модуле кода форм (или, по крайней мере, в тех, где вам нужно использовать значения в коде). Вышеуказанное означает, что любой код имеет готовую ссылку на предыдущий объект формы. Функции, объявленные как общедоступные в форме, становятся МЕТОДОМ формы и могут выполняться следующим образом:
frmPrevious.MyCustomRefresh
или даже такие вещи, как некоторая опция, чтобы заставить предыдущую форму сгенерировать и настроить номер счета:
frmPrevous.SetInvoice
или
frmPrevious.SetProjectStatusOn
Таким образом, вы можете не только перетасовывать значения и данные назад и вперед, но и легко выполнять функции и функции, встроенные в код для преобладающей формы.
Фактически, как стандарт кодирования, большинство моих форм имеют открытую функцию под названием MyRefresh
.
Обратите внимание, что прелесть этого подхода в том, что вы можете читать + использовать + устанавливать значения из этой предыдущей формы. Это позволяет вашему коду не только получать значения, но и устанавливать значения в этой предыдущей форме. Так что этот подход является двунаправленным. Вы можете перетасовывать данные и значения между формами. Другим преимуществом здесь является то, что вы НЕ ограничены только переменными, но можете использовать поля, управляющие значения (события, свойства) и т. Д.
Этот подход означает, что большая часть предыдущей формы теперь у вас под рукой.
Так что не пытайтесь передать целый набор переменных. Передайте ссылку на форму, и у вас под рукой будет красивый готовый объект, и это делает этот тип проблемы кодирования легким.