Как я могу ускорить циклы

Он работает нормально, но выполнение медленнее, чем хотелось бы, и я не уверен, почему. У меня есть еще один сегмент кода, который также меняет это...

Есть только 5 листов, которые он перебирает, и только в заданном диапазоне загружается. Он проверяет только нулевое значение в столбце A, и если оно равно нулю, строка скрывается.

Я пытался отключить расчеты, события и обновления экрана, но это все еще не быстро... Я где-то пропустил утечку памяти??? Он ведет себя так, как будто хочет разбиться, но потом продолжает...

    Sub HideBlanks()
    Dim Sheet As Worksheet
    Dim r As Long

    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual

    For Each Sheet In Worksheets
        If Sheet.Index > 1 Then
            With Sheet
                For r = 4 To 350
                    With activesheets
                        If Range("A" & r) = "" Then
                            Range("A" & r).EntireRow.Hidden = True
                        End If
                    End With
                Next r
            End With
        End If
        Range("a1").Select
    Next Sheet

    Worksheets(1).Activate

    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic

    End Sub

Может быть, я иду об этом совершенно неправильно...

Конечная цель состоит в том, чтобы скрыть (или запретить) пустые ячейки между A4:G350 от печати этих строк, если значение равно "".

избавиться от Sheet.Activate и изменить с на With Sheet

Scott Craner 19.02.2019 18:34

Затем используйте Union, чтобы создать диапазон ячеек, чтобы скрыть и скрыть один раз за пределами цикла на листе.

Scott Craner 19.02.2019 18:35

Можете ли вы объяснить союз, пожалуйста, Скотт?

Daniel Roy 19.02.2019 18:39
Application.Union
Mathieu Guindon 19.02.2019 18:44

Я не уверен, как это применить... У меня есть один аргумент, в основном это A null... следующая строка.

Daniel Roy 19.02.2019 18:52
stackoverflow.com/questions/53121616/…
Tim Williams 19.02.2019 19:03

Как ваш код вообще может работать с With activesheets и без точек, так что вы всегда имеете в виду только один лист?

SJR 19.02.2019 19:07

@SJR нет, это зацикливается. Если я удалю с помощью Activesheets, он проигнорирует цикл и повлияет только на активный лист... почему я не уверен...

Daniel Roy 19.02.2019 19:22

Мы вошли в Сумеречную зону!

SJR 19.02.2019 21:09
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
9
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Может попробовать

 Sub HideBlanks()
    Dim Ws As Worksheet
    Dim Rw As Long
    Dim Arr As Variant, Rng As Range

    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual

    For Each Ws In ThisWorkbook.Worksheets
        If Ws.Index > 1 Then
        Arr = Ws.Range("A4:A350").Value
          For Rw = LBound(Arr) To UBound(Arr)
            If Arr(Rw, 1) = "" Then
                If Rng Is Nothing Then
                Set Rng = Ws.Range("A" & Rw + 3)
                Else
                Set Rng = Union(Rng, Ws.Range("A" & Rw + 3))
                End If
             End If
            Next Rw
        End If
   If Not Rng Is Nothing Then Rng.EntireRow.Hidden = True
   Set Rng = Nothing
   Next Ws

    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic

    End Sub

Вот именно!!! Теперь, могу ли я быть болью и в идее быть прилежным, не могли бы вы немного объяснить, как работает код, немного... Я понимаю большую часть этого, но Set Rng = Union(Rng, Ws.Range("A" & Rw + 3)) и If Not Rng Is Nothing Then Rng.EntireRow.Hidden = True как бы бросают меня в тупик.

Daniel Roy 19.02.2019 19:40

Добро пожаловать, @Roy. 1-й — это синтаксис для добавления дополнительных диапазонов в объединение диапазонов. 2-й - проверить, не встречаются ли пустые ячейки и Rng пуст.

Ahmed AU 19.02.2019 20:04

Спасибо! Почему он установлен как «если не rng, то ничего»? Мне это кажется контринтуитивным...

Daniel Roy 19.02.2019 20:07

попытка скрыть EntireRow с пустым Rng вызовет ошибку 91

Ahmed AU 19.02.2019 20:30

Противоположное чему-то ничто @DanielRoy

Nacorid 20.02.2019 10:28

Другие вопросы по теме