Страница 1 из 2
VBA. Задание аргументов в функции
Добавлено: 07 май 2008, 15:08
Avsha
Приветствую!
Есть функция:
Код: Выделить всё
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
Re: VBA. Задание аргументов в функции
Добавлено: 07 май 2008, 16:09
Aent
Читаем 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твенный параметр декларирован как массив ...
Но честно говоря я не до конца понял в чём собственно у Вас проблема ...
Re: VBA. Задание аргументов в функции
Добавлено: 07 май 2008, 20:08
Teslenko_EA
To Aent
Код: Выделить всё
VarString = "mem1,mem2,mem3,,"
...GlobalTo(Split(VarString,","))
мне кажется так будет правильнее
Евгений
Re: VBA. Задание аргументов в функции
Добавлено: 08 май 2008, 00:23
Aent
Teslenko_EA писал(а):To Aent
Код: Выделить всё
VarString = "mem1,mem2,mem3,,"
...GlobalTo(Split(VarString,","))
мне кажется так будет правильнее
Евгений
Разумеется, я просто не посмотрев до конца скопировал строчку от
Avsha
Пост исправил
Re: VBA. Задание аргументов в функции
Добавлено: 08 май 2008, 03:58
Aent
Вариант вызова
......GlobalTo(Array("mem1","mem2","mem3))......
Параметр, естественно, Variant
Ещё можно вместо массива использовать коллекцию - добавлять удобнее.
Re: VBA. Задание аргументов в функции
Добавлено: 08 май 2008, 14:57
Avsha
Всем Спасибо за варианты, но... у меня не все заработало
финальная процедура:
Код: Выделить всё
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, ","))
Re: VBA. Задание аргументов в функции
Добавлено: 08 май 2008, 19:04
Aent
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
Re: VBA. Задание аргументов в функции
Добавлено: 08 май 2008, 21:01
Avsha
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
В окне Watches полученный массив zone выглядит как:
тогда как при нормальном вызове df = GlobalTo1("mem1", "mem2", "mem3", "mem4") полученный массив zone выглядит иначе.
Re: VBA. Задание аргументов в функции
Добавлено: 08 май 2008, 22:56
Teslenko_EA
Здравствуйте
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
Re: VBA. Задание аргументов в функции
Добавлено: 09 май 2008, 00:28
Aent
Avsha, В вашем случае параметр надо объявлять не как
Код: Выделить всё
Public Function GlobalTo1 (ParamArray zone())
а как
Код: Выделить всё
Public Function GlobalTo1 (zone as Variant)
Или действуйте в соответствии с предложением
Teslenko EA.
Если же параметр объявлен как массив параметров - ParmArray - это по синтаксису VB
предполагает явное задание передаваемых параметров в строке вызова функции
Кстати, какая то она у вас странная - без типа и ничего не возвращает. Или это фрагмент кода ?