Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2010, 12:29   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию Работа с аргументами передоваемыми в функцию

Хочется иметь в VBA аналог функции REXX Parse, она разбирает строку в соотвествии с заданным шаблоном.
Например: есть переменная str="aaa bbb ccc ddd". То по команде:
parse var str str1 str2 str3
получаем: str1="aaa"; str2="bbb"; str3="ccc ddd". Пример, конечно простейший. Аргументов может быть любое число.
Есть ли аналог в VBA? Если аналогов нет, хочу написать подное, и есть ряд вопросов:
* так как аргументов может любой число, то нужно определить сколько их было передано и иметь возможность обратиться к ним по номеру, так как имена так же не известны. В rexx'се это делается командами: arc() - сколько было передано аргументов; arc(n) - обращение к аргументу с номером n, как чтение так и запись. Как это сделать в VBA?
* значение аргументов внутри функции будут изменены (возможно созданы новые переменные). Как передать эти изменения из функции в вызывающую программу?
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 19.09.2010, 13:09   #2
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

0) В простейших случаях может быть использована функция SPLIT.
Код:
Dim v
Dim s1 as string, s2 as string, s3 as string
v = split("aaa bbb ccc ddd")
s1=v(0)
s2=v(1)
s3 = v(2) & " " & v(3)  ' увы, только так
1) Смотрите в HELP по VBA параметр ParamArray для Function и Sub (см так же http://www.mrexcel.com/forum/showthread.php?t=118381)

2) Cобственно и в REXX Parse не является функцией - это оператор.
Изменить в функции, переданные переменные НЕЛЬЗЯ. Это можно сделать только в процедуре-подпрограмме (sub) для аргументов, передаваемых по ссылке (ByRef). Но и этим злоупотреблять не стоит.

3) Вернуть несколько значений из функции можно:
a) c помощью массива, который возвращает функция
b) c помощью коллекции, которую возвращает функция
Естественно, нужно предварительно подумать - что вы будете делать с результатом. Например, пройдётесь по нему в цикле For Each ...

Посмотрите по парсингу строк http://www.cpearson.com/excel/splitondelimiters.aspx

Последний раз редактировалось Aent; 19.09.2010 в 13:19.
Aent вне форума Ответить с цитированием
Старый 19.09.2010, 16:48   #3
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от Aent Посмотреть сообщение
1) Смотрите в HELP по VBA параметр ParamArray для Function и Sub (см так же http://www.mrexcel.com/forum/showthread.php?t=118381)
Спасибо, помогло.
Цитата:
Сообщение от Aent Посмотреть сообщение
2) Cобственно и в REXX Parse не является функцией - это оператор.
Не ожидал встретить здесь человека разбирающегося на хорошем уровне в rexx'се. По этому позволил себе не вдаваться в подробности, тем более что в rexx'се нет понятия функция.
Цитата:
Сообщение от Aent Посмотреть сообщение
Изменить в функции, переданные переменные НЕЛЬЗЯ. Это можно сделать только в процедуре-подпрограмме (sub) для аргументов, передаваемых по ссылке (ByRef). Но и этим злоупотреблять не стоит.
Полностью подерживаю, что не стоит. Но иногда без этого ну ни как.
Цитата:
Сообщение от Aent Посмотреть сообщение
3) Вернуть несколько значений из функции можно:
a) c помощью массива, который возвращает функция
b) c помощью коллекции, которую возвращает функция
Естественно, нужно предварительно подумать - что вы будете делать с результатом. Например, пройдётесь по нему в цикле For Each ...
Возврат массива и дальнейшая его обработка, меня не устраивает... Идея была как раз уйти от них. У меня уже есть аналоги команд rexx'са words и word (я приводил их на форуме), они и без массивов позволят красиво разобрать строку в переменные. Но хотелось еще проще.

Спасибо за развернутый ответ!
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 19.09.2010, 20:20   #4
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Цитата:
Сообщение от tae1980
тем более что в rexx'се нет понятия функция.
Понятие "функция" в REXX конечно же есть. Как же без него. См., например,
http://www.scoug.com/openhouse/rexxi...BIFunc1.2.html
http://publib.boulder.ibm.com/infoce...p2/eyup2kn.htm
"Естественным" с точки зрения MS механизмом для парсинга текста в VBA являются регулярные выражения.
Посмотрите, например, http://www.tmehta.com/regexp/ и далее по ссылкам.

Последний раз редактировалось Aent; 19.09.2010 в 21:00.
Aent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
smtp - сообщение об ошибке: 501, типа ошибка в синтаксисе, косяк с аргументами Dimarik Win Api 5 10.04.2010 22:06
Описать функцию Alex_193 Помощь студентам 1 15.03.2010 20:42
Работа: написать функцию с JOBами dudeboy Фриланс 4 20.01.2010 21:05
Создать функцию segail Microsoft Office Excel 5 26.09.2009 00:11