Remkomplekty.ru

IT Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Вызов функции vba excel

Процедуры и функции, их вызов и передача параметров

Основными компонентами программы на VBA являются процедуры и функции, Они представляют собой фрагменты программного кода, заключенные между операторами Sub и End Sub или между операторами Function и End Function. Вот как может выглядеть процедура VBA:

Функция отличается от процедуры тем, что ее имя выступает также в качестве переменной и используется для возвращения значения в точку вызова функции. Вот как может выглядеть функция:

Для того чтобы использовать написанную вами процедуру или функцию, необходимо вызвать ее. Как же осуществляется вызов процедур и функций? Процедуру с непустым списком аргументов можно вызвать только из другой процедуры или функции, использовав ее имя со списком фактических значений аргументов в качестве одного из операторов VBA. Функцию же можно вызвать не только с помощью отдельного оператора VBA, но и поместив ее имя со списком фактических значений аргументов прямо в формулу или выражение в программе на VBA или, например, прямо в формулу в вычисляемых полях запросов, форм и отчетов Access. Процедура с пустым списком аргументов (так называемый командный макрос) может быть вызвана не только из другой процедуры или функции, но и с помощью комбинации клавиш быстрого вызова, команд раскрывающихся меню или кнопок панелей инструментов. Можно также связать такую процедуру с выполнением самых различных событий: например, с открытием формы или отчета, со щелчком мышью по кнопке в форме, с воздействием на элементы управления форм, в частности элементы управления ActiveX. Такие процедуры называют процедурами обработки событий. Понятно, что функции или процедуры, нуждающиеся в передаче им аргументов, таким способом вызвать нельзя. Подробнее о том, как создаются процедуры обработки событий, будет рассказано в разд. «Программирование в формах и отчетах» данной главы.

Если вызываемая процедура имеет уникальное имя и находится в том же модуле, что и вызывающая процедура, то для ее вызова достаточно указать это имя и задать список фактических значений аргументов, не заключая его в скобки. Второй способ вызова процедуры состоит в использовании оператора Call. Сначала идет оператор Call, затем имя процедуры и список параметров, в этом случае обязательно заключенный в скобки. Функцию можно вызывать точно так же, как и процедуру, но гораздо чаще используется другой, специфический способ вызова функций: использованием ее имени с заключенным в скобки списком параметров в правой части оператора присваивания.

Вот примеры вызова процедуры под именем CrossRC с передачей ей двух аргументов (константы и выражения):

А вот пример вызова двух функций — Left и Mid, и использования возвращаемого ими значения в выражении:

Допускается два различных способа передачи переменных процедуре или функции: по ссылке и по значению. Если переменная передается по ссылке, то это означает, что процедуре или функции будет передан адрес этой переменной в памяти. При этом происходит отождествление формального аргумента процедуры и переданного ей фактического параметра. Тем самым вызываемая процедура может изменить значение фактического параметра: если будет изменен формальный аргумент процедуры, то это скажется на значении переданного ей при вызове фактического параметра. Если же фактический параметр передается по значению, то формальный аргумент вызываемой процедуры или функции получает только значение фактического параметра, но не саму переменную, используемую в качестве этого параметра. Тем самым все изменения значения формального аргумента не сказываются на значении переменной, являющейся фактическим параметром.

Способ передачи параметров процедуре или функции указывается при описании ее аргументов: имени аргумента может предшествовать явный описатель способа передачи. Описатель ByRef задает передачу по ссылке, a ByVal — по значению. Если же явное указание способа передачи параметра отсутствует, то по умолчанию подразумевается передача по ссылке.

Поясним сказанное на примере. Пусть имеются следующие описания двух процедур:

Вспомогательная процедура Examplel использует в качестве формальных аргументов три переменные, описанные по-разному. Далее в теле этой процедуры каждый из них увеличивается на единицу, а затем их значения выводятся на экран с помощью функции MsgBox. Основная процедура Main устанавливает значения переменных a, b и с, а затем передает их в качестве (фактических) аргументов процедуре Examplel. При этом первый аргумент передается по ссылке (действует умолчание), второй — по значению, а третий — снова по ссылке. После возврата из процедуры Examplel основная процедура также выводит на экран значения трех переменных, передававшихся в качестве аргументов. Всего на экран выводится шесть значений:

  • сначала это числа 11, 21 и 31 (все полученные значения увеличены на 1 и выводятся процедурой Examplel);
  • затем это числа 11, 20 и 31 (эти значения выводятся процедурой Main, причем переменные, переданные по ссылке, увеличились, а переменная, переданная по значению — нет).

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

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

Если при этом имя модуля состоит из нескольких слов, следует заключить это имя в квадратные скобки. Например, если модуль называется «Графические процедуры», а процедура — «Крестик», вызов может выглядеть следующим образом:

Допускается также использование процедур, расположенных и в других проектах. При этом может потребоваться еще один уровень уточнения имени:

VBA Excel. Пользовательская функция (синтаксис, компоненты)

Создание пользовательской функции в VBA Excel, ее синтаксис и компоненты. Описание пользовательской функции и ее аргументов. Метод Application.MacroOptions.

Объявление пользовательской функции

Синтаксис функции

Компоненты функции

  • Static — необязательное ключевое слово, указывающее на то, что значения переменных, объявленных в функции, сохраняются между ее вызовами.
  • Имя — обязательный компонент, имя пользовательской функции.
  • СписокАргументов — необязательный компонент, одна или более переменных, представляющих аргументы, которые передаются в функцию. Аргументы заключаются в скобки и разделяются между собой запятыми.
  • Операторы — необязательный компонент, блок операторов (инструкций).
  • Имя = выражение — необязательный* компонент, присвоение имени функции значения выражения или переменной. Обычно, значение присваивается функции непосредственно перед выходом из нее.
  • Exit Function — необязательный компонент, принудительный выход из функции, если ей уже присвоено окончательное значение.

*Один из компонентов Имя = выражение следует считать обязательным, так как если не присвоить функции значения, смысл ее использования теряется.

Видимость функции

Видимость пользовательской функции определяется необязательными ключевыми словами Public и Private, которые могут быть указаны перед оператором Function (или Static, в случае его использования).

Ключевое слово Public указывает на то, что функция будет доступна для вызова из других процедур во всех модулях открытых книг Excel. Функция, объявленная как Public, отображается в диалоговом окне Мастера функций.

Ключевое слово Private указывает на то, что функция будет доступна для вызова из других процедур только в пределах программного модуля, в котором она находится. Функция, объявленная как Private, не отображается в диалоговом окне Мастера функций, но ее можно ввести в ячейку вручную.

Читать еще:  Vba excel обновить форму

Если ключевое слово Public или Private не указано, функция считается по умолчанию объявленной, как Public.

Чтобы пользовательская функция всегда была доступна во всех открытых книгах Excel, сохраните ее в Личной книге макросов без объявления видимости или как Public. Но если вы планируете передать рабочую книгу с пользовательской функцией на другой компьютер, код функции должен быть в программном модуле передаваемой книги.

Пример пользовательской функции

Для примера мы рассмотрим простейшую пользовательскую функцию, которой в следующем параграфе добавим описание. Называется функция «Деление», объявлена с типом данных Variant, так как ее возвращаемое значение может быть и числом, и текстом. Аргументы функции – Делимое и Делитель – тоже объявлены как Variant, так как в ячейках Excel могут быть числовые значения разных типов, и функция IsNumeric тоже проверяет разные типы данных и требует, чтобы ее аргументы были объявлены как Variant.

Кто вызвал функцию или процедуру?

Предположим вы написали два макроса — один скрывает строки, другой отображает.

‘скрываем строки Sub HideRows() Range(«A3:A14»).EntireRow.Hidden = True End Sub ‘показываем строки Sub UnhideRows() Range(«A3:A14»).EntireRow.Hidden = False End Sub

И, конечно — создали кнопки для вызова этих двух кодов (подробнее про создание кнопок — Как создать кнопку для вызова макроса на листе). Но потом захотелось большего — чтобы была всего одна кнопка и первым нажатием строки скрывались, а вторым отображались. Сделать это не проблема, если применить такой финт:

Sub HideUnhideRows() Range(«A3:A14»).EntireRow.Hidden = Not Range(«A3:A14»).EntireRow.Hidden End Sub

