|
Размерность динамического массива Variant (Array) типа? VBA в Excel.
|
|||
---|---|---|---|
#18+
Добрый день. Сейчас опишу ситуацию и вы увидете, к чему название топика. Есть два листа в Excel. В одном примерно такая структура ТитулИмяНомерАпрель 2009Май 2009Июнь 2009Июль 2009и тд до 2015 года21Строительство котлована345-прт-4437.АС103345.444454.010000.00.0и тд Строк много. Необходимо на втором листе транспонировать данные по периодам(датам) в таблицу. ТитулИмяНомерДатаСумма21Строительство котлована345-прт-4437.АСАпрель 2009103345.421Строительство котлована345-прт-4437.АСМай 200944454.0 и тд. Из соображений скорости делается все это таким кодом, используя массивы. Я привел примеры, однако исходной информации гораздо больше, поэтому в коде указываю только основное. Код: 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64.
Проблема: выгружаются не все данные. По дебагеру, показывает что BigArr имеет максимально 133 элемента. То есть фактически обработано только 133 строки из первого листа, а их там около 700. При проверке - и правда не все данные выгружаются. Вопрос - есть ограничение на массивы и как в данном случае поступить - что то сделать с массивами или забить на скорость и грузить сразу в лист? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2012, 18:36 |
|
Размерность динамического массива Variant (Array) типа? VBA в Excel.
|
|||
---|---|---|---|
#18+
Затея с массивами не лишена смысла, но ее портит реализация. Код: vbnet 1.
Меееедленно. И делается эта операция (EndY-StartY)*1000/4 раз. А то и в два раза больше, в зависимости от условий. Лучше изначально делать простой Redim c запасом. _Промешан_Проблема: выгружаются не все данные.Почему Step 4? Месяца же идут подряд. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2012, 19:16 |
|
Размерность динамического массива Variant (Array) типа? VBA в Excel.
|
|||
---|---|---|---|
#18+
И еще много повторных вычислений внутри циклов... И вообще - вы уверены, что использование массивов в этом случае оправдано? Понимаете, если бы вы использовали не циклы при загрузке/выгрузке из массива - то еще ничего бы. А так - вы сначала переписываете данные в массив, потом - обратно... А дали бы вы файлик с реальными данными (можно и без скриптов), но с большИм размером исходной таблицы и кусочком получаемой таблицы... Ибо мнится мне, что ваша задача решается даже функциями листа, не говоря уж о более простых методах переноса. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2012, 23:21 |
|
Размерность динамического массива Variant (Array) типа? VBA в Excel.
|
|||
---|---|---|---|
#18+
А почему не обратиться к данным листа как таблице БД? Один запрос - и de-pivot готов, пустые строки прибиты, можно вываливать на лист... осталось только позаботиться о правильной сортировке, что не так уж и сложно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 00:06 |
|
Размерность динамического массива Variant (Array) типа? VBA в Excel.
|
|||
---|---|---|---|
#18+
Akina , это я и имел в виду... Просто, иногда и прямое копирование может выйти быстрее, особенно если выборка/запись делается сильно нелинейно (например, надо отслеживать "отмеченные" ячейки). ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 00:25 |
|
Размерность динамического массива Variant (Array) типа? VBA в Excel.
|
|||
---|---|---|---|
#18+
AndreTM, Файлик выложить не могу, т.к. коммерческая тайна - там цифры и тп. С этим строго. Почему Step 4 . На самом деле в реальном файле расблюдовка по периодам сложная (см. картинку). Из картинки видно, что период идет в 4 столбца. А получить нужно два (не как в примере один) столбца с ценами. При чем получить надо из этих четырех. Алгоритм получения на примере Августа 2010 1. Если столбец 89 не пустой, а 90 пустой, то берем значение из 89. Если же столбец 89 пустой, а 90 не пустой - то берем значение из 90. Если оба пусты - то ничего не берем. 2. То жесамое для второй пары столбцов 91 и 92. И так по всем периодам. Плюс в таблице видно, что есть закрашенные строки - это промежуточные итоги/суммирование. Их не должно быть в итоговом листе, как и пустых строк и тд. Поэтому проверка на белый фон. Идеи? И еще много повторных вычислений внутри циклов... Каких? В любом случае, не эта проблема главная, а та, почему не выгружаются все данные в массив? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 09:49 |
|
Размерность динамического массива Variant (Array) типа? VBA в Excel.
|
|||
---|---|---|---|
#18+
В представленном отрывке ничего лишнего кроме c12 = 0 и Erase CurArr я не вижу. Первая идея все та же — выкинуть Preserve, это главный тормоз. Еще есть идея вместо "Пишем на другой лист" создать двумерный массив, у экселя вроде есть метод, позволяющий одним махом вставить весь массив в лист без унылого перебора ячеек. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 10:15 |
|
Размерность динамического массива Variant (Array) типа? VBA в Excel.
|
|||
---|---|---|---|
#18+
AntonariyВ представленном отрывке ничего лишнего кроме c12 = 0 и Erase CurArr я не вижу. Первая идея все та же — выкинуть Preserve, это главный тормоз. Еще есть идея вместо "Пишем на другой лист" создать двумерный массив, у экселя вроде есть метод, позволяющий одним махом вставить весь массив в лист без унылого перебора ячеек. если не делать с12=0 (а в реальном примере есть еще и с13), то каким-то образом в один из столбцов попадают произвольные суммы (из предыдущих вычислений), если в паре столбцов с первого листа нет значений, а в другой паре столбцов есть. Если в обоих парах столбцов нет значений - такая запись не попадает в отбор. Благодарю насчет метода единовременной вставки, только как вы вставите и всю служебную информацию и данные по периоду и двум суммам? Зачем двумерный массив? пс: все же речь основная про количество элементов. Почему из максимально 133 и не больше? ппс: не особо тут важно заморочиться с оптимизацией, т.к. выгрузка один или два раза. Но я понимаю, что напрямую это будет дольше. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 10:31 |
|
Размерность динамического массива Variant (Array) типа? VBA в Excel.
|
|||
---|---|---|---|
#18+
Насчет проблемы ничем помочь не могу, это нужно конкретно доходить до 133го элемента и дальше пошагово смотреть, что происходит. Нужно элементы сравнивать, вдруг 133й в массиве это 700й на листе? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 12:42 |
|
Размерность динамического массива Variant (Array) типа? VBA в Excel.
|
|||
---|---|---|---|
#18+
AntonariyНасчет проблемы ничем помочь не могу, это нужно конкретно доходить до 133го элемента и дальше пошагово смотреть, что происходит. Нужно элементы сравнивать, вдруг 133й в массиве это 700й на листе?Ложная тревога. Протупил - просто по условию туда данные и не должны отбираться. Всех сорри и спасибо :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 13:04 |
|
|
start [/forum/topic.php?fid=60&fpage=86&tid=2158078]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
80ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
others: | 355ms |
total: | 522ms |
0 / 0 |