Передача нескольких аргументов в sub - PullRequest
1 голос
/ 27 февраля 2020

После поиска кажется, что никому никогда не нужно передавать 3+ аргумента подпрограмме.

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

Я использовал небольшой взлом, чтобы обойти это в течение многих лет, но задавался вопросом, есть ли лучший способ передать 3+ аргумента в подпрограмму или вызвать функцию void. Пример того, что я в настоящее время делаю:

Private Function Foo(str1 as String, Optional str2 as string = "", Optional str3 as string = "") as Boolean
    [Do something with parameters, like send an email with programmatic parameters 'to', 'body', and 'subject']
End Function

Public Sub Bar()
    Dim dummyVal as Boolean
    [Do something]
    dummyVal = Foo("CustomerX@mail.com","Report [Today's Date]","Hello [Customer Name]...")
    [Do something]
End Sub

Это также можно сделать с помощью

If Foo(args) Then
End If

Они оба работают , но, вероятно, сбивают с толку, если кто-то пытается прочитайте мой код Есть ли способ передать 3+ аргумента в подпрограмму VBA или избавиться от синтаксиса "dummyVal"?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020

Ответ Тима Уильямса верен.

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

Public Type typPerson
    GivenName As String
    Surname As String
    ShoeSize As String
    NoOfPets As Integer
End Type
Sub SavePersonDetails(recPerson as typPerson, ByVal dblRow as Double)
    Activesheet(dblRow, 1).Value = recPerson.GivenName
    Activesheet(dblRow, 2).Value = recPerson.Surname
    Activesheet(dblRow, 3).Value = recPerson.ShoeSize
    Activesheet(dblRow, 4).Value = recPerson.NoOfPets
End Sub

Если вы хотите добавить поле, например «HasCar As Boolean», в структуру записи, список параметров для «SavePersonDetails» не изменится.

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

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

Function ExplodeApp() as Boolean
    ExplodeApp = True
    Application.Explode
End Function

может быть вызван:

ExplodeApp

без какого-либо фактического принятия значения, которое он возвращает. Функция - это просто подпрограмма, которая возвращает значение; sub - это просто функция, которая не возвращает значение. В противном случае они взаимозаменяемы. Попробуйте - перекодируйте подпрограмму, чтобы она стала функцией. (Кроме того, это хороший способ уменьшить количество имен, отображаемых в списке макросов, которые можно запустить на вкладке «Разработчик», поскольку на нем отображаются только подпрограммы. Но вы все равно можете запустить функцию, если введете ее имя. )

2 голосов
/ 27 февраля 2020

Не существует двухпараметрического ограничения для подчиненного элемента:

Sub Runner()
    Test 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
End Sub

Sub Test(a, b, c, d, e, f, g, h, i, j)
    Debug.Print Join(Array(a, b, c, d, e, f, g, h, i, j), ",")
End Sub

Выход:

1,2,3,4,5,6,7,8,9,10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...