Но если код делается для пользователей, то лучше как-то дать понять им, в каком состоянии сейчас строки — скрыты или отображены и к какому действию приведет нажатие на кнопку. И лучше всего это сделать надписью на самой кнопке. Если кнопка одна на одном листе, то проблем быть не должно:

Sub HideUnhideRows() If Range(«A3:A14»).EntireRow.Hidden Then Range(«A3:A14»).EntireRow.Hidden = False ActiveSheet.Shapes(1).TextFrame2.TextRange.Text = «Скрыть строки» Else Range(«A3:A14»).EntireRow.Hidden = True ActiveSheet.Shapes(1).TextFrame2.TextRange.Text = «Показать строки» End If End Sub

Но если в книге несколько листов и на каждом по несколько кнопок, то не очень удобно будет в коде макроса указывать нужную кнопку. Да, можно указать по имени фигуры: ActiveSheet.Shapes(«Скругленный прямоугольник 1»). Но опять же — если кнопок много придется давать той единственной свое уникальное имя, совпадающее на всех листах. Но можно сделать проще — использовать свойство Caller:

Sub HideUnhideRows() Dim sShName As String sShName = Application.Caller If ActiveSheet.Shapes(sShName).TextFrame2.TextRange.Text = «Показать строки» Then Range(«A3:A14»).EntireRow.Hidden = False ActiveSheet.Shapes(sShName).TextFrame2.TextRange.Text = «Скрыть строки» Else Range(«A3:A14»).EntireRow.Hidden = True ActiveSheet.Shapes(sShName).TextFrame2.TextRange.Text = «Показать строки» End If End Sub

Автоопределение нажатой кнопки.xls (57,5 KiB, 201 скачиваний)

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

Function СуммаЯчеекВсехЛистов(Ячейка As Range) Dim ws As Worksheet ‘объявляем переменную для обращения к листам в цикле Dim dblSum As Double ‘переменная для хранения суммы ‘цикл по листам книги For Each ws In ActiveWorkbook.Worksheets If Not ws Is ActiveSheet Then ‘исключаем активный лист из суммирования dblSum = dblSum + ws.Range(Ячейка.Address).Value End If Next ws ‘присваиваем значение суммы функции СуммаЯчеекВсехЛистов = dblSum End Function

Но это очень неправильно. Во-первых, цикл идет по листам активной книги. А это значит, что если с этой книги перейти в другую — то функция будет вычислять сумму на листах именно этой книги, а не той, в которой записана функция. Во-вторых, строка If Not ws Is ActiveSheet Then исключает из суммирования лист активной книги, а не той книги, в которой записана функция. Это может привести к ошибочным расчетам, что весьма критично, если на расчеты функции опираются функции других книг и листов. Поэтому надо определять не активную книгу, а именно ту, в которой функция. Здесь опять поможет свойство Caller:

Function СуммаЯчеекВсехЛистов(Ячейка As Range) Dim ws As Worksheet ‘объявляем переменную для обращения к листам в цикле Dim dblSum As Double ‘переменная для хранения суммы Dim rFuncCell As Range ‘переменная для хранения ссылки на ячейку с функцией Dim wsFunc As Worksheet ‘переменная для хранения ссылки на лист с функцией Dim wbFunc As Workbook ‘переменная для хранения ссылки на книгу с функцией Set rFuncCell = Application.Caller ‘ячейка с функцией Set wsFunc = rFuncCell.Parent ‘лист с функцией Set wbFunc = wsFunc.Parent ‘книга с функцией ‘для листа и книги можно записать одной строкой: ‘Set wsFunc = Application.Caller.Parent ‘лист с функцией ‘Set wbFunc = Application.Caller.Parent.Parent ‘книга с функцией ‘цикл по листам книги с функцией For Each ws In wbFunc.Worksheets If Not ws Is wsFunc Then ‘исключаем лист с функцией из суммирования dblSum = dblSum + ws.Range(Ячейка.Address).Value End If Next ws ‘присваиваем значение суммы функции СуммаЯчеекВсехЛистов = dblSum End Function

