Скрыть / показать скорость кода строки - PullRequest
1 голос
/ 13 ноября 2008

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

  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

Ответы [ 2 ]

1 голос
/ 14 ноября 2008

есть другой способ, и это заключается в использовании функции автофильтрации - после того, как в VBA есть A - используйте функции приложения везде, где это возможно поэтому этот фрагмент кода довольно короткий и приятный - предполагается, что данные представляют собой непрерывный блок в столбцах 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 голосов
/ 03 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...