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К строк - это довольно большой объем данных, и у вас все еще будут проблемы со временем