vba excel byval что это

VBA-Урок 9. Процедуры и функции

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

Запуск процедуры с середины другой процедуры

Чтобы выполнить процедуру с середины другой процедуры, просто введите ее название.

Здесь есть очень простой пример:

Аргументы

Аргументы делают возможным использование значений из процедуры в под-процедуры (запомните, что по умолчанию, переменные являются доступны только по той процедуры, в которой они были объявлены).

К процедуре «warning» был добавлен аргумент, в данном случае это переменная «var_text» с типом «String» (строка):

Эта процедура требует аргумент, поэтому мы должны поставить значение после «warning», чтобы выполнить ее:

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

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

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

Теперь эта процедура может быть выполнена с или без опционального аргумента, как здесь:

Аргументы должны быть введены в правильном порядке.

Здесь есть пример, который использует два фрагмента кода, которые рассматривались выше:

См. рисунок ниже (пример 1):

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

Ниже вы можете увидеть как предыдущий код и ByVal работают:

Функции

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

Вот простой пример:

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

Например, чтобы получить квадрат значения, которое введенное в ячейку A1:

Источник

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

Различия

При передаче аргумента в процедуру следует учитывать несколько различных различий, взаимодействующих друг с другом:

Является ли базовый программный элемент изменяемым или неизменяемым

Является ли сам аргумент изменяемым или неизменяемым

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

Является ли тип данных аргумента типом значения или ссылочным типом

Возможность выбора механизма передачи

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

Для ссылочных типов копируются только указатель на данные (четыре байта на 32-разрядных платформах, восемь байт на 64-разрядных платформах). Таким образом, можно передавать аргументы типа String или Object по значению без ущерба для производительности.

Определение механизма передачи

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

по умолчанию в Visual Basic передаются аргументы по значению.

Когда следует передавать аргумент по значению

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

Когда следует передавать аргумент по ссылке

Если процедуре требуется подлинное изменение базового элемента в вызывающем коде, объявите соответствующий параметр ByRef.

Пример

Описание

Источник

Необязательные параметры (Visual Basic)

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

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

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

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

Ниже приведен синтаксис объявления процедуры с необязательным параметром:

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

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

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

Определение наличия необязательного аргумента

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

Читайте также:  береги его как зеницу ока что значит

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

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

Источник

Оператор Function

Объявляет имя, аргументыи код, которые формируют тело процедуры Function.

Синтаксис

[Общедоступный | Private | Друг] [ Статическое ] Имя функции [( arglist ) ] [ Как тип ]
[заявления]
[ имя = выражение ]
[ Функция выхода]
[заявления]
[ имя = выражение ]
End Function

Синтаксис оператора Function содержит такие части:

Part Описание
Public Необязательное. Указывает на то, что процедура Function доступна для всех других процедур во всех модулях. При использовании в модуле, который содержит Option Private, процедура недоступна вне проекта.
Private Необязательное. Указывает на то, что процедура Function доступна только для других процедур в том модуле, в котором была объявлена.
Friend Необязательное. Используется только в модуле класса. Указывает на то, что процедура Function видима повсюду в проекте, но невидима для контроллера экземпляра объекта.
Static Необязательное. Указывает на то, что локальные переменные процедуры Function сохраняются между вызовами. Атрибут Static не влияет на переменные, которые были объявлены вне Function, даже если они используются в процедуре.
name Обязательный. Название Function; соответствует стандарту соглашений об именовании переменных.
arglist Необязательное. Список переменных, представляющих аргументы, которые передаются в процедуру Function при вызове. В качестве разделителя переменных используется запятая.
type Необязательное. Тип данных значения, возвращаемого процедурой Function; может быть Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (не поддерживается в настоящее время), Date, String (за исключением фиксированной длины), Object, Variant, или любого пользователя определенного типа.
Операторы Необязательное. Любая группа операторов, которая будет выполняться в процедуре Function.
выражение Необязательное. Возвращаемое значение Function.

Аргумент arglist имеет следующий синтаксис и элементы:

[ Необязательный ] [ ByVal | ByRef ] [ ParamArray ] varname [( ) ] [ Как тип ] [ = defaultvalue ]

Part Описание
Необязательное Необязательное. Указывает, что аргумент не является обязательным. При использовании все последующие аргументы в arglist также должны быть необязательными и объявляться с помощью ключевого слова Необязательный. Optional не может использоваться для каких-либо аргументов, если используется ParamArray.
ByVal Необязательное. Указывает, что аргумент передается значением.
ByRef Необязательное. Указывает, что аргумент передается по ссылке. ByRef является значением по умолчанию в Visual Basic.
ParamArray Необязательное. Используется как последний аргумент в arglist, чтобы указать, что последний аргумент является массивом Optional элементов Variant. Ключевое слово ParamArray позволяет предоставлять произвольное число аргументов. Не может использоваться с аргументами ByVal, ByRef или Optional.
varname Обязательный. Имя переменной, представляющее аргумент; соответствует стандарту соглашений об именовании переменных.
type Необязательное. Тип данных аргумента, переданного процедуре; может быть Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается) Дата, Строка (переменная длина), Объект, Вариант, или определенный тип объекта. Если параметр объявлен без ключевого слова Optional, можно также указать тип, определяемый пользователем.
defaultvalue Необязательное. Любая константа или константное выражение. Действительно только для параметров Optional. Если типом является Object, явным значением по умолчанию может быть только Nothing.

Примечания

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

Если не используется static, между вызовами не сохраняется значение локальных переменных.

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

Процедуры Function могут быть рекурсивными, то есть они могут вызывать сами себя для выполнения поставленной задачи. Однако рекурсия может стать причиной переполнения стека. Ключевое слово Static обычно не используется с рекурсивными процедурами Function.

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

