Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Необязательные аргументы в пользовательской функции и формат вызова этой функции / 22 сообщений из 22, страница 1 из 1
25.12.2021, 14:43
    #40122958
Yup
Yup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
Делаю пользовательскую функцию
Код: vbnet
1.
Function filtr_01(Optional ByVal dbl As Variant = 0, Optional ByVal istDate As Variant = #1/1/2022#)



Но не могу вызвать (например в событии кнопки на форме) ее в формате =filtr_01()
Вылетает ошибка "Введенное выражение содержит функцию с неверным числом аргументов"
Если явно объявить переменные в функции =filtr_01(0, #1/1/2022#) то все работает.
Почему не дает вызывать без явного задания опциональных переменных?
...
Рейтинг: 0 / 0
25.12.2021, 15:08
    #40122961
Yup
Yup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
Да, вот еще момент: происходит такое если функция определена в модуле формы (из которой вызывается). Если же перенести функцию в обычный модуль то все нормально вызывается без параметров. Во вложении тестовая база с функцией в модуле формы
...
Рейтинг: 0 / 0
25.12.2021, 15:20
    #40122963
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
Yup, такие действия по типу макросов не прокатят - действуйте стандартным способом.
...
Рейтинг: 0 / 0
25.12.2021, 16:56
    #40122970
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
Потому что должно быть так:
В зависимости от того где Вы будете применять эту функцию-либо в модуле формы,либо в общем модуле пишите:
Код: vbnet
1.
2.
3.
Function my(Optional ByVal dbl As Variant , Optional ByVal istDate As Variant) 
    MsgBox istDate
End Function

а затем вызываете её:
Код: vbnet
1.
2.
3.
Private Sub кнопка2_Click()
Call my(, #1/1/2022#)
End Sub
...
Рейтинг: 0 / 0
25.12.2021, 17:01
    #40122972
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
sdku
Потому что должно быть так:
В зависимости от того где Вы будете применять эту функцию-либо в модуле формы,либо в общем модуле пишите:
Код: vbnet
1.
2.
3.
Function my(Optional ByVal dbl As Variant , Optional ByVal istDate As Variant) 
    MsgBox istDate
End Function

а затем вызываете её:
Код: vbnet
1.
2.
3.
Private Sub кнопка2_Click()
Call my(, #1/1/2022#)
End Sub

Если это вычисления в одной конкретной форме то занахрена функция
...
Рейтинг: 0 / 0
25.12.2021, 18:48
    #40122990
Yup
Yup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
sdku
Потому что должно быть так:
В зависимости от того где Вы будете применять эту функцию-либо в модуле формы,либо в общем модуле пишите:
Код: vbnet
1.
2.
3.
Function my(Optional ByVal dbl As Variant , Optional ByVal istDate As Variant) 
    MsgBox istDate
End Function

а затем вызываете её:
Код: vbnet
1.
2.
3.
Private Sub кнопка2_Click()
Call my(, #1/1/2022#)
End Sub



Я так и не понял чем это лучше прямого вызова функции из события элемента (кнопки в данном случае). Какие дает преимущества?
...
Рейтинг: 0 / 0
25.12.2021, 18:49
    #40122991
Yup
Yup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
alecko
Yup, такие действия по типу макросов не прокатят - действуйте стандартным способом.


Не могли бы немного раскрыть мысль, а то я, честно говоря, не совсем понял что вы имеете в виду.
...
Рейтинг: 0 / 0
25.12.2021, 19:04
    #40122994
Yup
Yup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
sdku
Если это вычисления в одной конкретной форме то занахрена функция


Ну я внутри этой функции формирую строку фильтра, в которую включено до 15-20 параметров (которые берутся считыванием элементов главной формы). И потом этот фильтр (в целом похожий, но с определенными изменениями, ветвление по которым идет в зависимости от первого аргумента функции) применяется в нескольких местах. Соответсвенно и вызывается функция из нескольких мест главной формы, с разными параметрами, влияющими на модернизацию фильтра.

Сама функция находится в модуле главной формы что бы удобней было считывать значения элементов фильтра, находящихся на этой же форме. Можно, конечно, функцию перенести в общий модуль и в нем прописывать полный путь для элементов (что в общем то не сложно), но мне показалось так более правильным и удобным. Но вот почему в модуле формы функция не хочет запускаться без указания опционных параметров - для меня пока так и остается загадкой. Опять же не сложно прописать эти параметры в том месте откуда вызываю, но стало интересно почему так происходит.
...
Рейтинг: 0 / 0
25.12.2021, 19:53
    #40123000
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
Yup
формирую строку фильтра, в которую включено до 15-20 параметров (которые берутся считыванием элементов главной формы

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

пока непонятны ваши намерения - может поясните на примере формы
...
Рейтинг: 0 / 0
25.12.2021, 19:59
    #40123002
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
Yup
alecko
Yup, такие действия по типу макросов не прокатят - действуйте стандартным способом.


Не могли бы немного раскрыть мысль, а то я, честно говоря, не совсем понял что вы имеете в виду.

Имелось ввиду, что суп нужно есть ложкой, а спагетти вилкой...
Код VBA желательно вызывать из кода VBA и понимать, что в акцессе макросы и код vba это не одно и то же... примерно как мухи и котлеты...
...
Рейтинг: 0 / 0
25.12.2021, 20:47
    #40123010
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
Yup, этот способ предусмотрен разработчиками Access и называется "Процедура обработки событий" - при выборе создает в VBE соответствующую программу с нужным заголовком. Остается самое простое - наполнить её смыслом.
Экселевский способ создания функций в общедоступных модулях тоже возможен (как то не учел влияние Excel-я), иногда.
...
Рейтинг: 0 / 0
25.12.2021, 21:01
    #40123012
Yup
Yup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
ПЕНСИОНЕРКА
Yup
формирую строку фильтра, в которую включено до 15-20 параметров (которые берутся считыванием элементов главной формы

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

пока непонятны ваши намерения - может поясните на примере формы


Так я так и делаю: при нажатии на кнопку обращаюсь к функции. Функция считывает с формы порядка 15-20 контролов (группы переключателей, флажки, поля), формирует строку фильтра и применяет его к нужной форме. В целом похожий (одинаково использующий бОльшую часть контролов-параметров) но с небольшими различиями (по разному интерпретирующий или вообще игнорирующий несколько оставшихся контролов) фильтр мне нужен в нескольких местах: показать в подчиненной форме актуальные записи, отобранные в определенном разрезе; в этой же подчиненной форме в похожем разрезе показать уже не актуальные, исторические записи на определенную дату; показать актуальные записи но в несколько более широком разрезе в отдельной модальной форме, открываемой по отдельной кнопке. Каждый из этих фильтров формируется и затем применяется разными событиями разных контролов (грубо говоря разными кнопками). Поэтому я и сделал общую функцию, которая в зависимости от переданного параметра dbl (обозначает нужный вариант строки фильтра, значения 0, 1 или 2) и переданной даты istDate (второй параметр) формирует в бОльшей части похожую но различающуюся нюансами строку фильтра. В каждой из кнопок, запускающей тот или иной вариант функции, я на событие "Нажатие кнопки" вешаю вызов функции "=filtr_01(dbl;istDate)" (dbl и istDate прописываю в виде значений разумеется).

Все работает. Но захотелось мне dbl и istDate сделать опциональными параметрами. istDate вообще используется только в одном варианте фильтра из трех возможных, вариант с dbl=0 (основной) используется в вызовах из событий нескольких контролов. Что бы удовлетворить свою хотелку (без которой, разумеется, можно спокойно обойтись) я функцию объявляю так:
Код: vbnet
1.
Function filtr_01(Optional ByVal dbl As Variant = 0, Optional ByVal istDate As Variant = #1/1/2022#)


Но если функция находится в модуле формы, то она не хочет вызываться из события нажатия кнопки "=filtr_01()", ругается на неверное число аргументов и хочет что бы я обязательно указал что dbl=0 и istDate=#1/1/2022#, т.е. вызывать ее надо обязательно "=filtr_01(0;#1/1/2022#)". Если же саму функцию из модуля формы перенести в обычный модуль, то вызов из события нажатия кнопки "=filtr_01()" работает и внутри функции dbl и istDate принимают прописанные им по умолчанию значения (но при этом мне не очень нравится что функция находится в общем модуле). Вот меня и интересует: почему так?
...
Рейтинг: 0 / 0
25.12.2021, 21:16
    #40123022
Yup
Yup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
alecko
Yup, этот способ предусмотрен разработчиками Access и называется "Процедура обработки событий" - при выборе создает в VBE соответствующую программу с нужным заголовком. Остается самое простое - наполнить её смыслом.
Экселевский способ создания функций в общедоступных модулях тоже возможен (как то не учел влияние Excel-я), иногда.


Да, я, безусловно, знаю (и использую) вариант присваивания нужному событию "Процедура обработки событий" и прописывание нужной обработки в теле соответсвующей Private Sub. Но иногда, как в описываемом случае, несколько кнопок вызывают по сути одну и туже функцию с немного различающимися параметрами. И мне эстетически не нравится плодить в модуле формы кучу Private Sub каждой кнопки, которые внутри себя содержат всего одну и туже строку с вызовом общей функции. Чем плохо прописывать вызов этой функции сразу в нужном событии кнопок, не плодя кучу Private Sub в модуле формы? Я реально не понимаю чем это плохо и был бы рад узнать.

ЗЫ Если в Private Sub нужного события кнопки больше чем одна строка и это наполнение отличается от наполнения других Private Sub других кнопок то в этом случае все понятно, и, собственно, я так и делаю. Но однотипные Private Sub в модуле только ухудшают, на мой взгляд, навигацию по тексту модуля...
...
Рейтинг: 0 / 0
25.12.2021, 21:33
    #40123030
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
Yup,
Зачем все эти длинные объяснения?
Во вложенном файле все работает как Вам надо
выложите фрагмент БД в нужном для решения "проблемы" объеме,что хотите получить "в выхлопе" и Вам быстро помогут
(а из объяснений мало что понятно-может Вашу задачу следует решать совсем иначе)
...
Рейтинг: 0 / 0
25.12.2021, 22:04
    #40123040
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
ПыСы:
Yup

...Я так и не понял чем это лучше прямого вызова функции из события элемента (кнопки в данном случае). Какие дает преимущества?
А разве дата это не аргумент функции который, как я понял из Ваших объяснений, будет меняться-а как его менять если он прописан в самой функции,а функция прописана в событии и уж там-то аргументы не поменяете
...
Рейтинг: 0 / 0
25.12.2021, 22:06
    #40123041
Yup
Yup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
sdku
Yup,
Зачем все эти длинные объяснения?
Во вложенном файле все работает как Вам надо
выложите фрагмент БД в нужном для решения "проблемы" объеме,что хотите получить "в выхлопе" и Вам быстро помогут
(а из объяснений мало что понятно-может Вашу задачу следует решать совсем иначе)


Про длинные объяснения согласен.
Во вложении форма с двумя кнопками. Они одинаковым способом вызывают одинаковые функции. Вся разница - одна функция находится в общем модуле а вторая - в модуле формы. Почему одна кнопка работает а вторая вызывает ошибку?

ЗЫ Моя задача решена изначально, способ ее решения (всегда явно указывать аргументы при вызове функции даже если эти аргументы опциональные) очевиден. Мне любопытны нюансы, а именно почему не работает вторая кнопка...
...
Рейтинг: 0 / 0
25.12.2021, 22:08
    #40123042
Yup
Yup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
Сорри, не приложил файл...
...
Рейтинг: 0 / 0
25.12.2021, 22:17
    #40123045
Yup
Yup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
sdku
ПыСы:
Yup

...Я так и не понял чем это лучше прямого вызова функции из события элемента (кнопки в данном случае). Какие дает преимущества?
А разве дата это не аргумент функции который, как я понял из Ваших объяснений, будет меняться-а как его менять если он прописан в самой функции,а функция прописана в событии и уж там-то аргументы не поменяете

Да, дата - это аргумент, и он будет меняться. Но он реально используется только в одном варианте вызова функции из трех. И в этом варианте я ее вызову из процедуры, где и присвою этой входящей дате нужное значение. В двух других вариантах вызова функции (при других значениях dbl) дата внутри функции не используется, мне все равно какая она, пусть будет та которая задается по умолчанию (Optional ByVal istDate As Variant = #1/1/2022#)
...
Рейтинг: 0 / 0
25.12.2021, 22:27
    #40123050
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
Yup
Почему одна кнопка работает а вторая вызывает ошибку?

а2010 - ни одна кнопка не работает, ошибка одинаковая
...
Рейтинг: 0 / 0
25.12.2021, 22:30
    #40123051
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
alecko
Yup, такие действия по типу макросов не прокатят - действуйте стандартным способом.
При прямом вызове функции ByVal не бывает-только в VBA
...
Рейтинг: 0 / 0
25.12.2021, 22:42
    #40123055
Yup
Yup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
vmag
Yup
Почему одна кнопка работает а вторая вызывает ошибку?

а2010 - ни одна кнопка не работает, ошибка одинаковая


Хмм... Чем дальше в лес тем толще партизаны... У меня а2016, но не думал что это вообще влиять должно. Ну да ладно, буду иметь в виду что либо вызывать из процедуры обработки события либо, если напрямую, то указывать все аргументы даже если они объявлены опциональными...
...
Рейтинг: 0 / 0
25.12.2021, 23:05
    #40123064
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необязательные аргументы в пользовательской функции и формат вызова этой функции
Yup
...буду иметь в виду что либо вызывать из процедуры обработки события либо, если напрямую, то указывать все аргументы даже если они объявлены опциональными...
Урааа!Заработало! (Кот Матроскин)
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Необязательные аргументы в пользовательской функции и формат вызова этой функции / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]