А теперь попробуем разобраться, что же за зверь такой, этот Caller.
Caller — свойство объекта Application, которое возвращает информацию о том, как(чем) был вызван код. Есть несколько вариантов вызова и в зависимости от них значение, возвращаемое Caller меняется:

  • Если вызов был из функции пользователя — Caller вернет объект Range, представляющий ссылку на ячейку, в которой записана функция пользователя. Если это функция введена как формула массива — то Caller вернет ссылку на все ячейки, в которые записана функция
  • Если вызов был кнопкой на листе — Caller вернет текст, содержащий локальное имя объекта Shape, к которому привязан вызов процедуры
  • Если вызов был из событийной процедуры(Workbook_Open и им подобные), либо процедура была вызвана через Alt+F11 — Caller вернет ошибку REF
  • Если процедура вызвана с панели(Ribbon или настраиваемая панель) — Caller будет иметь тип Variant(), но не сможет определить как именно был вызван код и при попытке обращения к нему получим так же ошибку REF
  • Если вызов был через процедуры автоматизации (Auto_Open, Auto_Close, Auto_Activate, Auto_Deactivate) — Caller вернет тип String и содержит имя книги и активного листа это устаревшие процедуры, которые сейчас заменены событийными в классах книг и листов, но тем не менее их можно встретить в некоторых кодах

Для примера можно скачать файл по ссылке:

Caller test.xls (56,0 KiB, 241 скачиваний)

Там записаны две функции — одна с использованием ссылки на активную ячейку, другая с применением Caller:

‘возвращает адрес активной ячейки активного листа, даже если активная ячейка в другой книге Function GetActCell() Application.Volatile True GetActCell = «‘GetActCell’ return address: » & ActiveCell.Address(0, 0, xlA1, True) End Function ‘возвращает всегда адрес той ячейки, в которой записана Function GetActCell_Caller() Application.Volatile True GetActCell_Caller = «‘GetActCell_Caller’ return address: » & Application.Caller.Address(0, 0, xlA1, True) End Function

Чтобы во всей мере понять смысл объекта Caller поизменяйте значения любых ячеек на листе с функциями. Потом перейдите на любой другой лист этой же книги — измените там какую-нибудь ячейку. Вернитесь на лист с функциями и посмотрите, что там отображается. Так же можно перейти в другую книгу и изменить что-то там. Вернуться и посмотреть результат. В ячейке с GetActCell будет отображаться адрес той ячейки, которая была изменена последней. В ячейке же с GetActCell_Caller всегда будет адрес именно той ячейки, в которой записана сама функция GetActCell_Caller.

Читать еще:  Excel макрос cells

Хотел бы так же отметить, что для определения ячейки с функцией можно использовать объект Application.ThisCell, который возвращает ссылку на ячейку, из которой была вызвана функция. Этот объект внутри функций пользователя можно применять точно так же, как и Caller. Но он не может быть применен для определения других методов вызова функций и процедур, как Caller.

Статья помогла? Поделись ссылкой с друзьями!

Поиск по меткам

Здравствуйте Игорь, очень долго копался везде, никак не могу понять каким образом в VBA можно в коде макроса сослаться на его имя. Например:
на Пользовательской форме есть куча контроллеров (Чекбоксы, текстбоксы и т д). Хочу прописать каждому контроллеру обращение в функцию, в которой одинаковые контроллеры следуют одинаковой логике. В функцию нужно передать имя макроса, который эту функцию вызывает. Спасибо за ответ!

Максим, не знаю про какого Игоря сейчас речь и зачем Вы с ним здороваетесь здесь, но Ваша ситуация очень похожа на необходимость использования классов: Работа с модулями классов

Поделитесь своим мнением

Комментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме — добро пожаловать на Форум

Процедуры «Function» и «Sub» в VBA

Встроенные функции VBA

Перед тем, как приступить к созданию собственных функций VBA, полезно знать, что Excel VBA располагает обширной коллекцией готовых встроенных функций, которые можно использовать при написании кода.

Список этих функций можно посмотреть в редакторе VBA:

  • Откройте рабочую книгу Excel и запустите редактор VBA (нажмите для этого Alt+F11), и затем нажмите F2.
  • В выпадающем списке в верхней левой части экрана выберите библиотеку VBA.
  • Появится список встроенных классов и функций VBA. Кликните мышью по имени функции, чтобы внизу окна отобразилось её краткое описание. Нажатие F1 откроет страницу онлайн-справки по этой функции.

