Как ссылаться на текущую форму в выражении в Microsoft Access? - PullRequest
8 голосов
/ 09 января 2012

Я не эксперт по Access, и у меня есть (надеюсь!) Простой вопрос ...

У меня есть форма с несколькими записями.В некоторых текстовых полях я просто представляю значения из базовой таблицы - поэтому они связаны с соответствующими полями.

Но некоторые текстовые поля должны содержать вычисляемые значения.Некоторые расчеты сложны и включают много полей из таблицы.Я пишу вычисления как функцию VBA.Я мог бы ввести что-то вроде этого как «Источник управления»:

=MyFunction([Field1], [Field2], [Field3] ...)

Но я не хочу перечислять десятки полей в вызове функции.Вместо этого я хочу отправить всю форму (или текущую запись) в качестве параметра и позволить функции ссылаться на необходимые ей поля.Я могу сделать это так:

=MyFunction([Forms]![MyForm])

Но мне не нравится называть форму в вызове.Разве нет способа отправить «текущую форму» в качестве аргумента функции?В VBA вы просто используете ключевое слово «Me», например «Me! [Field1]».Но кажется, что «Я» не принимается в выражении.

Есть ли какой-либо другой способ ссылаться на текущую форму в выражении?

(Это косметический вопрос, я знаю.Но не очень хорошо программировать, чтобы использовать «[Form]! [MyForm]». Позже вы копируете элементы управления в другую форму и забываете поменять имя в выражении ...)

Благодарен за помощь!: -)

/ Андерс

Ответы [ 5 ]

9 голосов
/ 09 января 2012

Вы можете использовать:

=MyFunction([Form])

Код будет:

Function MyFunction(frm As Form)
MsgBox frm.Name
End Function
5 голосов
/ 10 января 2012

'me' можно вызывать только из соответствующего объекта формы (т. Е. В процедурах, функциях и событиях объекта).

Мой любимый способ обращения к текущей форме - вызывать объект screen.activeForm ...

screen.activeForm.recordset.fields(myFieldname).value
screen.activeForm.controls(myControl).value
screen.activeForm.name
....

Конечно, вы можете отправить объект формы в пользовательскую функцию

my Result = myCustomFunction(screen.activeForm)

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

3 голосов
/ 10 января 2012

Если вы используете код в форме, то «я» ссылается на текущую форму. Так

Call SomeFunction(me)

Однако «я» нельзя использовать в контексте выражения, связанного с текстовым полем.

В этом случае вы можете выбрать текущий экран в процедуре с помощью screen.activeform, как было предложено.

Я часто хожу:

Dim f     as form
Set f = screen.ActiveForm
1 голос
/ 13 сентября 2013
Screen.ActiveControl.Parent
' or
someControlVariable.Parent

Я использую это, если я хочу текущую подчиненную форму (или форму, если в данный момент не находится в подчиненной форме), потому что использование Screen.ActiveForm не обеспечивает текущую подчиненную форму, а только форму, содержащую эту подчиненную форму.Помните о своем контексте, если элемент управления находится внутри элемента управления вкладками, то его родитель является элементом управления вкладкой, а не формой.

0 голосов
/ 02 ноября 2014

В ACC2013 я не мог использовать fionnuala ответ. Поэтому я изменился на:

Обработчик событий в окне свойств:

=MyFunction()

Мой код будет:

Function MyFunction()
  Dim frm As Form   
  Set frm = Screen.ActiveForm
  MsgBox frm.Name
End Function
...