Страницы: 1
RSS
долго заполняет ячейки из VBA
 
Подскажите пожалуйста почему он вот этот цикл выполняет по полчаса  
For j = 1 To 5  
 
Worksheets("по_территориям").Cells(j + 9, 2).Value = zab(j)  
 
Next j
 
Application.Calculation = xlManual  
For j = 1 To 5  
Worksheets("по_территориям").Cells(j + 9, 2).Value = zab(j)  
Next j  
Application.Calculation = xlAutomatic
 
спасибо помогло
 
На других форумах отписаться в теме нет желания?
 
Побыстрее:  
Application.Calculation = xlManual  
Worksheets("по_территориям").Cells(10, 2).Resize(5).Value = Application.Transpose(zab)  
Application.Calculation = xlAutomatic  
 
И я бы сразу создавал массив zab двумерным, чтоб при выгрузке не использовать Transpose.
 
а зачем двумерный массив??
 
{quote}{login=Hugo}{date=13.06.2012 09:17}{thema=}{post} чтоб при выгрузке не использовать Transpose.{/post}{/quote}  
:)
 
не это ясно..просто я не могла найти инфу по данной функции...я не знала что там используется только двумерный массив(как я поняла)...даже если я сделаю его двумерный...то он все равно будет динамическим...а смогу ли  данной функцию  использовать?
 
Просто если массив одномерный, то Вы его заполняете примерно так:  
zab(1)="test1"  
zab(2)="test2"  
zab(3)="test3"  
и выгружаете так:  
Cells(10, 2).Resize(3).Value = Application.Transpose(zab)  
 
А если двумерный, то Вы его заполняете примерно так:  
zab(1,1)="test1"  
zab(2,1)="test2"  
zab(3,1)="test3"  
и выгружаете так:  
Cells(10, 2).Resize(3, 1).Value = zab  
Т.е. исключается Transpose, что может глючить с большими объёмами и просто не работает с длинными строками (длинне 255 символов).  
Но с двумерными другая "неудобность" - менять размерность можно только "вширь", но не "вниз", что как раз чаще всего и нужно.  
Но с другой стороны - частое и многое употребление Redim Preseve сильно тормозит код (особенно при увеличении размера массива), поэтому я например одномерные массивы если и использую, то обычно не изменяю.  
А если точный размер в начале кода не известен - я массив сразу задаю на возможный максимум, при заполнении считаю заполненные "строки", и ровно столько и выгружаю.  
Поэтому ничего не мешает создавать и использовать сразу двумерный массив.  
Вот как-то так...
 
нет массив динамический...а 5 там стоит потому что даже при 5 он выполнялся очень долго...а в программе там стоит переменная которая имеет разное значение
 
В форуме Дмитрия в такой же теме ТС сказал:  
 
"vbs не умеет диапазон ячеек в массив кидать и обратно, вот тут кроме перебора вообще ничего придумать не могу...."  
 
Т.к. там я не зарегистрирован, то хочу успокоить здесь - умеет:  
 
redim a(2,1)  
a(0,0)=1  
a(0,1)=2  
a(1,0)=3  
a(1,1)=4  
a(2,0)=5  
a(2,1)=6  
 
with CreateObject("Excel.Application")  
with .Workbooks.Add(1).sheets(1)  
.range("A1").resize(3,2).value=a  
b=.range("A1").resize(3,2).value  
end with  
.visible=true  
end with  
 
with CreateObject("Excel.Application")  
with .Workbooks.Add(1).sheets(1)  
.range("A1").resize(3,2).value=b  
end with  
.visible=true  
end with  
 
 
Получите два экземпляра Экселя - сперва в первый выгружается сгенерированный массив, затем он берётся в другой массив, который аналогично выгружается во второй Эксель.
Страницы: 1
Читают тему
Наверх