Кроме того, полный список встроенных функций VBA с примерами можно найти на сайте Visual Basic Developer Centre.

Пользовательские процедуры «Function» и «Sub» в VBA

В Excel Visual Basic набор команд, выполняющий определённую задачу, помещается в процедуру Function (Функция) или Sub (Подпрограмма). Главное отличие между процедурами Function и Sub состоит в том, что процедура Function возвращает результат, процедура Sub – нет.

Поэтому, если требуется выполнить действия и получить какой-то результат (например, просуммировать несколько чисел), то обычно используется процедура Function, а для того, чтобы просто выполнить какие-то действия (например, изменить форматирование группы ячеек), нужно выбрать процедуру Sub.

Аргументы

При помощи аргументов процедурам VBA могут быть переданы различные данные. Список аргументов указывается при объявлении процедуры. К примеру, процедура Sub в VBA добавляет заданное целое число (Integer) в каждую ячейку в выделенном диапазоне. Передать процедуре это число можно при помощи аргумента, вот так:

Имейте в виду, что наличие аргументов для процедур Function и Sub в VBA не является обязательным. Для некоторых процедур аргументы не нужны.

Необязательные аргументы

Процедуры VBA могут иметь необязательные аргументы. Это такие аргументы, которые пользователь может указать, если захочет, а если они пропущены, то процедура использует для них заданные по умолчанию значения.

Возвращаясь к предыдущему примеру, чтобы сделать целочисленный аргумент функции необязательным, его нужно объявить вот так:

В таком случае целочисленный аргумент i по умолчанию будет равен 0.

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

Передача аргументов по значению и по ссылке

Аргументы в VBA могут быть переданы процедуре двумя способами:

  • ByVal – передача аргумента по значению. Это значит, что процедуре передаётся только значение (то есть, копия аргумента), и, следовательно, любые изменения, сделанные с аргументом внутри процедуры, будут потеряны при выходе из неё.
  • ByRef – передача аргумента по ссылке. То есть процедуре передаётся фактический адрес размещения аргумента в памяти. Любые изменения, сделанные с аргументом внутри процедуры, будут сохранены при выходе из процедуры.

При помощи ключевых слов ByVal или ByRef в объявлении процедуры можно задать, каким именно способом аргумент передаётся процедуре. Ниже это показано на примерах:

Помните, что аргументы в VBA по умолчанию передаются по ссылке. Иначе говоря, если не использованы ключевые слова ByVal или ByRef, то аргумент будет передан по ссылке.

Перед тем как продолжить изучение процедур Function и Sub более подробно, будет полезным ещё раз взглянуть на особенности и отличия этих двух типов процедур. Далее приведены краткие обсуждения процедур VBA Function и Sub и показаны простые примеры.

VBA процедура «Function»

Редактор VBA распознаёт процедуру Function, когда встречает группу команд, заключённую между вот такими открывающим и закрывающим операторами:

Как упоминалось ранее, процедура Function в VBA (в отличие от Sub), возвращает значение. Для возвращаемых значений действуют следующие правила:

  • Тип данных возвращаемого значения должен быть объявлен в заголовке процедуры Function.
  • Переменная, которая содержит возвращаемое значение, должна быть названа так же, как и процедура Function. Эту переменную не нужно объявлять отдельно, так как она всегда существует как неотъемлемая часть процедуры Function.

Это отлично проиллюстрировано в следующем примере.

Пример VBA процедуры «Function»: Выполняем математическую операцию с 3 числами

Ниже приведён пример кода VBA процедуры Function, которая получает три аргумента типа Double (числа с плавающей точкой двойной точности). В результате процедура возвращает ещё одно число типа Double, равное сумме первых двух аргументов минус третий аргумент:

Эта очень простая VBA процедура Function иллюстрирует, как данные передаются процедуре через аргументы. Можно увидеть, что тип данных, возвращаемых процедурой, определён как Double (об этом говорят слова As Double после списка аргументов). Также данный пример показывает, как результат процедуры Function сохраняется в переменной с именем, совпадающим с именем процедуры.

Вызов VBA процедуры «Function»

Если рассмотренная выше простая процедура Function вставлена в модуль в редакторе Visual Basic, то она может быть вызвана из других процедур VBA или использована на рабочем листе в книге Excel.

