|
Массивы в VBA
|
|||
---|---|---|---|
#18+
AlexFrPublic Function XFunc(XArrayFunc, StringAddr) ' Массив получаю в XArrayFunc ' Адрес элемента массива получаю в StringAddr, но в текстовом виде, грубо говоря... ' Нужно из массива XArrayFunc извлеч его элемент с адресом StringAddr... Как? End Function Ага, стало яснее. При этом массив совершенно произвольного количества измерений или есть какое-то ограничение? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2010, 00:57 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
Hugo121, А если он двух.. трех.. n-мерный? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2010, 01:11 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
Shocker.Pro, нет ограничений... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2010, 01:12 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
AlexFrXElement = XArray1(1, 5, ..., n) и NADO_XElement = XFunc(XArray1, "1,5,...,n") - это одно и тоже значение голову сломал, пока это придумывал Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Код: plaintext 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. 33. 34. 35. 36. 37. 38. 39. 40.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2010, 08:57 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
.Михаил.много воды Респект, Михаил, хорошая идея. Я тут попробовал переделать внутренний цикл, потому как не понял всех ваших изысканий: Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2010, 11:20 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
Shocker.Pro потому как не понял всех ваших изысканий суть в чем: 1. Для начало надо получить значение n размерности массива, n задается в некой внешней процедуре (функции), мы не знаем значение n : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
2. Далее "инициализую" две переменные в виде массивов равных n-размерности: первая, val : максимальное значение элементов массива в каждой n-размерности; вторая, pos : некий счетчик шагов для каждой n-размерности. Код: plaintext 1. 2. 3. 4. 5.
3. Далее этот некий счетчик эмитирует прозождение цикла. При совпадении значение счетчика со значениями строки StringAddr цикл останавливается и получается "результат". Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
на скока я вижу "переделка" для размерности n=3, а также исходный массив иницализировать можно различными способами... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2010, 12:27 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
.Михаил. Shocker.Pro Я тут попробовал переделать внутренний цикл на скока я вижу "переделка" для размерности n=3, а также исходный массив иницализировать можно различными способами... Ну я написал, что он для фиксированных величин, а на самом деле надо доработать - устроить цикл вычисления "m" по результатам предшествующих проверок размерности. Я просто попробовал вычислить индекс заранее и свести цикл просто к переходу на нужный элемент. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2010, 12:40 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
.Михаил., Вакцина подействовала!!! :) Спасибо! Больному лучше.. К вечеру даже "выпишусь", наверно... Проверка соответствия размерность массива - размерность адреса не требуется, т. к. заведомо по условию задачи верна (уже в другой процедуре сделана), а вот переход к нужному элементу по более короткому пути попробую седня вечером сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2010, 13:00 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
.Михаил.счетчик эмитирует прохождение цикла Ну раз все хорошо, то в качестве занудства: Эмитировать Имитировать ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2010, 13:09 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
Shocker.Pro.Михаил.счетчик эмитирует прохождение цикла Ну раз все хорошо, то в качестве занудства: Эмитировать Имитировать Сенк за ошибку. Понадеелся на Word, ошибку мне не показал... -1 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2010, 13:19 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
.Михаил. Код: plaintext
Всё хорошо, пока кол-во "строк", "столбцов" и т.д. в массиве совпадают. Проверьте Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2010, 16:42 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
vlth, Уже опять все хорошо :-))) Код: plaintext 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2010, 16:54 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
И финал будет фантастическим, если есть функция, с родни Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2010, 17:12 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
Доброго времени суток! Public Function CreateArrayFunc(CreateArrayName, CreateArrayString) ' Имя массива получаю в CreateArrayName ' Размерность массива получаю в CreateArrayString, но в текстовом виде, грубо говоря... ' Нужен массив End Function Общий пример: CreateArrayName="CrArr" , CreateArrayString="X1,X2,X3,...,Xn" X - какие-то целые числа n - кол-во измерений массива, определяется поступившими данными, заранее не известно Частный пример аргументов: CreateArrayName="CrArr" CreateArrayString="7,5,9,3,6" 'CreateArrayFunc должна выполнить действие: Dim CrArr(7,5,9,3,6) As Double или CreateArrayName="CrArr" CreateArrayString="7,5,9,3,6,45,21,8,1" 'CreateArrayFunc должна выполнить действие: Dim CrArr(7,5,9,3,6,45,21,8,1) As Double Если кому интересно, то данная необходимость возникла по причине записи данных наблюдения за физическими объектами в различном кол-ве и различного типа, особенно в случае статистического анализа с целью вычисления функции их поведения, где n необходимое кол-во измерений массива или мерности функции (ранг). Значение этой переменной растет до достижения точности соответствия полученной функции фактическому поведению объекта и заранее не известна… Т. к. я далеко не прошник в VBA, а пользуюсь им для решения технических проблем, то вот и завис… В прошлый раз Михаил успешно предложил способ последовательного перебора, спасибо ему... Сейчас задача другая... Если кто-то отправит меня в нужном направлении – буду признателен, а то сам ничего подобного не нашел… ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2010, 04:24 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
AlexFr, Мне кажется, вам надо отказаться от идеи с массивами и воспользовать коллекциями. прямо будете давать ключи в виде текстовой константы - "1,2,5" ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2010, 11:06 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
AlexFrДоброго времени суток! Public Function CreateArrayFunc(CreateArrayName, CreateArrayString) ' Имя массива получаю в CreateArrayName ' Размерность массива получаю в CreateArrayString, но в текстовом виде, грубо говоря... ' Нужен массив End Function Общий пример: CreateArrayName="CrArr" , CreateArrayString="X1,X2,X3,...,Xn" X - какие-то целые числа n - кол-во измерений массива, определяется поступившими данными, заранее не известно Частный пример аргументов: CreateArrayName="CrArr" CreateArrayString="7,5,9,3,6" 'CreateArrayFunc должна выполнить действие: Dim CrArr(7,5,9,3,6) As Double или CreateArrayName="CrArr" CreateArrayString="7,5,9,3,6,45,21,8,1" 'CreateArrayFunc должна выполнить действие: Dim CrArr(7,5,9,3,6,45,21,8,1) As Double Задать имя массива через строку как Вы хотите нельзя. Имя массива задается только при его описании: Dim CrArr() As Double; CrArr - это ссылка на начало массива в символьном выражении. Код: plaintext 1. 2. 3. 4.
Для решения Вашей задачи можно создать класс (или структуру - собственный тип дынных), в котором будут содержаться все наименования созданных вами массивов в виде строки, а также ссылки на сами массивы. Можно также создать метод (или процедуру), который будет возвращать тот или иной массив по его названию. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2010, 13:47 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
.Михаил.Задать имя массива через строку как Вы хотите нельзя. Имя массива задается только при его описании: Dim CrArr() As Double; CrArr - это ссылка на начало массива в символьном выражении. Фраза выше на мысль навела: м.б. создавать процедуру или функцию динамически? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2010, 14:17 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
Shocker.ProМне кажется, вам надо отказаться от идеи с массивами и воспользовать коллекциями. прямо будете давать ключи в виде текстовой константы - "1,2,5" Думал, но последующее использование будет выглядеть громоздко, т. к. в дальнейшем используется матаппарат для обработки матриц. По сути это работа с цифрами. Например, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
.Михаил.Для решения Вашей задачи можно создать класс (или структуру - собственный тип дынных), в котором будут содержаться все наименования созданных вами массивов в виде строки, а также ссылки на сами массивы. Можно также создать метод (или процедуру), который будет возвращать тот или иной массив по его названию. т.е., если я правильно понял, нужно создать набор, типа, конструктор, элементы которого уже готовы, а потом их брать и применять ("ссылки на сами массивы")? Но предполагаемое разнообразие убивает... :( Или я не правильно понял... vlthФраза выше на мысль навела: м.б. создавать процедуру или функцию динамически? А можно кусочек примера? :) Типа, теряюсь... :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2010, 14:52 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
AlexFrДумал, но последующее использование будет выглядеть громоздко, т. к. в дальнейшем используется матаппарат для обработки матриц. Почему? Это наоборот - упрощает дело, поскольку для доступа к определенному элементу массива, вам вообще не нужен будет приведенный кусок кода. То есть переменную StringAddr вы будете использовать "как есть" - MyCollection(StringAddr) без всякого разбора на индексы. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2010, 14:59 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
Shocker.Pro, Да, но как автоматом создать произвольную MyCollection(StringAddr) для дальнейшего использования, еслия знаю тока размерность (ранг)... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2010, 15:15 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
Код: plaintext 1.
"они безразмерные!" (с) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2010, 15:34 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2010, 15:38 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
А далее, чтобы иметь набор именованных массивов вы можете создавать коллекцию коллекций. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2010, 16:01 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
Shocker.Pro, Да-да-да я понял, просто хотелось чего-то структурированного, тем более уменя ужо машина налажена, но работала тупо по трехмеркам, например... Поентому я пытался пробить развитие системы в томже духе, но похоже придется все переделывать, апргрейд не удался... :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2010, 16:07 |
|
Массивы в VBA
|
|||
---|---|---|---|
#18+
AlexFrА можно кусочек примера? :) Типа, теряюсь... :)) Ну вот и "кусочек"... Программно создаётся модуль basTwo, в нём запускается процедура TMP(), выводящая в цикле элементы массива в окно отладки. Наверное, сие можно довести до ума. Только не забудьте поставить ссылку на Microsoft Visual Basic xx Extensibility. И доверие для доступа к Visual Basic Project, наверное, надо поставить. Для удаления basTwo запускайте test2 (из процедуры test удалить его не получилось) Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2010, 17:23 |
|
|
start [/forum/topic.php?fid=60&msg=36533218&tid=2159071]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 342ms |
total: | 485ms |
0 / 0 |