Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Оптимальный путь вывода большого одномерного массива на лист - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Оптимальный путь вывода большого одномерного массива на лист (Макросы Sub)
Оптимальный путь вывода большого одномерного массива на лист
SkyPro Дата: Пятница, 08.11.2013, 02:22 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Придумал такой алгоритм:

Процедура выводит одномерный массив на лист через функцию листа Transpose.
Подскажите, пожалуйста, как можно этот код улучшить и оптимизировать?
Или есть более быстрые варианты?
ЗЫ: Планируется выгружать около 1 млн. значений.


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Пятница, 08.11.2013, 02:31
 
Ответить
СообщениеПридумал такой алгоритм:

Процедура выводит одномерный массив на лист через функцию листа Transpose.
Подскажите, пожалуйста, как можно этот код улучшить и оптимизировать?
Или есть более быстрые варианты?
ЗЫ: Планируется выгружать около 1 млн. значений.

Автор - SkyPro
Дата добавления - 08.11.2013 в 02:22
RAN Дата: Пятница, 08.11.2013, 02:54 | Сообщение № 2
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Хитрый ты наш. Cам себя перехитрил.
[vba]
Код
ReDim tmp(1 To UBound(arArray), 1 to 1)
         For i = 1To UBound(arArray)
             tmp(i, 1) = arArray(i)
         Next
[/vba]
И никаких Transpose.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеХитрый ты наш. Cам себя перехитрил.
[vba]
Код
ReDim tmp(1 To UBound(arArray), 1 to 1)
         For i = 1To UBound(arArray)
             tmp(i, 1) = arArray(i)
         Next
[/vba]
И никаких Transpose.

Автор - RAN
Дата добавления - 08.11.2013 в 02:54
PowerBoy Дата: Пятница, 08.11.2013, 06:20 | Сообщение № 3
Группа: Проверенные
Ранг: Участник
Сообщений: 100
Репутация: 31 ±
Замечаний: 0% ±

2003
Миллионы записей надо выводить запросами.


