Страницы: 1
RSS
Обращение к нескольким листам, диапазонам в VBA.
 
Столкнулся с задачей масс-форматирования схожих страниц и заметил, что код занимает весьма много времени.  
 
Конкретней, мне надо было изменить на 11 листах ширину строк с 22 по 34 на определенные значения, удалить несколько листов или определенные строки/столбцы на 11 листах.  
 
Ну и собственно был код в 2-х вариантах (с массивом листов и массивом названий листов):  
dim wsName(1 to 11) as String  
wsName(1)="Sheet1"  
...  
wsName(11)="Sheet11"  
 
for j = 1 to 11  
ThisWorkBook.Worksheets(wsName(j)).Rows("24").RowHeight=10  
ThisWorkBook.Worksheets(wsName(j)).Rows("25").RowHeight=15  
...  
ThisWorkBook.Worksheets(wsName(j)).Rows("32").RowHeight=20  
Next  
 
Ну и аналогично для массива листов, было    
ws(j).Rows("24").RowHeight=10 в цикле  
 
Работало это всё медленно, нашел в хелпе обращение к массиву листов Worksheets(Array("Sheet1", "Sheet2", "Sheet3"), и нашел что оно работает с применением строкового массива типа (Worksheets(wsName))  
 
Но, что было неудобно:  
Для того, чтобы например изменить высоту строк, приходилось писать такой код:  
ThisWorkBook.WorkSheets(wsName).Select  
Rows("22").RowHeight=10  
 
То есть выделение листа, и выделение строки на активном листе (ну фиг с ним с ScreenUpdating = false пользователь этого не видит), но мне кажется, что это как-то криво и должна быть возможность сделать это без Select'а.  
А ещё в коде перед этим открывается другой эксель файл и чтобы заработал Select, нужно было писать ThisWorkBook.Activate.  
Мне оч. сильно не нравятся методы Select/Activate, поэтому собственно и создал эту тему :)
 
так если не нравятся эти методы-  не пользуйтись ими, так и пишите  
ThisWorkBook.WorkSheets(wsName).Rows("22").RowHeight=10
 
{quote}{login=Артем}{date=14.11.2008 02:59}{thema=}{post}так если не нравятся эти методы-  не пользуйтись ими, так и пишите  
ThisWorkBook.WorkSheets(wsName).Rows("22").RowHeight=10{/post}{/quote}  
 
run time error 438 тогда :)
 
Даже так приходится:  
ThisWorkBook.WorkSheets(wsName).Select  
Rows("22").Select  
Selection.RowHeight=10  
 
ппц коряво выглядит то что должно записываться в одну строчку :(
 
ну да конечно, с массивами нужно через циклы работать, вот так  
Sub Ìàêðîñ1()  
wsName = Array("Лист1", "Лист2", "Лист3")  
For i = 0 To UBound(wsName)  
ThisWorkbook.Worksheets(wsName(i)).Rows("22").RowHeight = 100  
 
Next  
 
End Sub
 
Prog, вот так попробуй:  
Sub qqq()  
n = Sheets.Count  
For i = 1 To n  
Sheets(i).Cells(22, 1).RowHeight = 10  
Next
 
Да это всё понятно, но это работает весьма медленно.  
Сравните код например  
For i = 255 to 1  
Range("A" & i").entirecolumn.delete  
next  
 
с    
Range("A1:A255").entirecolumn.delete  
 
по времени выполнения.  
 
или например  
Worksheets("Sheet1").delete  
Worksheets("Sheet2").delete  
...  
Worksheets("Sheet10").delete  
 
с    
 
Worksheets(Array("Sheet1","Sheet2",...,"Sheet10").delete  
 
Вот мне очень интересно узнать либо про список того, что можно применять к массиву рабочих листов одной операцией, а что придется всё-таки по отдельности делать.  
Через Select и потом Selection работает значительно быстрей, чем последовательно перебрать 10 листов и на каждом по 12 рядов ресайзнуть.  
 
Просто есть задача, в которой надо из 1 файла сделать файлов 80 с вырезанными  по определенным условиям одними данными и добавленными в некоторых места опять же по условиям другими данными. Хорошо если это будет делаться за 1-2 мин, а не за 7-8 (каждый файл)
 
Также сейчас пришел к выводу что найти текстом параметры формулы (любыми стандартными методами обработки строк бейсика) и сделать Evaluate работает значительно быстрей, чем через If'ы выискивать промежуточные этапы и считать их с Worksheetfunction.PercentRank например.  
 
Реализованные микромягкими функции на C++ работают очень значительно быстрее)
 
То есть я имел ввиду что    
range("a1")=Evaluate("=PercentRank("B1:B100",25)"  
работает быстрее чем  
set rng=Range("B1:B100")  
i=25  
range("a1")=Worksheetfunction(rng,i)
Страницы: 1
Читают тему
Наверх