Заявление Exit Function вызывает немедленный выход из процедуры Function. Выполнение программы продолжается с оператором, следующим за оператором, который вызвал процедуру Function. В любом месте процедуры Function может появится любое количество операторов Exit Function.

Как и Sub, Function является отдельной процедурой, которая может содержать аргументы, выполнять наборы операторов и изменять значения их аргументов. Однако в отличие от Sub, процедуру Function можно использовать справа от выражения, как и при использовании любой встроенной функции, например Sqr, Cos или Chr, если необходимо использовать значение, возвращенное функцией.

Вы вызываете процедуру Function, используя имя функции, а затем список аргументов в скобки, в выражении. Сведения о том, как вызывать процедуры Function, см. в заявлении Call.

Чтобы вернуть значение функции, присвойте значение названию функции. В любом месте процедуры может появится любое количество таких назначений. Если параметру name не присвоено значение, процедура вернет значение по умолчанию: числовая функция вернет 0, строковая функция вернет строку нулевой длины («»), а функция Variant вернет значение Empty. Функция, которая возвращает объектную ссылку, возвращает значение Nothing, если для параметра name не присвоено ни одной объектной ссылки (с помощью Set) в Function.

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

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

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

В процедуре может использоваться переменная, которая не была явно объявлена в процедуре, но если какой-либо элемент, который был определен на уровне модуля, имеет такое же название, может возникнуть конфликт. Если ваша процедура ссылается на необъявленную переменную, которая называется так же, как и другая процедура, константа или переменная, система посчитает, что ваша процедура ссылается на это название на уровне модуля. Следует явно объявлять переменные, чтобы избежать таких конфликтов. Вы можете использовать заявление Option Explicit для принудительного явного объявления переменных.

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

Пример

В этом примере оператор Function используется для объявления названия, аргументов и кода, которые составляют основной текст процедуры Function. В последнем примере используются фиксированные инициализированные аргументы Optional.

Использование ключевых слов ParamArray позволяет функции принимать переменное число аргументов. В следующем определении он передается по значению.

Необязательные аргументы могут иметь значения по умолчанию и типы, отличные от Variant.

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

3.8.4 Передача параметров

Передача параметров процедурам и функциям в VBA, необязательные (optional) параметры, передача по ссылке (ByRef) и по значению (ByVal), применение ссылок при передаче параметров

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

Function fSum (nItem1 As Integer, nItem2 As Integer)

fSum = nItem1 + nItem2

Вызов ее может выглядеть так:

В данном случае мы объявили оба параметра как обязательные, и поэтому попытка вызвать функцию без передачи ей какого-либо параметра (например, так: MsgBox (fSum(3))) приведет к ошибке «Argument not optional» — «Параметр не является необязательным». Чтобы можно было пропускать какие-то параметры, эти параметры можно сделать необязательными. Для этой цели используется ключевое слово Optional:

Function fSum (nItem1 As Integer, Optional nItem2 As Integer)

В справке по встроенным функциям VBA необязательные параметры заключаются в квадратные скобки.

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

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

Однако здесь есть несколько моментов, которые необходимо рассмотреть.

В нашем примере мы передаем параметры по позиции, то есть значение 3 присваивается первому параметру (nItem1), а значение 2 — второму (nItem2). Однако параметры можно передавать и по имени:

nResult = fSum (nItem 1 := 3, nItem 2 := 2)

Обратите внимание, что несмотря на то, что здесь выполняется вполне привычная операция — присвоение значений, оператор присвоения используется не совсем обычный — двоеточие со знаком равенства, как в C++. При использовании знака равенства возникнет ошибка.

Конечно, вместо явной передачи значений (как у нас — 3 и 2) можно использовать переменные. Однако что произойдет с переменными после того, как они «побывают» в функции, если функция изменяет их значение? Останется ли это значение за пределами функции прежним или изменится?

Все зависит от того, как именно передаются параметры — по ссылке (по умолчанию, можно также использовать ключевое слово ByRef или по значению — нужно использовать ключевое слово ByVal).

Если параметры передаются по ссылке, то фактически в вызываемую процедуру передается ссылка на эту переменную в оперативной памяти. Если эту переменную в вызываемой процедуре изменить, то значение изменится и в вызывающей функции. Это — принятое в VBA поведение по умолчанию.

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

Продемонстрировать разницу можно на простом примере:

Private Sub TestProc ()

‘Объявляем переменную nPar1 и присваиваем ей значение

Dim nPar1 As Integer

‘Передаем ее как параметр nItem1 функции fSum

MsgBox (fSum(nItem1:=nPar1, nItem2:=2))

‘А теперь проверяем, что стало в нашей переменной nPar1, ‘после того, как она побывала в функции fSum:

Function fSum(nItem1 As Integer, nItem2 As Integer)

‘Используем значение переменной

fSum = nItem 1 + nItem 2

Проверьте, что будет, если поменять строку объявления функции

Function fSum(nItem1 As Integer, nItem2 As Integer)

на следующую строку :

Function fSum(byVal nItem1 As Integer, nItem2 As Integer)

Можно продемонстрировать компилятору VBA, что то, что возвращает функция, наш совершенно не интересует. Для этого достаточно не заключать ее параметры в круглые скобки. Например, в случае со встроенной функцией MsgBox это может выглядеть так:

а для нашей функции —

Такой код будет работать совершенно нормально. Однако, если нам потребуется все-таки узнать, что возвращает MsgBox, то придется передаваемые ему параметры заключать в круглые скобки:

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

Источник

Читайте также:  листья огурцов стали светло зелеными чем подкормить
Информ портал о технике и не только