альтернатива для вложенных циклов для более быстрого выполнения - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть вложенный цикл for, который сначала проходит по 10-15 тыс. Строк, сравнивает ячейку в этой строке с другой таблицей, в которой 40 тыс. Строк +, если он находит совпадение, он возвращает это совпадение, в противном случае «запись не записывается»в клетке. код работает нормально, просто исследуя альтернативный подход, чтобы он работал быстрее. В настоящее время 13000 линий занимает от 50 минут до часа. Я посмотрел на массивы, но загрузка массива с 40k + элементов кажется неправильным маршрутом. отчет часто запускается по битам за раз, поэтому при первом создании он может иметь 2 тыс. строк, затем к нему можно добавить 3 тыс. строк, код ниже пропустит строки, которые он уже проверил, и выберет, где он остановился. ,любая помощь приветствуется

For i = 2 To lastRow
    If Cells(i, 83).Value <> "" Then GoTo NextIteration:
    Sheets("mft Rpt").Cells(i, 83) = "No Record"
    model = Sheets("MFT RPT").Cells(i, 11).Value
    trimModel = Replace(Replace(model, " ", ""), "-", "")
    For j = 1 To lastCollateralRow
        If trimModel = Sheets("Promosheet Table").Cells(j, 1).Value Then
            Sheets("MFT RPT").Cells(i, 83) = Sheets("promosheet Table").Cells(j, 3).Value
        End If
    Next j
NextIteration:
Next i

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

спасибо @ Михал

немного поиграл с ним. Я сократил время выполнения с почти часа до 7 или 8 минут, используя этот код. прекрасно работает !!

Dim promoList As Range
Dim rngMatch As Range
Dim arrList As Variant
Dim arrMatch As Variant
Dim z


Set promoList = Sheets("promosheet table").Range("A1:A" & lastcollateralRow)
arrList = Application.Transpose(promoList.Value)
Set rngMatch = Sheets("Mft rpt").Range("K2:K" & lastRow)
arrMatch = Application.Transpose(rngMatch.Value)
For z = LBound(arrMatch) To UBound(arrMatch)
    arrMatch(z) = Replace(Replace(arrMatch(z), " ", ""), "-", "")
Next

For A = 1 To lastRow
    If Cells(A + 1, 83).Value <> "" Then GoTo skip:
    Sheets("mft rpt").Cells(A + 1, 83) = "No Record"
    For b = 1 To lastcollateralRow + 1
        If arrMatch(A) = promoList(b) Then
            Sheets("mft rpt").Cells(A + 1, 83) = promoList(b, 3)
            GoTo skip
        End If
    Next
skip:
Next
0 голосов
/ 08 ноября 2019

Это всего лишь подтверждение концепции, вам необходимо настроить переменные и диапазоны в соответствии с вашими потребностями.

Sub ProofOfConcept()

    Dim rngList As Range
    Dim rngMatch As Range

    Dim arrList As Variant
    Dim arrMatch As Variant

    Set rngList = Range("A1:A50000")
    arrList = Application.Transpose(rngList.Value)

    Set rngMatch = Range("C1:D15000")
    arrMatch = Application.Transpose(rngMatch.Value)

    For a = 1 To 15000
        For b = 1 To 50000
            If arrMatch(1, a) = arrList(b) Then
                arrMatch(2, a) = "Match found"
                GoTo skip
            End If
        Next
skip:
    Next

    rngMatch = WorksheetFunction.Transpose(arrMatch)




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