2008-11-13 4 views
1

Не знаете, сколько гуру Excel VBA, кроме меня ;-D, которые висят вокруг stackoverflow, но вот интересный вопрос.Excel VBA hide/show row code speed

Цель: эффективно отображать/скрыть строки на основе данных в строке.

  1. Создайте вспомогательную колонку, которая определяет, должна ли быть скрыта строка .
  2. Имейте формулу в столбце помощника , чтобы получить ошибку или число.
  3. Скрыть вспомогательную колонку и написать код , чтобы выполнить скрытие/показ.

Вопрос: Какой из следующих методов вы ожидаете быстрее? Столбец B является вспомогательным столбцом и всегда будет смежным.

Sub SetRowVisibility1() 

    Dim rowsToCheck As Range 
    With ActiveSheet 
    Set rowsToCheck = .Range(Range("B7"), Range("B7").End(xlDown)) 
    End With 

    Dim needToShow As Range, needToShow_Showing As Range 
    Dim needToHide As Range, needToHide_Showing As Range 

    Set needToShow = rowsToCheck.SpecialCells(xlCellTypeFormulas, xlNumbers) 
    Set needToHide = rowsToCheck.SpecialCells(xlCellTypeFormulas, xlErrors) 

    On Error Resume Next 
    Set needToShow_Showing = needToShow.Offset(0, 1).SpecialCells(xlCellTypeVisible) 
    Set needToHide_Showing = needToHide.Offset(0, 1).SpecialCells(xlCellTypeVisible) 
    On Error GoTo 0 

    If Not needToHide_Showing Is Nothing Then 
    needToHide_Showing.EntireRow.Hidden = True 
    End If 
    If Not needToShow Is Nothing Then 
    If needToShow.Count <> needToShow_Showing.Count Then 
     needToShow.EntireRow.Hidden = False 
    End If 
    End If 

End Sub 


Sub SetRowVisibility2() 

    Dim rowsToCheck As Range 
    With ActiveSheet 
    Set rowsToCheck = .Range(Range("B7"), Range("B7").End(xlDown)) 
    End With 

    Dim needToShow As Range, needToHide As Range 
    Dim cell As Range 
    For Each cell In rowsToCheck 

    If IsError(cell.Value) And (cell.EntireRow.Hidden = False) Then 
     If needToHide Is Nothing Then 
     Set needToHide = cell 
     Else 
     Set needToHide = Union(needToHide, cell) 
     End If 
    End If 

    If Not IsError(cell.Value) And (cell.EntireRow.Hidden = True) Then 
     If needToShow Is Nothing Then 
     Set needToShow = cell 
     Else 
     Set needToShow = Union(needToShow, cell) 
     End If 
    End If 

    Next cell 


    If Not needToHide Is Nothing Then needToHide.EntireRow.Hidden = True 
    If Not needToShow Is Nothing Then needToShow.EntireRow.Hidden = False 

End Sub 
+0

неправильная переменная на том, что должно быть 5-й потребностьюВторой снизу – 2008-11-13 20:40:10

ответ

1

есть другой способ, и это использовать й функции автоматического фильтра - после того, как все VBA имеет А в нем - использовать возможности применения везде, где это возможно так что этот бит кода является довольно коротким и сладким - предполагает, что данные являются смежным блоком в столбцах a и b и не принимают никакой другой обработки ошибок в игре. следующая строка возобновления позволяет включить фильтр.

Sub showHideRange() 
Dim testrange 
    testrange = Range("A1").CurrentRegion.Address 
    On Error Resume Next 
    testrange.AutoFilter 
    ActiveSheet.Range(testrange).AutoFilter Field:=2, Criteria1:="show" 
End Sub 
+0

Хороший очевидный ответ ... или просто функция автофильтра. Но тогда это не было бы «как сделать программно?» SO вопрос :) – 2008-11-14 03:56:58

0

Если вы не хотите, чтобы показать пользователю, что происходит, не было бы лучше, чтобы выполнить расчет в самом VBA, а не в скрытом столбце? Конечно, это, по-видимому, блокирует вас в варианте 2, который, как я подозреваю, является более медленным вариантом ... большая часть моего опыта VBA находится в более старых версиях Excel, поэтому я не имел удовольствия работать с некоторыми новыми функциями , и задачи, которые я выполнил, которые включали обработку строк данных, выполнялись по строкам.

Я предполагаю, что одна из возможных проблем с первым субкой заключается в том, что при возникновении проблемы с рабочим листом или значениями, которые вы используете для определения скрытия/показа, процесс завершится неудачно. Если вы проверяете строку за строкой, и есть строка, которая вызывает проблемы, вы можете пропустить эту строку и правильно обработать другие.