Вызов VBA процедуры «Function» из другой процедуры

Процедуру Function можно вызвать из другой VBA процедуры при помощи простого присваивания этой процедуры переменной. В следующем примере показано обращение к процедуре SumMinus, которая была определена выше.

Вызов VBA процедуры «Function» из рабочего листа

VBA процедуру Function можно вызвать из рабочего листа Excel таким же образом, как любую другую встроенную функцию Excel. Следовательно, созданную в предыдущем примере процедуру FunctionSumMinus можно вызвать, введя в ячейку рабочего листа вот такое выражение:

VBA процедура «Sub»

Редактор VBA понимает, что перед ним процедура Sub, когда встречает группу команд, заключённую между вот такими открывающим и закрывающим операторами:

VBA процедура «Sub»: Пример 1. Выравнивание по центру и изменение размера шрифта в выделенном диапазоне ячеек

Рассмотрим пример простой VBA процедуры Sub, задача которой – изменить форматирование выделенного диапазона ячеек. В ячейках устанавливается выравнивание по центру (и по вертикали, и по горизонтали) и размер шрифта изменяется на заданный пользователем:

Читать еще:  Vba excel address

Данная процедура Sub выполняет действия, но не возвращает результат.

В этом примере также использован необязательный (Optional) аргумент iFontSize. Если аргумент iFontSize не передан процедуре Sub, то его значение по умолчанию принимается равным 10. Однако же, если аргумент iFontSize передается процедуре Sub, то в выделенном диапазоне ячеек будет установлен размер шрифта, заданный пользователем.

VBA процедура «Sub»: Пример 2. Выравнивание по центру и применение полужирного начертания к шрифту в выделенном диапазоне ячеек

Следующая процедура похожа на только что рассмотренную, но на этот раз, вместо изменения размера, применяется полужирное начертание шрифта в выделенном диапазоне ячеек. Это пример процедуры Sub, которой не передаются никакие аргументы:

Вызов процедуры «Sub» в Excel VBA

Вызов VBA процедуры «Sub» из другой процедуры

Чтобы вызвать VBA процедуру Sub из другой VBA процедуры, нужно записать ключевое слово Call, имя процедуры Sub и далее в скобках аргументы процедуры. Это показано в примере ниже:

Если процедура Format_Centered_And_Sized имеет более одного аргумента, то они должны быть разделены запятыми. Вот так:

Вызов VBA процедуры «Sub» из рабочего листа

Процедура Sub не может быть введена непосредственно в ячейку листа Excel, как это может быть сделано с процедурой Function, потому что процедура Sub не возвращает значение. Однако, процедуры Sub, не имеющие аргументов и объявленные как Public (как будет показано далее), будут доступны для пользователей рабочего листа. Таким образом, если рассмотренные выше простые процедуры Sub вставлены в модуль в редакторе Visual Basic, то процедура Format_Centered_And_Bold будет доступна для использования на рабочем листе книги Excel, а процедура Format_Centered_And_Sized – не будет доступна, так как она имеет аргументы.

Вот простой способ запустить (или выполнить) процедуру Sub, доступную из рабочего листа:

  • Нажмите Alt+F8 (нажмите клавишу Alt и, удерживая её нажатой, нажмите клавишу F8).
  • В появившемся списке макросов выберите тот, который хотите запустить.
  • Нажмите Выполнить (Run)

Чтобы выполнять процедуру Sub быстро и легко, можно назначить для неё комбинацию клавиш. Для этого:

  • Нажмите Alt+F8.
  • В появившемся списке макросов выберите тот, которому хотите назначить сочетание клавиш.
  • Нажмите Параметры (Options) и в появившемся диалоговом окне введите сочетание клавиш.
  • Нажмите ОК и закройте диалоговое окно Макрос (Macro).

Внимание: Назначая сочетание клавиш для макроса, убедитесь, что оно не используется, как стандартное в Excel (например, Ctrl+C). Если выбрать уже существующее сочетание клавиш, то оно будет переназначено макросу, и в результате пользователь может запустить выполнение макроса случайно.

Область действия процедуры VBA

В части 2 данного самоучителя обсуждалась тема области действия переменных и констант и роль ключевых слов Public и Private. Эти ключевые слова так же можно использовать применительно к VBA процедурам:

