Можно ли упростить

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

СашаСВ
Сообщения: 20
Зарегистрирован: 11 май 2006, 16:11
Контактная информация:

Доброе утро уважаемые!

Есть вот такой код.

Dim iCell As Range, iCellHidden As Range

For Each iCell In Range("AT8:AT1454")
If iCell.Value = "0" Or iCell.Text = "" Then
Set iCellHidden = Union(iCell, _
IIf(iCellHidden Is Nothing, iCell, iCellHidden))
End If
Next

If Not iCellHidden Is Nothing Then iCellHidden.EntireRow.Hidden = True


Этот код прикреплен у меня к кнопочке и скрывает пустые ячейки. Проблема в том что комп задумывает и притормаживает когда я пользуюсь этой кнопкой. Вопрос: Можно ли как то упростить оптимизировать данный код, чтоб ускорить работу компа???
;) )
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

А вот такой вариант Вас не устроит?

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

Код: Выделить всё

Sub Макрос1()
    Range("AT8:AT1454").SpecialCells(xlCellTypeBlanks).Select
    Selection.Delete Shift:=xlUp
    Range("A1").Select
End Sub
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

VictorM, Виктор, так, насколько я понимаю, принципиальная разница!
в первом коде строки СКРЫВАЮТСЯ, а в вашем коде - строки
&quot писал(а):Selection.Delete Shift:=xlUp
удаляются... если я не ошибаюсь, конечно...
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

ТОЧНО!!!!
СашаСВ
скрывает пустые ячейки
Прошу прощения, не доглядел ;)
тогда вместо Selection.Delete Shift:=xlUp нужно записать Selection.EntireRow.Hidden = True
или лучше вообще так:

Код: Выделить всё

Sub Макрос1()
        Range("AT8:AT1454").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
End Sub
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
СашаСВ
Сообщения: 20
Зарегистрирован: 11 май 2006, 16:11
Контактная информация:

VictorM ваш код подходит, но не совсем, я спешил и не указал в первом сообщении что мне надо скрывать не только пустые но и нулевые значения...
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Попробуйте еще вот это, вроде немного быстрее работает.

Код: Выделить всё

Sub RowsHidden()
With Application
     .ScreenUpdating = False
     .DisplayAlerts = False
     .Calculation = xlManual
     With ThisWorkbook.Worksheets(1)
          iLastRow& = .Cells(65536, 1).End(xlUp).Row
          For iRow& = iLastRow& To 1 Step -1
              If CStr(.Cells(iRow&, 1).Value) = "0" Or CStr(.Cells(iRow&, 1).Value) = "" Then _
                 .Rows(iRow&).Hidden = True
          Next
     End With
     .Calculation = xlAutomatic
     .DisplayAlerts = True
     .ScreenUpdating = True
End With
End Sub
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

ViktorM, общее замечание:
C некоторых пор я вместо .Cells(65536,..).End(xlUP) стараюсь писать
.Cells(.Rows.Сount,...).End(xlUP) ;)
Ибо пару раз уже нарвался с 2007 Excel ;)
Андрей Энтелис,
aentelis.livejournal.com
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Aent,
Ибо пару раз уже нарвался с 2007 Excel
да, мысль понял, учту.
Спасибо.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

ой.. извините за наглость...
а мне кажется, что вот так ещё чуть-чуть лучше будет:

Код: Выделить всё

  Cells(ActiveSheet.UsedRange.Rows.Count, col).End(xlUp).Row 
Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

Здравствуйте Serge_Bliznykov.
Я вот тут мимо проходил :) ...
То, что Вам кажется не всегда верно,
UsedRange.Rows.Count - считает количество строк используемого диапазона,
Если заполнение листа начинается не с первой строки, то возвращенное число не будет номером последней строки.

Код: Выделить всё

With ActiveSheet.UsedRange
    LastRow = .Rows.Count + .Row - 1
End With
Евгений.
Ответить