Excel + SQL = ActiveTables (http://vk.com/ExcelSQL)
 
Ответить
СообщениеМиллионы записей надо выводить запросами.

Автор - PowerBoy
Дата добавления - 08.11.2013 в 06:20
MCH Дата: Пятница, 08.11.2013, 08:39 | Сообщение № 4
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

т.к. исходный массив arArray() и массив ar() объявлены как Variant,
то выводить можно сразу квадратом, с учетом пустых значений в конце массива ar(), ячейки будут пустыми:

[vba]
Код
Option Explicit

Sub proverka()
Dim i&
Dim x(1 To 777777)
For i = LBound(x) To UBound(x)
     x(i) = i
Next
arToRange x, 1, 1
End Sub

Public Sub arToRange(ByVal arArray, startRow&, startColumn&)
     Application.ScreenUpdating = False
     Application.Calculation = xlCalculationManual
      
     Dim maxRow&, maxCol&, i&, j&, k&
     maxRow = 50000
     'maxRow = Rows.Count - startRow + 1
     maxCol = (UBound(arArray) - LBound(arArray)) \ maxRow + 1
     ReDim ar(1 To maxRow, 1 To maxCol)
     j = 1
     For k = LBound(arArray) To UBound(arArray)
         i = i + 1
         If i > maxRow Then i = 1: j = j + 1
         ar(i, j) = arArray(k)
     Next k

     Cells(startRow, startColumn).Resize(maxRow, maxCol) = ar
      
     Application.ScreenUpdating = True
     Application.Calculation = xlCalculationAutomatic
End Sub
[/vba]


Сообщение отредактировал MCH - Пятница, 08.11.2013, 08:42
 
Ответить
Сообщениет.к. исходный массив arArray() и массив ar() объявлены как Variant,
то выводить можно сразу квадратом, с учетом пустых значений в конце массива ar(), ячейки будут пустыми:

[vba]
Код
Option Explicit

Sub proverka()
Dim i&
Dim x(1 To 777777)
For i = LBound(x) To UBound(x)
     x(i) = i
Next
arToRange x, 1, 1
End Sub

Public Sub arToRange(ByVal arArray, startRow&, startColumn&)
     Application.ScreenUpdating = False
     Application.Calculation = xlCalculationManual
      
     Dim maxRow&, maxCol&, i&, j&, k&
     maxRow = 50000
     'maxRow = Rows.Count - startRow + 1
     maxCol = (UBound(arArray) - LBound(arArray)) \ maxRow + 1
     ReDim ar(1 To maxRow, 1 To maxCol)
     j = 1
     For k = LBound(arArray) To UBound(arArray)
         i = i + 1
         If i > maxRow Then i = 1: j = j + 1
         ar(i, j) = arArray(k)
     Next k

     Cells(startRow, startColumn).Resize(maxRow, maxCol) = ar
      
     Application.ScreenUpdating = True
     Application.Calculation = xlCalculationAutomatic
End Sub
[/vba]

Автор - MCH
Дата добавления - 08.11.2013 в 08:39
RAN Дата: Пятница, 08.11.2013, 09:00 | Сообщение № 5
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Насколько я понял - нужен 1 столбец. Так что два цикла, вкупе с Transpose, большаяяя хитрость.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеНасколько я понял - нужен 1 столбец. Так что два цикла, вкупе с Transpose, большаяяя хитрость.

Автор - RAN
Дата добавления - 08.11.2013 в 09:00
MCH Дата: Пятница, 08.11.2013, 09:17 | Сообщение № 6
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

Насколько я понял - нужен 1 столбец. Так что два цикла, вкупе с Transpose, большаяяя хитрость.

А я даже не обратил на это внимание, думал нужно по столбцам раскидать, макрос ведь не запускал :(
а так, нужно переложить из одномерного массива в двухмерный и выложить целиком на лист,

но в моем варианте есть небольшое плюс, можно массивы более миллиона записей выкладывать, раскидывая их по столбцам
 
Ответить
Сообщение
Насколько я понял - нужен 1 столбец. Так что два цикла, вкупе с Transpose, большаяяя хитрость.

А я даже не обратил на это внимание, думал нужно по столбцам раскидать, макрос ведь не запускал :(
а так, нужно переложить из одномерного массива в двухмерный и выложить целиком на лист,

но в моем варианте есть небольшое плюс, можно массивы более миллиона записей выкладывать, раскидывая их по столбцам

Автор - MCH
Дата добавления - 08.11.2013 в 09:17
SkyPro Дата: Пятница, 08.11.2013, 11:07 | Сообщение № 7
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Да. Выводить нужно в столбец.
Андрей, никак не пойму, как с твоим способом обойтись без транспоза?
Александр, чуток уточнить направление поиска "выводить запросами"? Насколько я понял, вы имели ввиду SQL ?


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Пятница, 08.11.2013, 11:09
 
Ответить
СообщениеДа. Выводить нужно в столбец.
Андрей, никак не пойму, как с твоим способом обойтись без транспоза?
Александр, чуток уточнить направление поиска "выводить запросами"? Насколько я понял, вы имели ввиду SQL ?

Автор - SkyPro
Дата добавления - 08.11.2013 в 11:07
SkyPro Дата: Пятница, 08.11.2013, 11:19 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
"дурная голова рукам покоя не дает"
Я думал, что массив на лист вывести можно либо циклом по ячейкам (что ооооочень долго), либо транспозом (что быстро).
Вот и выбрал быстрый вариант и голову себе вчера ломал.
А всего-то нужно было сделать из одномерного массива двумерный =\
Андрей, Михаил, спасибо вам, что просветили :)


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Пятница, 08.11.2013, 11:22
 
Ответить
Сообщение"дурная голова рукам покоя не дает"
Я думал, что массив на лист вывести можно либо циклом по ячейкам (что ооооочень долго), либо транспозом (что быстро).
Вот и выбрал быстрый вариант и голову себе вчера ломал.
А всего-то нужно было сделать из одномерного массива двумерный =\
Андрей, Михаил, спасибо вам, что просветили :)

Автор - SkyPro
Дата добавления - 08.11.2013 в 11:19
PowerBoy Дата: Пятница, 08.11.2013, 12:33 | Сообщение № 9
Группа: Проверенные
Ранг: Участник
Сообщений: 100
Репутация: 31 ±
Замечаний: 0% ±

2003
Александр, чуток уточнить направление поиска "выводить запросами"? Насколько я понял, вы имели ввиду SQL ?


Я так понимаю чтобы вывести быстро миллион записей, их еще надо быстро прочитать.
Оптимально конечно с помощью SQL, ADO.

Если лень писать макрос, можно воспользоваться моей надстройкой "Активные таблицы":
http://www.excelworld.ru/forum/3-5665-68943-16-1383896892


Excel + SQL = ActiveTables (http://vk.com/ExcelSQL)
 
Ответить
Сообщение
Александр, чуток уточнить направление поиска "выводить запросами"? Насколько я понял, вы имели ввиду SQL ?


Я так понимаю чтобы вывести быстро миллион записей, их еще надо быстро прочитать.
Оптимально конечно с помощью SQL, ADO.

Если лень писать макрос, можно воспользоваться моей надстройкой "Активные таблицы":
http://www.excelworld.ru/forum/3-5665-68943-16-1383896892

Автор - PowerBoy
Дата добавления - 08.11.2013 в 12:33
SkyPro Дата: Пятница, 08.11.2013, 13:15 | Сообщение № 10
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Спасибо.
В моем случае массив фомируется, а не считывается. Так что вывод проще организовать "обычным" способом.
А вашу надстройку, при возможности, обязательно попробую :)


skypro1111@gmail.com
 
Ответить
СообщениеСпасибо.
В моем случае массив фомируется, а не считывается. Так что вывод проще организовать "обычным" способом.
А вашу надстройку, при возможности, обязательно попробую :)

Автор - SkyPro
Дата добавления - 08.11.2013 в 13:15
RAN Дата: Пятница, 08.11.2013, 16:12 | Сообщение № 11
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Надо было вчера еще строчку кода добавить. Но не подозревал, что проблема в этом.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеНадо было вчера еще строчку кода добавить. Но не подозревал, что проблема в этом.

Автор - RAN
Дата добавления - 08.11.2013 в 16:12
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Оптимальный путь вывода большого одномерного массива на лист (Макросы Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!