Он работает нормально, но выполнение медленнее, чем хотелось бы, и я не уверен, почему. У меня есть еще один сегмент кода, который также меняет это...
Есть только 5 листов, которые он перебирает, и только в заданном диапазоне загружается. Он проверяет только нулевое значение в столбце A, и если оно равно нулю, строка скрывается.
Я пытался отключить расчеты, события и обновления экрана, но это все еще не быстро... Я где-то пропустил утечку памяти??? Он ведет себя так, как будто хочет разбиться, но потом продолжает...
Sub HideBlanks()
Dim Sheet As Worksheet
Dim r As Long
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
For Each Sheet In Worksheets
If Sheet.Index > 1 Then
With Sheet
For r = 4 To 350
With activesheets
If Range("A" & r) = "" Then
Range("A" & r).EntireRow.Hidden = True
End If
End With
Next r
End With
End If
Range("a1").Select
Next Sheet
Worksheets(1).Activate
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
End Sub
Может быть, я иду об этом совершенно неправильно...
Конечная цель состоит в том, чтобы скрыть (или запретить) пустые ячейки между A4:G350 от печати этих строк, если значение равно "".
Затем используйте Union, чтобы создать диапазон ячеек, чтобы скрыть и скрыть один раз за пределами цикла на листе.
Можете ли вы объяснить союз, пожалуйста, Скотт?
Я не уверен, как это применить... У меня есть один аргумент, в основном это A null... следующая строка.
Как ваш код вообще может работать с With activesheets и без точек, так что вы всегда имеете в виду только один лист?
@SJR нет, это зацикливается. Если я удалю с помощью Activesheets, он проигнорирует цикл и повлияет только на активный лист... почему я не уверен...
Мы вошли в Сумеречную зону!


Может попробовать
Sub HideBlanks()
Dim Ws As Worksheet
Dim Rw As Long
Dim Arr As Variant, Rng As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
For Each Ws In ThisWorkbook.Worksheets
If Ws.Index > 1 Then
Arr = Ws.Range("A4:A350").Value
For Rw = LBound(Arr) To UBound(Arr)
If Arr(Rw, 1) = "" Then
If Rng Is Nothing Then
Set Rng = Ws.Range("A" & Rw + 3)
Else
Set Rng = Union(Rng, Ws.Range("A" & Rw + 3))
End If
End If
Next Rw
End If
If Not Rng Is Nothing Then Rng.EntireRow.Hidden = True
Set Rng = Nothing
Next Ws
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
End Sub
Вот именно!!! Теперь, могу ли я быть болью и в идее быть прилежным, не могли бы вы немного объяснить, как работает код, немного... Я понимаю большую часть этого, но Set Rng = Union(Rng, Ws.Range("A" & Rw + 3)) и If Not Rng Is Nothing Then Rng.EntireRow.Hidden = True как бы бросают меня в тупик.
Добро пожаловать, @Roy. 1-й — это синтаксис для добавления дополнительных диапазонов в объединение диапазонов. 2-й - проверить, не встречаются ли пустые ячейки и Rng пуст.
Спасибо! Почему он установлен как «если не rng, то ничего»? Мне это кажется контринтуитивным...
попытка скрыть EntireRow с пустым Rng вызовет ошибку 91
Противоположное чему-то ничто @DanielRoy
избавиться от
Sheet.Activateи изменить с наWith Sheet