Очистить формат с использованием VBA - это медленно, можно ли лучше переписать приведенный ниже код - PullRequest
1 голос
/ 19 июня 2020

Код используется для удаления текущего формата, удаления формата на основе значения ячейки = 3 в столбце A

Sub Format1()

Dim I As Long
Dim LastRow As Long
Dim lrowno As Long

Application.ScreenUpdating = False

LastRow = Range("B" & Rows.count).End(xlUp).Row


    For lrowno = 4 To LastRow  
        If Range("A" & lrowno).Value = 3 Then  
            Range("H" & lrowno, "I" & lrowno).ClearFormats        
        End If  
        lrowno = lrowno + 4 
    Next lrowno  

    MsgBox ("Report is Generated")  

End Sub

1 Ответ

1 голос
/ 19 июня 2020
  1. Для повышения скорости вы должны уменьшить количество операций чтения / записи ячеек до минимума. Поэтому вы можете прочитать весь столбец A в массиве (чтобы проверить там значения) и собрать все диапазоны, которые вы хотите очистить, формат в переменной RangeToClear.

  2. Никогда не беспорядок с переменной счетчика lrowno = lrowno + 4 в For l oop. Либо используйте Do l oop, где вы можете увеличить счетчик самостоятельно, либо используйте Step 5, чтобы увеличить Next на 5 вместо 1.


Option Explicit

Public Sub FormatReport()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1") 'specify your sheet

    Dim LastRow As Long
    LastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

    Dim ValuesOfColumnA() As Variant 'read column A into an array for faster data access!
    ValuesOfColumnA = ws.Columns(1).Value

    Dim RangeToClear As Range

    Dim iRow As Long
    For iRow = 4 To LastRow Step 5
        If ValuesOfColumnA(iRow, 1) = 3 Then 'checking the array is much faster than checking the cell!
            If RangeToClear Is Nothing Then 'first range to clear
                Set RangeToClear = ws.Range("H" & iRow, "I" & iRow)
            Else 'append/union all the other ranges to clear
                Set RangeToClear = Application.Union(RangeToClear, ws.Range("H" & iRow, "I" & iRow))
            End If
        End If
    Next iRow

    'if something to clear was found then clear
    If Not RangeToClear Is Nothing Then
        RangeToClear.ClearFormats
    End If

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