Как вызвать функцию VBA в подпроцедуру

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

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

Я попробовал это .

Я знаю, что это довольно плохо, но я понятия не имею, как включить это в процедуру.

5 ответов

Вот несколько разных способов называть вещи в Microsoft Access:

Чтобы вызвать подпрограмму или функцию из модуля

Подпункт в форме, которую вы вызываете, ДОЛЖЕН быть общедоступным, как в:

Назовите подпрограмму следующим образом:

Форма должна быть открыта до совершения звонка.

Чтобы вызвать процедуру события, вы должны вызвать открытую процедуру в форме и вызвать процедуру события в этой открытой процедуре.

Вызов подпрограммы в модуле из формы

. просто позвоните прямо из процедуры вашего мероприятия:

Вызов подпрограммы из формы без использования процедуры события

Если вы хотите, вы можете фактически связать функцию с событием элемента управления формы без необходимости создания процедуры события под элементом управления. Чтобы сделать это, вам сначала нужна открытая функция в модуле, а не в подпрограмме, например:

Затем, если у вас есть кнопка в форме, вместо того, чтобы помещать [Процедура обработки события] в событие OnClick окна свойств, укажите это:

Когда вы нажимаете кнопку, она вызывает публичную функцию в модуле.

Чтобы вызвать функцию вместо процедуры

Если вызов подпрограммы выглядит следующим образом:

Тогда вызов функции выглядит следующим образом:

где Result — переменная типа, возвращаемого функцией.

ПРИМЕЧАНИЕ. Вам не всегда нужно ключевое слово Call. В большинстве случаев вы можете просто вызывать подпрограмму следующим образом:

если pptCreator — это функция /процедура в том же файле, вы можете вызвать ее, как показано ниже

Вызов подпроцедуры — трехсторонняя техника

Если у вас есть процедура, независимо от того, создали ли вы ее или она является частью языка Visual Basic, вы можете использовать ее. Использование процедуры также называется ее вызовом.

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

Помимо использования имени процедуры для ее вызова, вы также можете добавить к ней ключевое слово Call. Вот пример:

При вызове процедуры, без или без ключевого слова Call, вы можете дополнительно ввести открывающую и закрывающую скобки справа от ее имени. Вот пример:

Процедуры и уровни доступа

Подобно переменному доступу, доступ к процедуре может контролироваться уровнем доступа. Процедура может быть частной или публичной. Чтобы указать уровень доступа к процедуре, поставьте перед ним ключевое слово Private или Public. Вот пример:

Правила, которые применялись к глобальным переменным, одинаковы:

Private: если процедура сделана приватной, ее можно вызвать другими процедурами того же модуля. Процедуры внешних модулей не могут получить доступ к такой процедуре.

Кроме того, когда процедура является закрытой, ее имя не отображается в диалоговом окне «Макросы»

Public: процедура, созданная как public, может вызываться процедурами того же модуля и процедурами других модулей.

Кроме того, если процедура была создана как общедоступная, при доступе к диалоговому окну «Макросы» появляется ее имя, и вы можете запустить ее оттуда

Процедуры в модуле становятся полезными и общими, когда вы передаете аргументы.

Теперь может отображать любое сообщение, переданное с помощью строковой переменной с именем strMessage.

Чтобы добавить функцию к новой кнопке в форме: (и не используйте макрос для вызова функции)

После того как вы создали свою функцию (Function MyFunctionName ()) и вы находитесь в режиме конструктора форм:

  1. Добавьте новую кнопку (я не думаю, что вы можете переназначить старую кнопку — хотя не уверен).
  2. Когда откроется окно мастера кнопок, нажмите Отмена.
  3. Перейдите в свойства кнопки. Вкладка «Событие» — поле «При нажатии».
  4. В раскрывающемся меню в этих полях выберите: Процедура обработки события.
  5. Теперь нажмите кнопку рядом с раскрывающимся меню, в котором есть . и вы попадете в новую частную подписку в окне форм Visual Basic.
  6. В этом частном типе Sub: Call MyFunctionName
    Это должно выглядеть примерно так:

Private Sub Command23_Click ()

Позвонить в MyFunctionName

  1. Тогда просто сохраните его.
Ссылка на основную публикацию
Adblock
detector