Excel VBA для суммирования по нескольким критериям (строка 500k) - PullRequest
0 голосов
/ 16 декабря 2018

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

Sub aqua()
    Dim Markets As Worksheet
    Set Markets = Sheets("sheet4")
    Sheets("DATA").Range("A:A").Name = "list1"
    Sheets("DATA").Range("L:L").Name = "list2"
    Sheets("DATA").Range("M:M").Name = "Printed"
    Sheets("DATA").Range("E:E").Name = "list3"
    Sheets("sheet4").Range("AP:AP").Name = "list4"
    Markets.Range("c1:c20").Name = "MARKET"
    Sheets("DATA").Cells(4, "V") = [sum(if((isnumber(match(list1,market,0)))*(list2>0)*(list1<>"")*(not(isnumber(match(list4,list3,0)))),printed))]
End Sub

1 Ответ

0 голосов
/ 16 декабря 2018

Excel - не лучший инструмент для обработки больших объемов данных, например, 500 тыс. Строк

Более того, вы фактически обрабатываете 1 миллион строк, так как ссылаетесь на целом столбцов (например, «A: A», «L: L», ...)

Следовательно, возможное улучшение может заключаться в ограничении количества строк до фактического минимального числа следующим образом:

Option Explicit

Sub aqua()
    Dim Markets As Worksheet:  Set Markets = Worksheets("Sheet4")
    Dim DATA As Worksheet: Set DATA = Worksheets("DATA")

    Dim list1Rows As Long, list2Rows As Long, list4Rows As Long, printedRows As Long, nRows As Long

    list1Rows = GetLastRowIndex(DATA, "A")
    list2Rows = GetLastRowIndex(DATA, "L")
    printedRows = GetLastRowIndex(DATA, "M")
    list4Rows = GetLastRowIndex(DATA, "AP")
    nRows = WorksheetFunction.Max(list1Rows, list2Rows, list4Rows, printedRows) ' get the actual maximum rows number for "matching" list

    With DATA
        .Range("A1").Resize(nRows).Name = "list1" '
        .Range("L1").Resize(nRows).Name = "list2"
        .Range("M1").Resize(nRows).Name = "Printed"

        .Range("E1").Resize(GetLastRowIndex(DATA, "E")).Name = "list3"
    End With

    With Markets
        .Range("AP1").Resize(nRows).Name = "list4"
        .Range("c1:c20").Name = "MARKET"
    End With


    DATA.Cells(4, "V") = [sum(if((isnumber(match(list1,market,0)))*(list2>0)*(list1<>"")*(not(isnumber(match(list4,list3,0)))),printed))]
End Sub

Function GetLastRowIndex(sht As Worksheet, colName As String) As Long
    With sht
        GetLastRowIndex = .Cells(.Rows.Count, colName).End(xlUp).Row
    End With
End Function

в любом случае, 500К строк - это довольно большой объем данных, и у вас все еще будут проблемы со временем

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