2013-08-10 2 views
1

В настоящее время я работаю над книгой Excel/VBA, которая отображает ок. 500 предметов в бюджете, каждый в другом ряду. Я хочу, чтобы пользователь выбирал уровень детализации в бюджете: на самом высоком уровне каждый отдельный элемент будет показан, на более низком уровне детализации несколько элементов будут сгруппированы под одним заголовком.Эффективное скрытие/отображение нескольких (+500) строк в Excel VBA

Метод, описанный ниже (скрытие/скрытие строки), очень медленный: для скрытия/отображения большинства элементов требуется около 4 минут. Надеюсь, у вас есть какие-то намеки на меня, как ускорить программу!

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

1) Обновление экрана подающий:

 Application.ScreenUpdating = False 
     Application.EnableEvents = False 

2) для каждой позиции в бюджете определяется, должна ли эта строка быть скрытой или нет. Код, я использую для этого является следующее:

with sheets("[name sheet here]") 
     .Range("[identifier of budget line item here]").EntireRow.Hidden = False/True 
     ...    
     [500 times] 
     ... 
    end with 

3) Во-вторых, в зависимости от уровня детализации, текст, соответствующий подколлекторных сделан белый или черный. Это сделано около 20 строк:

With Sheets("[name sheet here]").Range("[identifier of budget line item here]").Font 
     .ThemeColor = xlThemeColorLight1 
     .TintAndShade = 0 
    End With 

4) И, наконец, опять же в зависимости от уровня детализации, некоторые линии перерисованы, которые становятся невидимыми, когда скрываются некоторые строки. Это делается в 10 раз или так для различных диапазонов:

Range("[range here]").Select 
     Selection.Borders(xlDiagonalDown).LineStyle = xlNone 
     Selection.Borders(xlDiagonalUp).LineStyle = xlNone 
     Selection.Borders(xlEdgeLeft).LineStyle = xlNone 
     Selection.Borders(xlEdgeTop).LineStyle = xlNone 
     With Selection.Borders(xlEdgeBottom) 
      .LineStyle = xlContinuous 
      .ColorIndex = 0 
      .TintAndShade = 0 
      .Weight = xlThin 
    End With 

ответ

0

Почему бы не просто скрыть большие диапазоны строк вместо одной строки в то время? Как

Sub HideRows() 
    ActiveSheet.Range(Cells(1, 1), Cells(500, 1)).EntireRow.Hidden = True 
End Sub 
Sub UnHideRows() 
    ActiveSheet.Range(Cells(1, 1), Cells(500, 1)).EntireRow.Hidden = False 
End Sub 
5

Просто некоторые общие мысли.

  1. Применить автофильтр к диапазону данных, используя уровень детализации, используемый пользователем в качестве критерия фильтрации. Если вы не хотите, чтобы результат выглядел как автофильтр, вы можете программно скрыть стрелку вниз в верхней части каждого столбца. Способ описан here.

  2. Если вы не хотите, чтобы пользователь представлял автофильтр, вы все равно можете использовать его для фильтрации. Шаги будут: использовать автофильтр для фильтрации (не показывать) строки, которые вы делаете не хотите скрыть; назначить фильтрованные строки переменной диапазона; удалить фильтр; скрыть в массе строки, указанные в переменной диапазона. См. this SO post для рабочего примера техники.

  3. Прокрутите список, используя функцию Union, чтобы собрать все строки, которые вы хотите скрыть, в один объект диапазона, а затем скрыть строки, установив свойство IsHidden True для строк в диапазоне (HideRange.EntireRow.IsHidden = True). (См here для примера подхода, который в этом случае используется для удаления выбранных строк.)

Любой из этих методов будет принимать гораздо меньше, чем 4 минуты, чтобы скрыть rowsl.

+0

Hi Chuff, попробовал третий подход и работает как шарм: от 4 до 5 минут до нескольких секунд. Спасибо за вашу помощь! –

+0

по какой-то причине, это не работает для меня. Я получаю сообщение об ошибке: «Объект не поддерживает это свойство или метод». Что я могу делать неправильно? –

+0

Я могу выбрать диапазон конечных продуктов, чтобы убедиться, что это действительно правильный диапазон. Тем не менее, я все еще получаю вышеуказанную ошибку. (FYI Диапазон не соприкасается.) EDIT: Это должно быть свойство «Скрыто», а не «IsHidden». –