Нет конкретного вопроса / проблемы, но вот мои предложенные улучшения кода.
- В частности, я бы не стал выполнять процедуру
Hidden
, пока у вас не появятся все строки.Таким образом, вы больше не будете делать то, что нужно выполнить только один разЭто всегда будет наилучшей практикой при обработке и манипулировании данными. Внесите изменения в лист ПОСЛЕ того, как вы определили диапазон. - С вышеуказанным изменением вам не нужно выключать
ScreenUpdating
. - Функция
Evaluate
в порядке, но, возможно, isEmpty
- лучший вариант.Вероятно, есть несколько более быстрые методы, возможно, проверка нескольких операторов if, но это занимает доли секунды в тысячах строк (вероятно, не стоит исследовать). - Технически вам не нужно переходить на
rows
.Вы можете обойтись одной ячейкой в строке, а затем проверить следующие две, см. Использование Offset
для генерации этого диапазона.Это также создает более динамичный характер, чем использование жестко закодированных столбцов («A» / «B» ... и т. Д.) Long
рекомендуется более Integer
, но это довольно мало, и яЯ только упомянул это , потому что я написал об этом здесь. . Технически вам даже не нужно это с вышеуказанными изменениями.
Вот код:
Sub HideTableRows()
Dim c As Range, hIdeRNG As Range, WS As Worksheet
'based on OP xlsm file.
Set WS = Sheet4
'used range outside of used range to avoid an if-statement on every row
Set hIdeRNG = WS.Cells(Rows.Count, 1)
'loops through range of single cells for faster speed
For Each c In Range("ForecastTable[Group]").Cells
If IsEmpty(Range(c, c.Offset(0, 2))) = 0 Then
'only need a single member in the row.
Set hIdeRNG = Union(hIdeRNG, c)
End If
Next c
'Hides rows only if found more than 1 cell in loop
If hIdeRNG.Cells.Count > 1 Then
Intersect(WS.UsedRange, hIdeRNG).EntireRow.Hidden = True
End If
End Sub
Заключительная мысль: В Excel, предположительно в начале 2019 года, появятся некоторые важные усовершенствования, которые могут быть полезны для ситуаций такого типа, если вы ищете решение, отличное от VBA. Нажмите здесь длябольше информации от MS.