У меня SUMIF работает действительно очень медленно. Мои данные имеют 14 800 строк и 39 столбцов.Excel VBA SUMIF Супер медленный код
я сделать следующее:
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
отредактирован ADD более потенциально соответствующий код, который может быть взаимодействующий с командой SumIf
Это может иметь отношение к вопросу скорости, так что я буду упоминать Это. Я хочу, чтобы пользователь открыл файл, где бы они ни хранили отчет. Затем файл остается открытым. Возможно, это проблема. Я не знаю, должно ли это быть каким-то другим способом. Например, я закрываю его, но помню адрес или что-то в этом роде?
Все работает через 8-10 секунд, пока мы не поднимемся ниже. Теперь общее время прыгает до 150 секунд.
.Range(range_Total_Folder_Fixed).Formula = "=SUMIF(" & range_FolderId_Fixed & "," & range_FolderId_Cell & "," & range_FolderNotional_Fixed & ")"
Я делаю что-то неправильно? Есть ли лучший (более эффективный) способ написать общую формулу?
EDIT: Код сгенерирован Сырая формула
Некоторые функции рабочего листа первенствовать в моем коде:
.Range(range_Isnumber).Formula = "=(RIGHT(" & range_TradeId_cell & ",2)<> ""IB"")*1"
.Range(range_Is_IB).Formula = "=(RIGHT(" & range_TradeId_cell & ",2)= ""IB"")*1"
.Range(range_Exceptions).Formula = "=(SUMIF(" & range_FolderId_Fixed & "," & range_FolderId_Cell & "," & range_Isnumber_fixed & ")= COUNTIF(" & range_FolderId_Fixed & "," & range_FolderId_Cell & "))*1+(SUMIF(" & range_FolderId_Fixed & "," & range_FolderId_Cell & "," & range_Is_IB_fixed & ")= COUNTIF(" & range_FolderId_Fixed & "," & range_FolderId_Cell & "))*1 "
.Range("C13").FormulaR1C1 = "=SUM(IF(FREQUENCY(MATCH([SCL_FL_2013_11_30.xlsx]Rest!R2C2:R2321C2,[SCL_FL_2013_11_30.xlsx]Rest!R2C2:R2321C2,0),MATCH([SCL_FL_2013_11_30.xlsx]Rest!R2C2:R2321C2,[SCL_FL_2013_11_30.xlsx]Rest!R2C2:R2321C2,0))>0,1))"
Так Материала как
Range("I2")=SUMIF($H$2:$H$5,H2,$G$2:$G$5)
Где данные могут быть как
RowG RowH RowI
Alice 1 4
Alice 3 4
Bob 9 17
Bob 8 17
Dan 2 2
edit2: Реализация решения Сэма, я получаю ошибки:
Set range_FolderId_Fixed = .Range(.Cells(2, FolderId_column), .Cells(FinalRow, FolderId_column))
Set range_FolderId_Cell = .Range(.Cells(2, FolderId_column),.Cells(FinalRow, FolderId_column))
Set range_FolderNotional_Fixed = .Range(.Cells(2, FolderNotional_column), .Cells(FinalRow, FolderNotional_column))
Set range_Total_Folder_Fixed = .Range(.Cells(2, Total_Folder_Column), .Cells(FinalRow, Total_Folder_Column))
.Range(range_Total_Folder_Fixed).Value = SumIf_func(range_FolderId_Fixed, range_FolderId_Cell, range_FolderNotional_Fixed)
Я получаю приложение типа или объекта определяется ошибки в следующей строке.
.Range(range_Total_Folder_Fixed).Value = SumIf_func(range_FolderId_Fixed, range_FolderId_Cell, range_FolderNotional_Fixed)
Я понятия не имею, что делать дальше.
ли Вы [режим вычисления изменения] (http://www.cpearson.com/excel/optimize.htm) к руководству на всех в макросе? Это может помочь ускорить его. – Sam
@Sam Спасибо. Да, у меня есть это в руководстве в начале кода . – Amatya
Вам нужны функции CountIf на листе? или вы были бы счастливы, если бы макрос просто ввел результат функции в диапазон? – Sam