Vba excel передает параметры процедуре
Обновлено: 21.11.2024
Аргументы и параметры
Локальные и глобальные переменные
Мы знаем, что вы можете объявить глобальную переменную вне какой-либо процедуры. При использовании различных процедур в модуле одной из характеристик глобальной переменной является то, что она автоматически доступна для других процедур:
- Частная: к частной глобальной переменной может обращаться любая процедура того же модуля. Ни одна процедура другого модуля, даже той же программы, не может получить к нему доступ
- Общедоступная: к общедоступной глобальной переменной может обращаться любая процедура ее модуля и любая процедура другого модуля.
Основываясь на этой характеристике процедур модуля, имеющего доступ к глобальным переменным того же модуля, вы можете объявлять такие переменные и инициализировать или изменять их в любой процедуре того же файла кода.
Обзор локальных и глобальных переменных
Вот пример:
Введение в аргументы
До сих пор, чтобы использовать значение в процедуре, нам приходилось его объявлять. В некоторых случаях процедуре может потребоваться внешнее значение для выполнения своего назначения. Значение, передаваемое процедуре, называется аргументом.
При создании процедуры, которая будет использовать внешнее значение, объявите аргумент, представляющий это значение, в скобках процедуры. Для подпроцедуры вы должны использовать следующий синтаксис:
Если вы создаете функцию, синтаксис будет таким:
Аргумент должен быть объявлен как обычная переменная без ключевого слова Dim. Вот пример создания функции, которая принимает строку в качестве аргумента:
В то время как одна процедура может принимать один аргумент, другая процедура может принимать более одного аргумента. В этом случае в скобках процедуры разделите аргументы запятой. Вот пример подпроцедуры, которая принимает два аргумента:
В теле процедуры, которая принимает один или несколько аргументов, используйте аргумент(ы) по своему усмотрению, как если бы они были локально объявленными переменными. Например, вы можете задействовать их со значениями внутри процедуры. Вы также можете использовать исключительно значения аргументов для выполнения назначения.
Практическое обучение: создание функции с аргументами
Вызов процедуры с аргументом
Значение аргумента также называется параметром. Чтобы вызвать процедуру, которая принимает аргумент, введите ее имя. Затем у вас есть различные варианты доступа к его аргументам.
Ранее мы видели, что для вызова процедуры можно просто использовать ее имя. После имени процедуры вы можете ввести открывающую скобку "(", за которой следует имя аргумента, затем = и значение аргумента. Если процедура принимает более одного аргумента, разделите их запятыми. Вот пример:
Как упоминалось ранее, вы также можете использовать ключевое слово Call для вызова процедуры.
При вызове процедуры, которая принимает более одного аргумента, вы должны указать значения аргументов в том порядке, в котором они перечислены в круглых скобках. К счастью, вам не нужно. Если вы знаете имена аргументов, вы можете ввести их в любом порядке и указать значение для каждого. Для этого в скобках вызываемой процедуры введите имя аргумента, значение которого вы хотите указать, затем оператор := и желаемое значение аргумента. Вот пример:
Приведенный выше метод использования круглых скобок, который мы только что видели, действителен для подпроцедур и функций. Если вызываемая процедура является подпрограммой, скобки можно опустить. При вызове подпроцедуры после имени процедуры ставится пробел, после которого следует имя аргумента, которому присваивается нужное значение. Вот пример:
Если подпроцедура принимает более одного аргумента, разделите их запятыми.
Практическое обучение: вызов процедуры с аргументом
- В Microsoft Excel щелкните любое поле.
- Чтобы вызвать созданную нами функцию, введите =C и обратите внимание на предлагаемый список функций:
Передача аргументов по значению
При вызове процедуры, которая принимает аргумент, мы указывали значение этого аргумента. Когда это сделано, вызываемая процедура создает копию значения аргумента и делает эту копию доступной для вызывающей процедуры. Таким образом, сам аргумент не будет доступен. Это называется передачей аргумента по значению. Чтобы показать это, введите ключевое слово ByVal слева от аргумента. Вот примеры:
Если вы создаете процедуру, которая принимает аргумент по значению, и вы использовали ключевое слово ByVal для аргумента, при вызове процедуры вам не нужно использовать ключевое слово ByVal; достаточно только имени аргумента, как это делалось в примерах с аргументами до сих пор. Вот пример:
Практическое обучение: передача аргументов по значению
- Чтобы указать, что аргументы передаются по значению, измените функции следующим образом:
- Чтобы вернуться в Microsoft Excel, на панели инструментов нажмите кнопку "Просмотреть Microsoft Excel".
Передача аргументов по ссылке
Альтернативой передаче аргументов, как это делалось до сих пор, является передача адреса аргумента вызываемой процедуре. При этом вызываемая процедура не получает простой копии значения аргумента: доступ к аргументу осуществляется по его адресу; то есть по его адресу памяти. С помощью этого метода любое действие, выполняемое над аргументом, будет сохранено аргументом после завершения процедуры. Если значение аргумента изменено, аргумент теперь будет иметь новое значение, отбрасывая или теряя исходное значение, которое у него было. Этот метод называется передачей аргумента по ссылке. Рассмотрим следующий код:
При запуске процедуры Exercise() объявляется переменная с именем Number, и ее значение устанавливается равным 0 (значение по умолчанию для вновь объявленной переменной Double). Когда вызывается переменная ShowResult, она присваивает значение переменной, но, поскольку переменная объявлена по значению, при выходе из процедуры переменная возвращается со своим исходным значением, которое было равно 0. В результате, когда этот код запускается , переменная Number сохраняет свое значение 0.
Если вы хотите, чтобы процедура изменяла значение аргумента, вы можете передать аргумент по ссылке. Чтобы передать аргумент по ссылке, слева введите ключевое слово ByRef. Это делается только при создании процедуры. При вызове процедуры не включайте ключевое слово ByRef. Когда вызываемая процедура завершает работу с аргументом, аргумент сохраняет все изменения, внесенные в его значение. Теперь рассмотрим ту же программу, что и выше, но с аргументами, переданными по ссылке:
При запуске процедуры Exercise() объявляется переменная Number, и ее значение устанавливается равным 0. Когда вызывается переменная ShowResult, она присваивает значение переменной. Поскольку переменная объявлена по ссылке, при выходе из процедуры переменная возвращается с новым значением, которое ей было присвоено. В результате при выполнении этого кода переменная Number получает новое значение.
С помощью этой техники вы можете передавать столько аргументов по ссылке и столько аргументов по значению, сколько хотите. Как вы уже догадались, этот метод можно использовать для того, чтобы подпрограмма возвращала значение, чего не может сделать обычная подпрограмма. Кроме того, передача аргументов по ссылке позволяет процедуре возвращать как можно больше значений, в то время как обычная функция может возвращать только одно значение.
При вызове процедуры после ее имени следует список аргументов в скобках. Вы предоставляете аргумент, соответствующий каждому обязательному параметру, определяемому процедурой, и вы можете дополнительно указать аргументы для необязательных параметров. Если вы не указываете необязательный параметр в вызове, вы должны поставить запятую, чтобы отметить его место в списке аргументов, если вы предоставляете какие-либо последующие аргументы.
Если вы собираетесь передать аргумент с типом данных, отличным от типа соответствующего параметра, например Byte to String , можно установить для переключателя проверки типа (Option Strict Statement) значение Off . Если для параметра Option Strict установлено значение On , вы должны использовать либо расширяющие конверсии, либо ключевые слова с явными конверсиями. Дополнительные сведения см. в разделах Расширение и сужение преобразования и Функции преобразования типов.
Чтобы передать один или несколько аргументов в процедуру
В операторе вызова после имени процедуры следует круглые скобки.
В скобках укажите список аргументов. Включите аргумент для каждого обязательного параметра, определяемого процедурой, и разделите аргументы запятыми.
Убедитесь, что каждый аргумент является допустимым выражением, результатом вычисления которого является тип данных, преобразуемый в тип, определенный процедурой для соответствующего параметра.
Если параметр определен как необязательный, его можно либо включить в список аргументов, либо опустить. Если его не указать, процедура использует значение по умолчанию, определенное для этого параметра.
Если вы опустите аргумент для необязательного параметра, а после него в списке параметров есть другой параметр, вы можете отметить место пропущенного аргумента дополнительной запятой в списке аргументов.
В следующем примере вызывается функция Visual Basic MsgBox.
В предыдущем примере указан обязательный первый аргумент, представляющий собой отображаемую строку сообщения. В нем отсутствует аргумент для необязательного второго параметра, который определяет кнопки, отображаемые в окне сообщения. Поскольку вызов не предоставляет значение, MsgBox использует значение по умолчанию, MsgBoxStyle.OKOnly , которое отображает только кнопку OK.
Вторая запятая в списке аргументов отмечает место пропущенного второго аргумента, а последняя строка передается в необязательный третий параметр MsgBox , который представляет собой текст, отображаемый в строке заголовка.
Код внутри подпрограммы или функции часто нуждается в передаче информации.
Эту информацию можно определить, добавив в объявление параметры, позволяющие передавать аргументы.
Когда переменная передается в подпрограммы или функции оно называется аргументом.
Значение, используемое вместо параметра при вызове процедуры, называется аргументом.
Пустые скобки
Если у вас есть пустые круглые скобки в конце подпрограммы или функции, это означает, что никакие переменные не могут быть переданы.
ByVal или ByRef
VBA позволяет передавать переменные в подпрограммы и функции двумя способами.
Вы можете указать либо ByVal, либо ByRef для каждой из передаваемых переменных.
Различие ByVal и ByRef для подпрограмм и параметры функции очень важно сделать.
В VBA все объекты передаются по ссылке.
ByRef - передается адрес к объекту.
ByVal - передается копия адреса на объект.
Объявление их типа данных
Процедуры, использующие аргументы, всегда должны определять тип данных этих аргументов и не оставлять их пустыми.
Если тип данных не объявляется, все аргументы имеют тип данных Variant.
Важно, чтобы данные, которые передаются в качестве аргумента, соответствовали типу данных, определенному для этого аргумента.
Вы получите ошибку несоответствия типа, если какой-либо из аргументов не соответствует соответствующему типу данных. р>
Возврат нескольких переменных
Функция может возвращать только одно значение, однако вы можете использовать переменную ByRef как способ передачи другого фрагмента информации вызывающей процедуре.
Вы даже можете использовать аргумент ByRef для возврата значения из подпрограмма.
Важно
Существует один недостаток использования ByVal: в некоторых ситуациях может потребоваться много памяти (и времени) для создания копии (или дубликата) аргумента, а не просто для передачи ссылки.
Это только применимо к большим объектам.
Когда внешнее значение должно использоваться процедурой для выполнения действия, оно передается процедуре через переменные. Эти переменные, которые передаются процедуре, называются аргументами. Аргумент — это значение, передаваемое вызывающим кодом процедуре при ее вызове. Когда набор круглых скобок после имени процедуры в операторе объявления Sub или Function пуст, это случай, когда процедура не получает аргументов. Однако когда аргументы передаются процедуре из других процедур, они перечисляются или объявляются в круглых скобках.
Типы данных аргументов
Обычно объявляется тип данных для аргументов, передаваемых процедуре, и, если он не указан, типом данных по умолчанию является вариант.
Пример 1
Функция Grade(Marks As Integer) As String
'Объявление функции Grade содержит одну переменную в качестве аргумента со строкой в качестве возвращаемого типа данных.
Если баллов >= 80, то
ИначеЕсли Метки >= 60 Тогда
ИначеЕсли Метки >= 40 Тогда
Завершить функцию
Подсистема callGrade()
Размерьте i как целое число
Размерьте строку как строку
i = InputBox("Введите оценки Питера")
'вызов функции Grade, и результат присваивается локальной переменной str:
str = Grade(i)
MsgBox "У Питера оценка " & str
Конец подписки
Пример 2
Функция markersPercent(Marks As Integer, TotalMarks As Integer) As Double
'Объявление функции markersPercent содержит две переменные в качестве аргументов с типом возвращаемых данных Double.
Завершить функцию
Sub callMarksGrades()
Затемнить метки как целое
Затемнить TotalMarks как целое
Затемнить dPcnt как двойное
Marks = InputBox("Введите баллы")
TotalMarks = InputBox("Введите все баллы")
'вызов функции markersPercent, и результат присваивается локальной переменной dPcnt:
dPcnt = markersPercent(Marks, TotalMarks)
MsgBox "Процент равен " & dPcnt & "%"
Конец подписки
Передача аргументов по значению
Когда вы передаете аргумент по значению в процедуре, передается только копия переменной, и любое изменение значения переменной в текущей процедуре не повлияет и не изменит переменную в ее исходном местоположении, поскольку сама переменная не доступен. Чтобы передать аргумент по значению, используйте ключевое слово ByVal перед аргументом слева от него.
Пример 3
Function calculateCommission(ByVal commRate As Double, ByVal Sales As Currency) As Currency
'Передача аргумента по значению в процедуре с использованием ключевого слова ByVal
'Объявление функции calculateCommission содержит две переменные как аргументы с валютой в качестве типа возвращаемых данных.
computeCommission = commRate * Sales
Завершить функцию
СубпродавецПитер()
Dim commPeter As Currency
Dim commPeter As Double
Dim Sales As Currency
commRate = InputBox("Введите комиссионную ставку")
Sales = InputBox("Введите сумму продаж")
'вызовите функцию calculateCommission, и результат будет присвоен локальной переменной:
commPeter = calculateCommission(commRate, Sales)
MsgBox "Комиссия Питера $" & commPeter
Конец подписки
Передача аргументов по ссылке
Когда вы передаете аргумент по ссылке в процедуре, процедура обращается к самой переменной по ее местоположению или адресу в памяти. В этом случае значение переменной постоянно изменяется процедурой. Чтобы передать аргумент по ссылке, используйте ключевое слово ByRef перед аргументом слева от него. Передача аргументов по ссылке также используется по умолчанию в vba, если вы явно не укажете передачу аргумента по значению.
Пример 4. Сравнение передачи аргументов по значению (пример 4а) и передачи аргументов по ссылке (пример 4б)
Пример 4a. Передача аргумента по значению в процедуру с использованием ключевого слова ByVal.
Номер функции (ByVal i As Integer) As Long
'Передача аргумента по значению в процедуре с использованием ключевого слова ByVal
Завершить функцию
Подпункт chkNumber()
'значение переменной n устанавливается равным 0 при ее объявлении:
Dim n As Integer
'возвращенное сообщение равно 5.
'здесь вызывается числовая функция, которая присваивает значение переменной n. Поскольку переменная была передана по значению в функции, любое изменение значения переменной происходит только в текущей функции, и после завершения функции значение переменной n вернется к значению, когда оно было объявлено, где оно было установлено. 0. Если бы переменная была передана по ссылке в функцию, то переменная n навсегда приняла бы новое присвоенное значение.
Номер MsgBox(n)
Возвращенное сообщение равно 0, потому что после завершения числовой функции значение переменной n возвращается к значению, когда оно было объявлено, где оно было установлено равным 0:
MsgBox n
Конец подписки
Пример 4b. Передача аргумента по ссылке в процедуре с использованием ключевого слова ByRef
Функция номер1(ByRef i As Integer) As Long
'Передача аргумента по ссылке в процедуре с использованием ключевого слова ByRef
Завершить функцию
Подпункт chkNumber1()
'значение переменной n устанавливается равным 0 при ее объявлении:
Dim n As Integer
Возвращенное сообщение равно 5, потому что при вызове функции number1 переменной n присваивается значение:
MsgBox number1(n)
Возвращенное сообщение равно 5, потому что переменная была передана по ссылке в функцию number1, а переменная n навсегда приняла новое назначенное значение, вызвав функцию number1 в предыдущей строке кода:
MsgBox п
Конец подписки
Необязательные аргументы
Аргументы можно указывать как необязательные, используя ключевое слово «необязательный» перед аргументом слева от него. Когда вы указываете аргумент как необязательный, все остальные аргументы, следующие за этим аргументом справа от него, также должны быть указаны как необязательные. Обратите внимание, что указание ключевого слова Optional делает аргумент необязательным, иначе он потребуется.
Необязательный аргумент должен быть (хотя и не обязательно) объявлен как тип данных Variant, чтобы можно было использовать функцию IsMissing, которая работает только при использовании с переменными, объявленными как тип данных Variant. Функция IsMissing используется для определения того, был ли передан необязательный аргумент в процедуру или нет, и затем вы можете соответствующим образом изменить свой код, не возвращая ошибку. Если необязательный аргумент не объявлен как Variant, и в этом случае функция IsMissing не будет работать, необязательному аргументу будет присвоено значение по умолчанию для его типа данных, которое равно 0 для переменных числового типа данных (а именно, Integer, Double и т. д.) и Ничего (нулевая ссылка) для переменных типа данных String или Object.
Пример 5 — объявление подпроцедуры содержит два аргумента, оба указаны как необязательные.
Sub employeeName1 (необязательное имя в виде строки, необязательное второе имя в виде строки)
'Объявление подпроцедуры содержит два аргумента, оба указаны как необязательные.
ActiveSheet.Range("A1") = firstName
ActiveSheet.Range("B1") = secondName
Конец подписки
Подпрограмма getFullName1()
Затемнить strName1 как строку
Затемнить strName2 как строку
strName1 = InputBox("Введите имя")
strName2 = InputBox("Введите второе имя")
Позвонить employeeName1(strName1, strName2)
Конец подписки
Пример 6. Объявите необязательный аргумент как строку без использования функции IsMissing.
Sub employeeName2(firstName As String, Optional secondName As String)
'Объявление подпроцедуры содержит два аргумента, второй аргумент указывается как необязательный. Обратите внимание, что в этом примере, поскольку необязательный аргумент объявлен как строка и не передается в процедуру, Range("B1") будет содержать нулевую ссылку (ничего) после выполнения подпроцедуры, поскольку необязательный аргумент будет назначен по умолчанию значение для его типа данных (String), которое равно Nothing (нулевая ссылка). Если необязательный аргумент объявлен как целое число, Range("B1") будет содержать ноль после выполнения подпроцедуры, поскольку необязательному аргументу будет присвоено значение по умолчанию для его типа данных (целое число), которое равно нулю.
ActiveSheet.Range("A1") = firstName
ActiveSheet.Range("B1") = secondName
Конец подписки
Подпрограмма getFullName2()
Затемнить strName1 как строку
strName1 = InputBox("Введите имя")
Конец подписки
Пример 7. Объявите необязательный аргумент как тип данных Variant и используйте функцию IsMissing.
Подразделение1(первое число как целое, необязательное второе число как вариант)
'Объявление подпроцедуры содержит два аргумента, второй аргумент указан как необязательный. Необязательный аргумент должен быть (хотя и не обязательно) объявлен как тип данных Variant, чтобы разрешить использование функции IsMissing, которая работает только при использовании с переменными, объявленными как тип данных Variant. Функция IsMissing используется для определения того, был ли передан необязательный аргумент в процедуру или нет, и затем вы можете соответствующим образом изменить свой код, не возвращая ошибку.
Затемнить dResult как двойной
Если IsMissing(secondNumber), то
dResult = первое число / второе число
Конец подписки
Подпрограмма getDivide1()
Затемнить iNumber1 как целое
iNumber1 = InputBox("Введите первое число")
Конец подписки
Пример 8. Объявите необязательный аргумент как целое число, но функция IsMissing не будет работать, и код вернет ошибку.
Подразделение2(firstNumber As Integer, Optional secondNumber As Integer)
'Объявление подпроцедуры содержит два аргумента, второй аргумент указан как Optional. Необязательный аргумент объявлен как Integer, но функция IsMissing не будет работать с переменной, которая не объявлена как тип данных Variant. Следовательно, необязательному аргументу будет присвоено значение по умолчанию для его типа данных, которое равно 0 для числовых типов данных, и код вернет ошибку: Ошибка времени выполнения "11": деление на ноль.
Затемнить dResult как двойной
Если IsMissing(secondNumber), то
dResult = первое число / второе число
Конец подписки
Подпрограмма getDivide2()
Затемнить iNumber1 как целое
iNumber1 = InputBox("Введите первое число")
Конец подписки
Пример 9. Объявите необязательный аргумент как строку, но функция IsMissing не будет работать, и код вернет ошибку.
Подразделение3(firstNumber As Integer, Optional secondNumber As String)
'Объявление подпроцедуры содержит два аргумента, второй аргумент указан как Optional. Необязательный аргумент объявлен как String, но функция IsMissing не будет работать с переменной, которая не объявлена как тип данных Variant. Следовательно, необязательному аргументу будет присвоено значение по умолчанию для его типа данных, которое равно Nothing (пустая ссылка) для типа данных String, и код вернет ошибку: Ошибка времени выполнения "13": несоответствие типов.
Затемнить dResult как двойной
Если IsMissing(secondNumber), то
dResult = первое число / второе число
Конец подписки
Подпрограмма getDivide3()
Затемнить iNumber1 как целое
iNumber1 = InputBox("Введите первое число")
Конец подписки
Указание значения по умолчанию для необязательного аргумента
Вы можете указать значение по умолчанию для Необязательный аргумент, который будет использоваться, если Необязательный аргумент не передается в процедуру. Таким образом, вы можете объявить необязательные аргументы любого типа данных и указать значение по умолчанию, которое будет использоваться, если необязательный аргумент опущен, избегая использования функции IsMissing, которая работает только с типом данных Variant.
Пример 10. Если в процедуре не передается необязательный аргумент, используется значение по умолчанию.
Подразделение(firstNumb As Integer, Optional secondNumb As Integer = 3)
'Объявление подпроцедуры содержит два аргумента, второй аргумент указан как Optional.Если второй аргумент, являющийся необязательным, не передается в процедуру, то указывается и используется значение по умолчанию:
Затемнить dResult как двойной
Конец подписки
Подпрограмма getCalculation3()
Затемнить iNumber1 как целое
iNumber1 = InputBox("Введите первое число")
Конец подписки
Передача произвольного или неопределенного количества аргументов — массивы параметров (ParamArray)
Выше мы объяснили, как объявлять процедуры, передавая аргументы, включая необязательные аргументы, но, тем не менее, вы ограничены фиксированным числом аргументов, объявленным в процедуре. Используя ключевое слово ParamArray, вам будет разрешено передавать процедуре произвольное количество аргументов, так что процедура будет принимать неопределенное количество аргументов или вообще не принимать аргументов. Используйте ParamArray, если вы не уверены в точном количестве аргументов, которые необходимо передать процедуре во время ее определения. Может быть удобнее создать необязательный массив (например, ParamArray), чем мучиться с объявлением большого количества необязательных аргументов, а затем использовать функцию IsMissing с каждым из них.
Процедура использует информацию в виде переменных, констант и выражений для выполнения действий всякий раз, когда она вызывается. Объявление процедуры определяет параметр, который позволяет вызывающему коду (коду, вызывающему процедуру) передавать аргумент или значение этому параметру, чтобы каждый раз при вызове процедуры вызывающий код мог передавать другой аргумент одному и тому же параметру. Параметр объявляется как переменная, указав его имя и тип данных. Объявив массив параметров, процедура может принять массив значений параметра. Массив параметров определяется с помощью ключевого слова ParamArray.
В процедуре может быть определен только один ParamArray, и это всегда последний параметр в списке параметров. ParamArray является необязательным параметром и может быть единственным необязательным параметром в процедуре, и все предшествующие ему параметры должны быть обязательными. ParamArray должен быть объявлен как массив данных типа Variant. Независимо от настройки Option Base для модуля, LBound массива ParamArray всегда будет равен 0, т.е. значения индекса для массива будут начинаться с 0. Ключевые слова ByVal, ByRef или Optional нельзя использовать с ParamArray.
Определить процедуру для приема неопределенного количества аргументов или значений, т.е. массив параметров: Используйте ключевое слово ParamArray перед именем параметра, который должен быть последним параметром в объявлении процедуры. Пустая пара круглых скобок должна следовать за именем массива параметров, который должен быть объявлен как тип данных Variant с обычным предложением As. Не указывайте значение по умолчанию после предложения As.
Чтобы получить доступ к значению массива параметров: используйте функцию UBound, чтобы определить длину массива, которая даст вам количество элементов или значений индекса в массиве. В коде процедуры вы можете получить доступ к значению массива параметров, введя имя массива, за которым следует значение индекса (которое должно быть между 0 и значением UBound) в круглых скобках
Пример 11. Передайте процедуре произвольное количество аргументов с помощью параметра ParamArray.
Sub addNums(ParamArray numbers() As Variant)
'объявление процедуры, которое позволяет передать процедуре произвольное количество аргументов, используя параметр ParamArray.
Dim lSum As Long
Dim i As Long
lSum = lSum + числа(i)
Конец подписки
Подпрограмма getAddNums()
'вы можете передать произвольное или неопределенное количество аргументов в процедуру, используя ParamArray:
Вызовите addNums(22, 25, 30, 40, 55)
Конец подписки
Пример 12. Требуется один аргумент, а затем разрешить передачу произвольного количества аргументов в процедуру с использованием параметра ParamArray.
Sub calcComm(comm As Double, ParamArray sales() As Variant)
'объявление процедуры с одним обязательным аргументом (comm), а затем позволяет передать процедуре произвольное количество аргументов, используя параметр ParamArray.
Dim dTotalComm As Double
Dim v As Variant
dTotalComm = dTotalComm + comm * v
Конец подписки
Подпрограмма getComm()
Тусклый как двойной
'вы можете передать произвольное или неопределенное количество аргументов в процедуру, используя ParamArray:
Вызовите calcComm(d, 100, 200, 300)
Конец подписки
Пример 13. Требуются два аргумента, а затем можно передать процедуре произвольное количество аргументов с помощью параметра ParamArray.
Sub avgMarksGrades(student As String, avg As Double, ParamArraymarks() As Variant)
'объявление процедуры с двумя обязательными аргументами (student и avg), а затем позволяет передать произвольное количество аргументов в процедура с использованием параметра ParamArray.
Dim v As Variant, vSum as variant
Dim strGrade As String
Dim strAllGrades As String
Для каждой отметки v In
ИначеЕсли v >= 60 Тогда
ИначеЕсли v >= 40 Тогда
Если Len(strAllGrades) = 0, То
strAllGrades = strAllGrades & ", " & strGrade
Для каждой отметки v In
i = i + 1
vSum = vSum + v
avg = vSum / i
Студент MsgBox & " имеет оценки " & strAllGrades & " и средние оценки " & avg
Конец подписки
Sub getAvgMarksGrades()
Dim strName As String
Dim dAverage As Double
'вы можете передать произвольное или неопределенное количество аргументов в процедуру, используя ParamArray:
Call avgMarksGrades(strName, dAverage, 80, 45, 65)
Читайте также: