Я пытаюсь суммировать значения на основе дубликатов, найденных в столбцах «AO».Использую макрос ниже.Имеется около 500 тыс. Записей, и приведенный ниже макрос зависает плохо.
Sub Formulae(TargetCol1, TargetCol2, ConcatCol, Col1, Col2, StartRow, EndRow, Sheet)
Sheets(Sheet).Range(TargetCol1 & CStr(StartRow)).Formula = "=SUMIF($" & ConcatCol & "$" & CStr(StartRow) & ":$" & ConcatCol & "$" & CStr(EndRow) & "," & ConcatCol & CStr(StartRow) & ",$" & Col1 & "$" & CStr(StartRow) & ":$" & Col1 & "$" & CStr(EndRow) & ")"
Sheets(Sheet).Range(TargetCol1 & CStr(StartRow)).Select
Selection.Copy
Sheets(Sheet).Range(TargetCol1 & CStr(EndRow)).Select
Range(Selection, Selection.End(xlUp)).Select
Application.CutCopyMode = False
Selection.FillDown
Call PasteSpecial(TargetCol1, "T", StartRow, EndRow)
Sheets(Sheet).Range(TargetCol2 & CStr(StartRow)).Formula = "=SUMIF($" & ConcatCol & "$" & CStr(StartRow) & ":$" & ConcatCol & "$" & CStr(EndRow) & "," & ConcatCol & CStr(StartRow) & ",$" & Col2 & "$" & CStr(StartRow) & ":$" & Col2 & "$" & CStr(EndRow) & ")"
Sheets(Sheet).Range(TargetCol2 & CStr(StartRow)).Select
Selection.Copy
Sheets(Sheet).Range(TargetCol2 & CStr(EndRow)).Select
Range(Selection, Selection.End(xlUp)).Select
Application.CutCopyMode = False
Selection.FillDown
Call PasteSpecial(TargetCol2, "U", StartRow, EndRow)
End Sub
Sub PasteSpecial(Col1, Col2, StartRow, EndRow)
Range(Col1 & CStr(StartRow)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Range(Col2 & CStr(StartRow)).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub
Позвольте мне кратко объяснить макрос.У меня есть столбцы "AO", и я должен сгруппировать их ... на основе группировки я должен суммировать столбцы "P, Q".У меня есть функция, которая делает объединенную строку из 16 столбцов и сохраняет в столбце «AA».Основываясь на этом столбце, я использую функцию sumif для суммирования всех повторяющихся значений
=SUMIF($AA$2:$AA$500000,$AA2,$P$2:$P$500000)
=SUMIF($AA$2:$AA$500000,$AA2,$Q$2:$Q$500000)
Затем я копирую вставить в качестве 'значений' специальные значения как указанные выше значения, чтобы удалить формулу, в 2 новых столбцах (функция pasteSpecial в приведенном выше макросекод).
Наконец, я вызываю команду удаления дубликатов, чтобы удалить дублирующиеся значения.
Я использовал метод .removeduplicates, который, кажется, работает довольно быстро даже на таком огромном наборе данных.Существует ли в Excel какая-либо предопределенная функция, которая бы суммировала значения дубликатов, а затем удаляла дубликаты?
Sub Remove_Duplicates_In_A_Range(StartRow, EndRow, Sheet, StartCol, EndCol, level)
Sheets(Sheet).Range(StartCol & CStr(StartRow) & ":" & EndCol & CStr(EndRow)).RemoveDuplicates Columns:=20, Header:=xlNo
End Sub
Приведенная выше логика плохо зависает, съедая все ресурсы процессора и приводя к сбою ...
Кто-нибудь, пожалуйста, оптимизируйте макрос выше, чтобы он работал с 500k + записями.Максимальная производительность 1-2 минуты.
Пожалуйста, помогите !!!
РЕДАКТИРОВАТЬ: 500k + записи Я имею в виду A1: O500000.Таким способом я должен проверить наличие дубликатов комбинации A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1 с A2, B2, C2, D2,E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2 и A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, L3, M3, N3,O3 и т. Д. .... до A500000, B500000 и т. Д. ...
Короче говоря, я должен проверить все совпадения набора A1-O1 со всем A2-O2 или A3-O3 или ..... A500k-O500k и т. Д.
Для каждого совпадения всего набора записей AO мне нужно суммировать их соответствующие столбцы P, Q.Например, набор A1-O1, соответствующий набору A2-O2, затем добавьте P1, Q1 и P2, Q2 и сохраните в P1, Q1 или что-то в этом роде.
В любом случае мне нужно сохранить каждый исходный набор записей, например, A1-O1 с суммированными значениями его дубликатов и его собственных в P1, Q1
Не думаю, что мы можем прикрепить здесь демонстрационную таблицу Excel, не так ли?: (*
РЕДАКТИРОВАТЬ2:
Функция для репликации формулы Sumif во всех ячейках
Sub PreNettingBenefits(StartRow1, EndRow1, StartRow2, EndRow2, Col_Asset, Col_Liab, Src_Col_Asset, Src_Col_Liab, ConcatCol, Src_ConcatCol, level, Sheet2, Sheet1)
'=SUMIF(Sheet1!$AA$2:$AA$81336,Sheet2!AA2,Sheet1!$P$2:$P$81336)
Application.Calculation = xlCalculationAutomatic
Sheets(Sheet2).Range(Col_Asset & CStr(StartRow2)).Formula = "=SUMIF(" & Sheet1 & "!$" & Src_ConcatCol & "$" & CStr(StartRow1) & ":$" & Src_ConcatCol & "$" & CStr(EndRow1) & "," & Sheet2 & "!" & ConcatCol & CStr(StartRow2) & "," & Sheet1 & "!$" & Src_Col_Asset & "$" & CStr(StartRow1) & ":$" & Src_Col_Asset & "$" & CStr(EndRow1) & ")"
Sheets(Sheet2).Range(Col_Asset & CStr(StartRow2)).Select
Selection.Copy
MsgBox Sheets(Sheet2).Range(Col_Asset & CStr(EndRow2)).Address
Sheets(Sheet2).Range(Col_Asset & CStr(EndRow2)).Select
Range(Col_Asset & CStr(StartRow2) & ":" & Col_Asset & CStr(EndRow2)).Select
Application.CutCopyMode = False
Selection.FillDown
Sheets(Sheet2).Range(Col_Liab & CStr(StartRow2)).Formula = "=SUMIF(" & Sheet1 & "!$" & Src_ConcatCol & "$" & CStr(StartRow1) & ":$" & Src_ConcatCol & "$" & CStr(EndRow1) & "," & Sheet2 & "!" & ConcatCol & CStr(StartRow2) & "," & Sheet1 & "!$" & Src_Col_Liab & "$" & CStr(StartRow1) & ":$" & Src_Col_Liab & "$" & CStr(EndRow1) & ")"
Sheets(Sheet2).Range(Col_Liab & CStr(StartRow2)).Select
Selection.Copy
MsgBox Sheets(Sheet2).Range(Col_Liab & CStr(EndRow2)).Address
Sheets(Sheet2).Range(Col_Liab & CStr(EndRow2)).Select
Range(Col_Liab & CStr(StartRow2) & ":" & Col_Liab & CStr(EndRow2)).Select
Application.CutCopyMode = False
Selection.FillDown
Application.Calculation = xlCalculationManual
End Sub
Это зависает очень плохо. Что проблема в репликацииформула для строк 30–40 тыс. Кто-нибудь может оптимизировать код?