Как эффективно проходить через строки данных, чтобы соответствовать критерию с помощью Excel VBA? - PullRequest
0 голосов
/ 04 июня 2018

Обычно то, что я делаю в своей программе, использует логику:

Total_rows_worksheet = Worksheets("Sample").Range("A" & Rows.Count).End(xlUp).Row
For i = 2 to Total_rows_worksheet
    If Worksheets("Sample").Cells(i,1)=Criteria Then
       [Perform this action]
    End If
Next i

Однако, когда количество строк становится большим, код, который проходит через весь лист, становится немного медленным.Кроме того, я помню, как мой друг-программист говорил мне, что для начинающих программистов является распространенной ошибкой просматривать все данные.По его словам, правильным способом было указать на интересующие строки, но я не знаю точно, как это сделать в Excel.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

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

Sub testing()
    'Disable screen updating and calculation
    Dim uRange As Range
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    Total_rows_worksheet = Worksheets("Sample").Range("A" & Rows.Count).End(xlUp).Row
    For i = 1 To Total_rows_worksheet
        If Worksheets("Sample").Cells(i, 1) = "OK" Then
            If uRange Is Nothing Then
                Set uRange = Worksheets("Sample").Cells(i, 1)
            Else
                Set uRange = Union(uRange, Worksheets("Sample").Cells(i, 1))
            End If
        End If
    Next i
    uRange.Value = "THIS USED TO SAY OK"
    'Enable screen updating and calculation when done
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub

Редактировать 1: В зависимости от задачи, другой способ ускорить процесс - это изменить все сразу, добавивдиапазоны до объединения.

Примечание. Обновление экрана должно быть первым, которое должно быть отключено, и последним, которое должно быть включено при переходе на скорость в Excel-VBA.Есть и другие вещи, которые можно отключить, такие как События, которые также помогают, если у вас есть специфичные для события триггеры.

0 голосов
/ 04 июня 2018

Вы можете использовать что-то похожее на:

    Public roww
Sub Main()
    Dim sht
    roww = InputBox("Start Row", "Row to start", "", 8000, 6000)
    If roww <> "" Then
        Set sht = Sheets("Your sheet")
        'this is a validation
        Do Until sht.Cells(roww, "A").Value = ""
        'this is other optional validation
            If sht.Cells(roww, "Y").Text <> "" Then
                [Perform this action]
                roww = roww + 1
            Else
                roww = roww + 1
            End If
        Loop
    Else
End If
MsgBox ("The Process has been completed")
End Sub

Это должно прекратиться до последней строки с данными.

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