VBA EXCEL Скрытие строк на основе значения ячейки происходит очень медленно - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть код ниже, чтобы скрыть / показать целые строки в зависимости от соответствующего значения ячейки (скрыть, если это 0), и он отлично работает.

Это список материалов и кнопка «Завершить». В конце списка вы нажимаете кнопку, и любой элемент с количеством = 0 должен скрывать эту соответствующую строку.

Работает нормально. Но проблема в том, что это очень медленно. Как вы можете видеть, это 400+ строк, и я буквально вижу, как линии исчезают. Он обрабатывает примерно 20 строк в секунду, что делает список более 20 секунд. И этот список будет удваиваться каждые несколько месяцев.

Итак, вопрос в том, существует ли какой-либо другой метод, который скрывает соответствующие строки в одно мгновение или, по крайней мере, быстрее, чем в настоящее время?

Большое спасибо!

Hide:

Public Sub HideRows()
Dim cell As Range
    For Each cell In ActiveSheet.Range("H18:H469")
    cell.EntireRow.Hidden = (cell.Value = 0 And cell.Value <> "")
Next cell
End Sub

Unhide:

Public Sub UnhideRows()
Dim cell As Range
    For Each cell In ActiveSheet.Range("H18:H469")
    If (cell.Value = 0 And cell.Value <> "") Then cell.EntireRow.Hidden = False
    Next cell
End Sub

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Я просто печатал, как появилось в комментариях. Используйте Union, чтобы собрать квалификационные диапазоны и спрятаться сразу Я не уверен, почему вы делаете двойной тест. Не будет = 0 будет достаточно? Или, как @ Marcucciby2 запросы, вы намеревались Or?

И как уже упоминалось в другом ответе, вы можете провести некоторую оптимизацию, переключив такие вещи, как ScreenUpdating, pageBreaks и переключившись в режим ручного вычисления.

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

Option Explicit
Public Sub HideRows()
    Dim cell As Range, unionRng As Range
    For Each cell In ActiveSheet.Range("H18:H469")
        If cell.Value = 0 Then
            If Not unionRng Is Nothing Then
                Set unionRng = Union(unionRng, cell)
            Else
                Set unionRng = cell
            End If
        End If
    Next
    If Not unionRng Is Nothing Then unionRng.EntireRow.Hidden = True
End Sub
0 голосов
/ 02 ноября 2018

Отключите обновление экрана и ручные вычисления при запуске вашего кода. Обязательно включите, если снова в конце кода.

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    '...your code...
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...