VBA. Задание аргументов в функции

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Приветствую!

Есть функция:

Код: Выделить всё

 
Public Function GlobalTo(User_01 As String, User_02 As String, User_03 As String, User_04 As String, User_05 As String)
 
End Function

вызываю ее так:

Код: Выделить всё

If GlobalTo("mem1", "mem2", "mem3", "", "") = 0 Then Exit Sub


на самом деле аргументов не пять, а 30!

1)
Можно ли как задать массивом аргументы?

2)
Можно ли сформировать строку агрументов как значение текстовой (или какой другой) переменной и затем выполнить...
VarString = "mem1", "mem2", "mem3", "", ""
If GlobalTo(VarString) = 0 Then Exit Sub
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Читаем HELP:
1)
A parameter array can be used to pass an array of arguments to a procedure. You don't have to know the number of elements in the array when you define the procedure.
You use the ParamArray keyword to denote a parameter array. The array must be declared as an array of type Variant, and it must be the last argument in the procedure definition.
The following example shows how you might define a procedure with a parameter array.
Sub AnyNumberArgs(strName As String, ParamArray intScores() As Variant)
Dim intI As Integer
Debug.Print strName; " Scores"
' Use UBound function to determine upper limit of array.
For intI = 0 To UBound(intScores())
Debug.Print " "; intScores(intI)
Next intI
End Sub

The following examples show how you can call this procedure.
AnyNumberArgs "Jamie", 10, 26, 32, 15, 22, 24, 16
AnyNumberArgs "Kelly", "High", "Low", "Average", "High"
2) VarString = "mem1,mem2,mem3,, "
.... GlobalTo(Split(VarString,","))
Предполагается что единcтвенный параметр декларирован как массив ...

Но честно говоря я не до конца понял в чём собственно у Вас проблема ...
Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

To Aent

Код: Выделить всё

VarString = "mem1,mem2,mem3,,"
...GlobalTo(Split(VarString,","))
мне кажется так будет правильнее
Евгений
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Teslenko_EA писал(а):To Aent

Код: Выделить всё

VarString = "mem1,mem2,mem3,,"
...GlobalTo(Split(VarString,","))
мне кажется так будет правильнее
Евгений

Разумеется, я просто не посмотрев до конца скопировал строчку от Avsha
Пост исправил
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Вариант вызова
......GlobalTo(Array("mem1","mem2","mem3))......
Параметр, естественно, Variant
Ещё можно вместо массива использовать коллекцию - добавлять удобнее.
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Всем Спасибо за варианты, но... у меня не все заработало

финальная процедура:

Код: Выделить всё

 
Public Function GlobalTo1(ParamArray zone())
 
For i = 0 To UBound(zone)
dfg = zone(i)
Next i
 
End Function

вызывается и работает хорошо следующей строкой:
df = GlobalTo1("mem1", "mem2", "mem3", "mem4")

но эти варианты, так нужные мне - не проходят!

Код: Выделить всё

 
'1) 
Dim zone_in(4) As String
zone_in(1) = "mem1"
zone_in(2) = "mem2"
zone_in(3) = "mem3"
zone_in(4) = "mem4"
       df = GlobalTo1(zone_in)
 
'2)
Dim VarString As Variant
    VarString = "mem1,mem2,mem3,,"
    df = GlobalTo1(Split(VarString, ","))
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Avsha,В чём Ваша проблема решительно непонятно...
Ниже пример для целых и строк. Вероятнее всего неправильно объявляете параметр функции

Код: Выделить всё

Option Base 0
Public Function summ(v As Variant) As Integer
    Dim i As Integer
    summ = 0
    For i = LBound(v) To UBound(v)
        summ = summ + Int(v(i))
    Next i
End Function
Public Function FindArray(sArg As String, v As Variant) As Long
    Dim i As Long, k As Long
    FindArray = Len(sArg) + 1
    For i = LBound(v) To UBound(v)
        k = InStr(sArg, CStr(v(i)))
        If k > 0 And k < FindArray Then
            FindArray = k
        End If
    Next i
    If FindArray > Len(sArg) Then
        FindArray = 0
    End If
End Function
Public Sub test1()
   Debug.Print summ(Array(1, 2, 3, 4, 5, 6, 7))
End Sub
Public Sub test2()
   Dim v(3) As String
   Debug.Print FindArray("jjl:jdl,a!j", Array("-", "!", "/", ":"))
   Debug.Print FindArray("jjl:jdl,a!j", Split("-,!,/,:", ","))
   v(0) = "-"
   v(1) = "!"
   v(2) = "/"
   v(3) = ":"
   Debug.Print FindArray("jjl:jdl,a!j", v)
End Sub
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

to Aent,

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

Код: Выделить всё

 Public Function GlobalTo1(ParamArray zone())
 stop
For i = 0 To UBound(zone)
dfg = zone(i)
Next i
 
End Function
необходимо ее вызвать через переменную VarString, значение которой заранее определено,
по вашему предложению - это может быть выглядеть так:

GlobalTo1(Split(VarString, ","))

Но это не работает, полученный массив в функции как-то ненормально определяется, например UBound(zone) = 0 :confused:

В окне Watches полученный массив zone выглядит как:


тогда как при нормальном вызове df = GlobalTo1("mem1", "mem2", "mem3", "mem4") полученный массив zone выглядит иначе.
Вложения
del_2008_02.jpg
del_2008_02.jpg (16.28 КБ) 242 просмотра
del_2008_01.jpg
del_2008_01.jpg (19.8 КБ) 241 просмотр
Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

Здравствуйте Avsha.
Вам обязательно передавать в функцию массив?
Split работает со строкой и строку необходимо передавать в качестве аргумента,
а далее в теле функции получайте массив.

Код: Выделить всё

Sub ddd()
Dim Vars$
Vars = "mem1,mem2,mem3,mem4"
GlobalTo1 Vars
End Sub
Public Function GlobalTo1(VarString$)
Dim zone() As String
zone = Split(VarString, ",")
 Stop
For i = 0 To UBound(zone)
dfg = zone(i)
Next i
End Function
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Avsha, В вашем случае параметр надо объявлять не как

Код: Выделить всё

Public Function GlobalTo1 (ParamArray zone())
а как

Код: Выделить всё

Public Function GlobalTo1 (zone as Variant)
Или действуйте в соответствии с предложением Teslenko EA.
Если же параметр объявлен как массив параметров - ParmArray - это по синтаксису VB
предполагает явное задание передаваемых параметров в строке вызова функции
Кстати, какая то она у вас странная - без типа и ничего не возвращает. Или это фрагмент кода ?
Ответить