|
Функция возвращающая массив - как объявить
|
|||
---|---|---|---|
#18+
Здравствуйте! Начал переписывать под VBA код из OOBasic и уперся - нужна функция, которая будет фильтровать массив строк по условию, и возвращать только нужные. Хотелось-бы чтобы возвращала она их массивом, а не строкой. Не могу понять как это сделать на VBA - в OOBasic просто обозначаешь функцию As Array и все работает. Здесь же ругается, хотя результирующий массив строиться нормально. В оригинале объявление функции на OOBasic: Код: vbnet 1.
Проблема еще и в том, что по OOBasic есть Питоньяк, а по VBA все что нахожу это в основном Excel, который мне не нужен. У меня задача - считать данные из текстового файла и внести в документ Word Сама функция ниже: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Заранее спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2017, 12:53 |
|
Функция возвращающая массив - как объявить
|
|||
---|---|---|---|
#18+
Andrey A. Markine, так объявлена уже: Function aFilterArrayByCondition(sInputCSV As String, sCondition As String, sRowSeparator As String) As Variant() Чтобы вывести результат (массив) на лист в Excel, надо ввести функцию как формулу массива , см. Справку. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2017, 16:28 |
|
Функция возвращающая массив - как объявить
|
|||
---|---|---|---|
#18+
Но функция возвращает одномерный массив, для Экселя это горизонтальный массив, чтоб вывести его в столбец - его нужно транспонировать. Если делать именно для Экселя - можно сразу в функции формировать двумерный вертикальный массив, тогда не нужны будут дополнительные трансформации. Но т.к. тут Экесель вообще ни при чём и не нужен - не понимаю в чём проблема с Вордом? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2017, 19:08 |
|
Функция возвращающая массив - как объявить
|
|||
---|---|---|---|
#18+
Спасибо за ответы, но вообще-то я сразу честно написал что Excel мне не нужен ни разу. Я никуда данные не вывожу – у меня весь код на VBA работает, только окончательный отчет выводится в Word. Уже решил проблему, рабочий вариант, если кому нужно: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Проблема была в () после aResultArray и несоответствии типов массивов. Я думал что судя по описанию Variant() должен спокойно принимать любое значение, а оказывается нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2017, 19:47 |
|
Функция возвращающая массив - как объявить
|
|||
---|---|---|---|
#18+
Andrey A. Markine, функция в таком виде конечно возвратит массив, но только если sRowSeparator=vbNewLine . Потому что sResultString собирается через разделитель vbNewLine , а делится через sRowSeparator . Иначе будет массив, но из одного элемента. Вообще, то, что Вы хотите, как я понял, делается одной строкой: Код: vbnet 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2017, 23:52 |
|
Функция возвращающая массив - как объявить
|
|||
---|---|---|---|
#18+
Andrey A. MarkineЯ думал что судя по описанию Variant() должен спокойно принимать любое значение, а оказывается нет. Variant "по описанию" принимает любой тип. Т.е. если бы вы определили возвращаемое значение As Variant - оно бы вполне "приняло" строковый массив. И переменную, принимающую результат тогда тоже надо объявить как Variant. Определение возвращаемого значения как variant() означает, что вы собрались возвращать массив, каждый элемент которого variant. Массивы, содержащие элементы разных типов несовместимы по присвоению. т.е. нельзя переменной типа variant() присвоить значение переменной типа string() и наоборот - типы элементов этих массивов разные а переменные, умеющие принять каждая свой массив оказываются несовместимы по типу принимаемого массива. Andrey A. MarkineУже решил проблему, рабочий вариант, если кому нужно: не похож он на рабочий. Т.е., наверно рабочий, но для единственного случая, когда параметр sRowSeparator имеет значение vbNewLine вот вам "более рабочий": Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
Если для вас не является принципиальным - процедура это или функция, я бы рекомендовал вам преобразовать это в соответствующую процедуру с целью избавления от строки Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2017, 00:00 |
|
Функция возвращающая массив - как объявить
|
|||
---|---|---|---|
#18+
Казанский... делается одной строкой:... [/src] как, оказывается, я уже все забыл... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2017, 00:04 |
|
Функция возвращающая массив - как объявить
|
|||
---|---|---|---|
#18+
Всем огромное спасибо за ответы. [quot Казанский]Andrey A. Markine, авторВообще, то, что Вы хотите, как я понял, делается одной строкой: Код: vbnet 1. 2. 3.
Этим вы меня вообще убили. Оказалось все так просто. Сейчас использую: Код: vbnet 1. 2.
Правда, не везде прокатило – оказалось что в отчетах с оборудования имеются повторяющиеся строки (например "ОпорМочПуз Дл" и "МочПуз Дл" – убивал бы локализаторов медицинского оборудования). В связи с чем использовал такую конструкцию, которая фильтрует массив по условиям из справочника до первой совпавшей строки: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Посмотрите если не сложно – может я опять усложняю то что в одну строку делаться? Заранее спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2017, 22:51 |
|
Функция возвращающая массив - как объявить
|
|||
---|---|---|---|
#18+
Andrey A. Markine, Andrey A. MarkineПосмотрите если не сложно – может я опять усложняю то что в одну строку делаться? Нужно видеть задачу шире, а не теми кусочками, которые вы показываете. ------------------- по варианту конкретного кода - вам здесь не нужна Dim bFindString As Boolean просто замените bFindString = True на Exit For Когда вам на самом деле понадобится bFindString, вместо ... And bFindString Then пишите If bFindString And ... Логические выражения вычисляются слева направо Кроме того, мои вкусовые предпочтения состоят в том, чтобы лепить строку последней операцией: В данном случае, когда максимальный размер результата у вас определяется размером фильтрующего массива, схема может выглядеть так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2017, 02:38 |
|
|
start [/forum/topic.php?fid=60&fpage=12&tid=2155143]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
others: | 282ms |
total: | 402ms |
0 / 0 |