Страницы: 1
RSS
Не могу разобраться с Do... Until
 
Sub testq()  
Do  
For Each cell In ActiveSheet.UsedRange  
cell.Activate  
If ActiveCell.Column <> 1 And ActiveCell.Row <> 1 Then  
If ActiveCell.NumberFormat = "0.00" And _  
ActiveCell.Offset(-1, 0).NumberFormat <> "0.00" _  
And ActiveCell.Offset(0, -1).NumberFormat <> "0.00" _  
Then ActiveWindow.FreezePanes = True  
End If  
Next  
Exit Do  
Loop Until ActiveWindow.FreezePanes = True  
End Sub  
 
Не могу разобраться с синтаксисом этого оператора. Если его убрать, то получается слишком долгий перебор всех ячеек. Если его оставить, как он сейчас есть, то перебор осуществляется всё равно по всем ячейкам. Если его поставить перед Next, то перебор заканчивается на 1-ой же ячейки. Принцип, понимаю, наверное вообще следует отказаться от For each, но как по-другому осуществить перебор ячеек на проверку условий не понимаю.    
 
И ещё:    
Set FoundCell = Range("A1:A10").Find(what:="a", after:=LastCell)  
Как можно здесь воспользоваться оператором OR, если требуется чтобы он искал несколько значений, да ещё и так, чтобы он не множил сущности типо этого:  
Set FoundCell = Range("A1:A10").Find(what:="a", after:=LastCell) or _  
Set FoundCell = Range("A1:A10").Find(what:="b", after:=LastCell) or _  
Set FoundCell = Range("A1:A10").Find(what:="c", after:=LastCell)  
 
Заранее благодарю.
 
Напишите словами чего вы хотите добиться этим макросом, а еще лучше дайте пример с описанием.
Редко но метко ...
 
Закрепление области, таким образом, чтобы столбец со статьями и строка с филиалами были статичны, ну а сам массив числовых данных подвижен. Решил это сделать таким образом - находит ячейку с условиями, что ячейка сама числовая, а сверху и слева не числовые. Т.е. находит верхнюю левую ячейку и по ней фиксирует область.
 
для увеличения скорости лучше всего отказаться от активации ячеек и отключать обновление экрана в начале макроса.  
 
и, если Вы работаете со значениями ячеек, то лучше загонять эти значения в массив и работать с элементами массива.  
 
но в данном случае Вы проверяете форматы.  
и я вот не знаю простого способа без перебора загнать форматы в массив... самому интересно - можно ли?  
 
Антон, GIG_ant, не знаешь?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
давайте пример, что нибудь придумаем
Редко но метко ...
 
Then ActiveWindow.FreezePanes = True: Exit For  
 
И Do вообще убрать полностью.
 
Скажем такая табличка.
 
Спасибо.  
Просто и практично.  
А на второй пустяковый вопрос кто-нибудь ответит?
 
Так будет побыстрее:  
 
Sub testqH()  
   Dim cc As Range  
   ActiveWindow.FreezePanes = False  
   For Each cc In ActiveSheet.UsedRange  
       If cc.Column <> 1 Then  
           If cc.Row <> 1 Then  
               If cc.NumberFormat = "0.00" Then  
                   If cc.Offset(-1, 0).NumberFormat <> "0.00" Then  
                       If cc.Offset(0, -1).NumberFormat <> "0.00" Then  
                           cc.Activate: ActiveWindow.FreezePanes = True: Exit For  
                       End If  
                   End If  
               End If  
           End If  
       End If  
   Next  
End Sub
 
Второй вопрос - я думаю если использовать Find, то просто искать последовательно сперва а, потом если не нашли, то b, затем аналогично c.
 
Sub Poisk()  
Dim FoundCell As Range  
Dim LastCell As Range  
Dim FirstAddr As String  
With Range("A1:A10")  
   Set LastCell = .Cells(.Cells.Count)  
End With  
Set FoundCell = Range("A1:A10").Find(what:="a", after:=LastCell)  
If Not FoundCell Is Nothing Then  
   FirstAddr = FoundCell.Address  
End If  
Do Until FoundCell Is Nothing  
   Rows(FoundCell.Row).Select  
   Selection.Font.Bold = True  
   Set FoundCell = Range("A1:A10").FindNext(after:=FoundCell)  
   If FoundCell.Address = FirstAddr Then  
       Exit Do  
   End If  
Loop  
End Sub  
 
Требуется, чтобы он находил определённые позиции и их выделял. Т.е. он будет находить и а и b и c. И все их выделял.
 
по первому вопросу можно ваабще без циклов:    
см файл
Редко но метко ...
 
А объясните, пожалуйста, принцип. В каких случаях макрос не сработает или сработает не так? Потому что таблички могут варьироваться на столбец/строку в ту или иную сторону. Хочу понять насколько универсально, да и вообще разобраться.
 
Принцип прост.  
Макрос устанавливает закрепление областей на первой числовой ячейке из текущей области относительно указанной ячейки (В этом случае D5). Корректно будет работать если все нужные ячейки заполнены числами. Если вы хотите отбирать именно по формату ячеек, тогда наверное лучше цикл. (а еще проще вручную ))).
Редко но метко ...
 
Спасибо.  
В ручную то проще, просто это часть большого макроса по форматированию таблицы. Поэтому почему бы не сделать, чтобы макрос уж делал абсолютно всё, что требуется.  
 
А через ваш способ можно определить шапку? Т.е. чтобы он просматривал строку, видел, что в ней есть скажем более 3 текстовых полей, и на этом основании выделял её.
 
{quote}{login=ikki}{date=17.02.2012 10:49}{thema=}{post}  
и я вот не знаю простого способа без перебора загнать форматы в массив... самому интересно - можно ли?  
 
Антон, GIG_ant, не знаешь?{/post}{/quote}  
 
Работать с форматом ячеек нужно осторожно, потому как формат будет текстовый, а значение можно представить как число. Не было у меня такой задачи - получить в массиве не значения а форматы ячеек. но вопрос интересный. Надо подумать. (Хотя кажется мне что без перебора ячеек тут не обойтись).
Редко но метко ...
 
{quote}{login=Ioni4}{date=17.02.2012 11:39}{thema=}{post}  
А через ваш способ можно определить шапку? Т.е. чтобы он просматривал строку, видел, что в ней есть скажем более 3 текстовых полей, и на этом основании выделял её.{/post}{/quote}  
 
Можно:  
Делаете цикл по строкам начиная с первой и вниз.  
и проверяете количество текстовых констант в строке, например так:  
IF Rows(i).SpecialCells(xlCellTypeConstants, 2) > 3 THEN ...
Редко но метко ...
Страницы: 1
Читают тему
Наверх