Вызов процедур Sub и Function
Чтобы вызвать процедуру Sub из другой процедуры, введите имя процедуры и включите значения для всех требуемых аргументов. Оператор Call не является обязательным, но в случае его использования вам следует заключить все аргументы в скобки.
Хотите создавать решения, которые расширяют возможности Office на разнообразных платформах? Ознакомьтесь с новой моделью надстроек Office. Надстройки Office занимают меньше места по сравнению с надстройками и решениями VSTO, и вы можете создавать их, используя практически любую технологию веб-программирования, например HTML5, JavaScript, CSS3 и XML.
Вызов процедур Sub с несколькими аргументами
В приведенном ниже примере показано два способа для вызова процедуры Sub с несколькими аргументами. При втором вызове аргументы должны быть заключены в скобки, так как используется оператор Call.
Использование круглых скобок при вызове процедур функций
Чтобы использовать возвращаемое значение функции, назначьте ее переменной, и заключите аргументы в скобки, как показано в следующем примере.
Если возвращаемое значение функции вас не интересует, можно вызвать функцию тем же способом, что и процедуру Sub. Опустите скобки, укажите аргументы и не назначайте функцию переменной, как показано в следующем примере.
Если включить скобки в предыдущий пример, оператор вызывает ошибку синтаксиса.
Передача именованных аргументов
Оператор в процедуре Sub или Function может передавать значения в вызываемые процедуры с помощью именованных аргументов. Вы можете указывать именованные аргументы в любом порядке. Именованный аргумент состоит из имени аргумента, за которым стоит двоеточие и знак равенства (:=), а затем следует присвоенное аргументу значение.
В примере ниже функция MsgBox вызывается с использованием именованных аргументов без возвращаемого значения.
В примере ниже функция MsgBox вызывается с использованием именованных аргументов. Возвращаемое значение присваивается переменной.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Русские Блоги
Мы находим место, где система перезагружается, и мы можем следовать шаг за шагом.
Это специальный режим: используется, когда есть функция, которая уже существует и не может быть изменена. Используйте эти два режима для исправления оригинальной функции. Если есть функция foo ();
RВ rtthread_startup, В основном достигается инициализация на уровне платы ( инициализация Периферийные устройства и драйверы); печать логотипа RT-Thread и информации о версии; инициализация Системный таймер инициализация Планировщик; создать поток приложения (здесь пользовательская основная функция как поток, пользовательская основная пуста); инициализация Программный таймер; создание незанятого потока; запуск системного планирования (после включения планирования основная функция будет участвовать в планировании и запускаться).
Ниже приведен поток основных функций, созданный в функции rt_application_init ():
Резюме: Вы можете использовать это для исправления основной функции:
Конечно, функция main () также может быть вашими собственными функциями, операция такая же, просто измените имя функции
Передача аргументов по значению и по ссылке (Visual Basic)
Различия
При передаче аргумента в процедуру следует учитывать несколько различных различий, взаимодействующих друг с другом:
Является ли базовый программный элемент изменяемым или неизменяемым
Является ли сам аргумент изменяемым или неизменяемым
Передается ли аргумент по значению или по ссылке
Является ли тип данных аргумента типом значения или ссылочным типом
Возможность выбора механизма передачи
Необходимо тщательно выбрать механизм передачи для каждого аргумента.
Для ссылочных типов копируются только указатель на данные (четыре байта на 32-разрядных платформах, восемь байт на 64-разрядных платформах). Таким образом, можно передавать аргументы типа String или Object по значению без ущерба для производительности.
Определение механизма передачи
В объявлении процедуры указывается механизм передачи для каждого параметра. Вызывающий код не может переопределить ByVal механизм.
по умолчанию в Visual Basic передаются аргументы по значению.
Когда следует передавать аргумент по значению
Если вызывающий элемент кода, лежащий в основе аргумента, является неизменяемым элементом, объявите соответствующий параметр ByVal. Код не может изменять значение неизменяемого элемента.
Когда следует передавать аргумент по ссылке
Если процедуре требуется подлинное изменение базового элемента в вызывающем коде, объявите соответствующий параметр ByRef.
Пример
Описание
Процедуры «Function» и «Sub» в VBA
Встроенные функции VBA
Перед тем, как приступить к созданию собственных функций VBA, полезно знать, что Excel VBA располагает обширной коллекцией готовых встроенных функций, которые можно использовать при написании кода.
Список этих функций можно посмотреть в редакторе VBA:
Кроме того, полный список встроенных функций 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 в объявлении процедуры можно задать, каким именно способом аргумент передаётся процедуре. Ниже это показано на примерах:
Помните, что аргументы в VBA по умолчанию передаются по ссылке. Иначе говоря, если не использованы ключевые слова ByVal или ByRef, то аргумент будет передан по ссылке.
Перед тем как продолжить изучение процедур Function и Sub более подробно, будет полезным ещё раз взглянуть на особенности и отличия этих двух типов процедур. Далее приведены краткие обсуждения процедур VBA Function и Sub и показаны простые примеры.
VBA процедура «Function»
Редактор VBA распознаёт процедуру Function, когда встречает группу команд, заключённую между вот такими открывающим и закрывающим операторами:
Как упоминалось ранее, процедура Function в VBA (в отличие от Sub), возвращает значение. Для возвращаемых значений действуют следующие правила:
Это отлично проиллюстрировано в следующем примере.
Пример 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. Следовательно, созданную в предыдущем примере процедуру Function – SumMinus можно вызвать, введя в ячейку рабочего листа вот такое выражение:
VBA процедура «Sub»
Редактор VBA понимает, что перед ним процедура Sub, когда встречает группу команд, заключённую между вот такими открывающим и закрывающим операторами:
VBA процедура «Sub»: Пример 1. Выравнивание по центру и изменение размера шрифта в выделенном диапазоне ячеек
Рассмотрим пример простой VBA процедуры Sub, задача которой – изменить форматирование выделенного диапазона ячеек. В ячейках устанавливается выравнивание по центру (и по вертикали, и по горизонтали) и размер шрифта изменяется на заданный пользователем:
Данная процедура 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, доступную из рабочего листа:
Чтобы выполнять процедуру Sub быстро и легко, можно назначить для неё комбинацию клавиш. Для этого:
Внимание: Назначая сочетание клавиш для макроса, убедитесь, что оно не используется, как стандартное в Excel (например, Ctrl+C). Если выбрать уже существующее сочетание клавиш, то оно будет переназначено макросу, и в результате пользователь может запустить выполнение макроса случайно.
Область действия процедуры VBA
В части 2 данного самоучителя обсуждалась тема области действия переменных и констант и роль ключевых слов Public и Private. Эти ключевые слова так же можно использовать применительно к VBA процедурам:
Помните о том, что если перед объявлением VBA процедуры Function или Sub ключевое слово не вставлено, то по умолчанию для процедуры устанавливается свойство Public (то есть она будет доступна везде в данном проекте VBA). В этом состоит отличие от объявления переменных, которые по умолчанию бывают Private.
Ранний выход из VBA процедур «Function» и «Sub»
Если нужно завершить выполнение VBA процедуры Function или Sub, не дожидаясь её естественного финала, то для этого существуют операторы Exit Function и Exit Sub. Применение этих операторов показано ниже на примере простой процедуры Function, в которой ожидается получение положительного аргумента для выполнения дальнейших операций. Если процедуре передано не положительное значение, то дальнейшие операции не могут быть выполнены, поэтому пользователю должно быть показано сообщение об ошибке и процедура должна быть тут же завершена:
Обратите внимание, что перед тем, как завершить выполнение процедуры Function – VAT_Amount, в код вставлена встроенная VBA функция MsgBox, которая показывает пользователю всплывающее окно с предупреждением.
Оператор Function (Visual Basic)
Объявляет имя, параметры и код, определяющие Function процедуру.
Синтаксис
Компоненты
Необязательный элемент. См. список атрибутов.
Необязательный элемент. Может применяться один из перечисленных ниже типов.
Необязательный элемент. Может применяться один из перечисленных ниже типов.
Необязательный элемент. См. раздел Shared.
Необязательный элемент. См. раздел Shadows.
Необязательный элемент. См. статью Async.
Необязательный элемент. См. итератор.
Обязательный элемент. Имя процедуры. См. раздел Declared Element Names.
Необязательный элемент. Список параметров типа для универсальной процедуры. См. список типов.
Необязательный элемент. Список имен локальных переменных, представляющих параметры этой процедуры. См. список параметров.
Необязательный элемент. Указывает, что эта процедура реализует одну или несколько Function процедур, каждая из которых определена в интерфейсе, реализованном классом или структурой этой процедуры. См. инструкцию Implements.
Каждый элемент implementedprocedure имеет перечисленные ниже синтаксис и компоненты.
Необязательный элемент. Указывает, что эта процедура может управлять одним или несколькими конкретными событиями. См. раздел Handles.
Каждый элемент eventspecifier имеет перечисленные ниже синтаксис и компоненты.
| Часть | Описание |
|---|---|
| eventvariable | Обязательный элемент. Объектная переменная, объявленная с типом данных класса или структуры, которая вызывает событие. |
| event | Обязательный элемент. Имя события, обрабатываемого этой процедурой. |
Необязательный элемент. Блок инструкций для выполнения в рамках этой процедуры.
Завершает определение этой процедуры.
Комментарии
Весь исполняемый код должен находиться внутри процедуры. Каждая процедура, в свою очередь, объявляется в классе, структуре или модуле, который называется содержащим классом, структурой или модулем.
Чтобы вернуть значение в вызывающий код, используйте Function процедуру; в противном случае используйте Sub процедуру.
Определение функции
Процедуру можно определить Function только на уровне модуля. Таким образом, контекст объявления для функции должен быть классом, структурой, модулем или интерфейсом и не может быть исходным файлом, пространством имен, процедурой или блоком. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.
Function процедуры по умолчанию имеют открытый доступ. Уровни доступа можно изменить с помощью модификаторов доступа.
Лямбда-выражения можно использовать для определения выражений функций встроенным. Дополнительные сведения см. в разделе выражение функции и лямбда-выражения.
Возврат из функции
Когда Function процедура возвращается в вызывающий код, выполнение переходит к инструкции, следующей за инструкцией, вызвавшей процедуру.
Чтобы вернуть значение из функции, можно либо присвоить значение имени функции, либо включить его в Return инструкцию.
Return Оператор одновременно назначает возвращаемое значение и завершает функцию, как показано в следующем примере.
Exit Function Операторы и Return вызывают немедленный выход из Function процедуры. Любое количество Exit Function инструкций и Return может использоваться в любом месте процедуры, и можно смешивать Exit Function Return операторы и.
Вызов функции
Процедура вызывается с Function использованием имени процедуры, за которым следует список аргументов в выражении в круглых скобках. Скобки можно опустить, только если вы не предоставляете никаких аргументов. Однако код является более удобочитаемым, если всегда включать круглые скобки.
Функцию можно также вызвать с помощью Call ключевого слова. В этом случае возвращаемое значение игнорируется. Call В большинстве случаев использование ключевого слова не рекомендуется. Дополнительные сведения см. в разделе оператор Call.
Visual Basic иногда переупорядочивает арифметические выражения для повышения внутренней эффективности. По этой причине не следует использовать Function процедуру в арифметическом выражении, если функция изменяет значение переменных в том же выражении.
Асинхронные функции
Функция Async позволяет вызывать асинхронные функции без использования явных обратных вызовов или вручную разделять код между несколькими функциями или лямбда-выражениями.
Async Процедура возвращается к вызывающему объекту, когда он встречает первый ожидающий объект, который еще не завершен, или на конец процедуры, в зависимости от того, что Async происходит раньше.
Оператор подвыражения также может быть помечен Async модификатором. Это в основном используется для обработчиков событий, где значение не может быть возвращено. Async Sub Процедуру нельзя ожидать, и вызывающая Async Sub процедура не может перехватывать исключения, создаваемые Sub процедурой.
Функции итератора
Функция итератора выполняет настраиваемую итерацию для коллекции, например списка или массива. Функция итератора использует оператор yield для возвращения каждого элемента по одному за раз. При достижении оператора yield текущее расположение в коде запоминается. При следующем вызове функции итератора выполнение возобновляется с этого места.
Итератор вызывается из клиентского кода с помощью метода For Each. Следующий оператор.
Дополнительные сведения см. в разделе Итераторы.
Пример 1
В следующем примере оператор используется Function для объявления имени, параметров и кода, образующих тело Function процедуры. ParamArray Модификатор позволяет функции принимать переменное число аргументов.
Пример 2
В следующем примере вызывается функция, объявленная в предыдущем примере.






