2013-10-03 4 views
2

Я использую этот сайт уже несколько месяцев, чтобы помочь мне начать работу в моей ранней карьере кодирования, и это мой первый пост здесь. Прошу прощения, если я пропустил этот вопрос во время поиска на форумах вчера. У меня была таблица с примерно 6 000 активных Sumifs, ссылающихся на таблицу из 500 000 строк. Как вы можете себе представить, это заняло минуту, чтобы вычислить. Я написал их в VBA, поэтому они вычисляют только тогда, когда пользователь решает это сделать. Тем не менее, с таким количеством sumifs, код занимает около 3-5 минут. Я ищу способы ускорить это для лучшего опыта конечных пользователей. Я опубликую, как я выполняю sumifs ниже. Как раз для некоторого контекста, это выполняет sumifs для одной и той же группы пользователей дважды, но с одним другим критерием. Дайте мне знать, если я оставил любую соответствующую информацию.Нужна помощь в оптимизации SUMIFS в VBA

For i = 1 To 12 
    Range("Emp_Utility").Offset(1, i).Activate 
    Do Until Cells(ActiveCell.Row, 2) = "" 
     ActiveCell.Value = Application.WorksheetFunction.SumIfs(Hrs, Emp, Cells(ActiveCell.Row, 2), Y, Cells(4, ActiveCell.Column), M, Cells(3, ActiveCell.Column)) 
     ActiveCell.Offset(1, 0).Activate 
    Loop 
Next i 

For a = 1 To 12 
    Range("Emp_Billable").Offset(1, a).Activate 
    Do Until Cells(ActiveCell.Row, 30) = "" 
     ActiveCell.Value = Application.WorksheetFunction.SumIfs(Hrs, Emp, Cells(ActiveCell.Row, 2), Y, Cells(4, ActiveCell.Column), M, Cells(3, ActiveCell.Column), Bill, "No") 
     ActiveCell.Offset(1, 0).Activate 
    Loop 
Next a 
+0

Похоже, что вы должны смотреть в сводные таблицы. – user2140261

+0

Хотел бы я. Не достаточно динамично для того, что мне нужно. Это всего лишь один шаг нескольких в процессе экспорта мгновенных отчетов. – Clouse24

ответ

2

Загрузите диапазоны в варианты массивов, а затем напишите SUMIFS в коде, не используя формулы. Если вам нужны примеры, дайте мне знать, и я проведу вас через это.

EDIT: No prob. Вот пример.

Sub example() 

    Dim EmpUtil, EmpBillable As Variant ' Creates variant array 

    EmpUtil = Range("Emp_Utility")  'Places Range into EmpUtil Array 
    EmpBillable = Range("Emp_Billable") 'Places Range into EmpBillable Array 

    For x = LBound(EmpUtil) To UBound(EmpUtil) 'Cycles through EmpUtil Rows 
     'Do comparisons and additions here 
     'References to arrays should be something like 
     ' "EmpUtil(x,3) = example" - for the 3rd column 

     'for calculations on each column you cycle through each column for that row 
     For y = LBound(EmpUtil, 2) To UBound(EmpUtil, 2) 
      EmpUtil(x, y) = Calculation 

     Next y 


    Next x 

    For x = LBound(EmpBillable) To UBound(EmpBillable) 'Cycles through EmpBillable Rows 
     'Do comparisons and additions here 


    Next x 

    Range("Emp_Utility") = EmpUtil   'Places EmpUtil Array back into Range 
    Range("Emp_Billable") = EmpBillable 'Places EmpBillable Array back into Range 


End Sub 

Это должно заставить вас начать.

+0

Привет, я могу определенно использовать пример. Я довольно неопытен с массивами в VBA. Благодаря! – Clouse24

+0

Там вы идете, если вам нужна любая другая помощь, дайте мне знать. Кроме того, не забудьте пересмотреть, если это полезно или принять ответ, если это то, что вам нужно. – jlaverde

+0

Спасибо! это определенно выглядит более эффективным. Быстрый вопрос об исполнении вычислений. У меня есть 12 столбцов, у меня есть EmpUtil (x, 1) = расчет EmpUtil (x, 2) = расчет ETC .... – Clouse24

1

Вы можете рассмотреть альтернативу SUMIFS (что может потребоваться навсегда для вычисления), например сочетание SUM и SORT. См. Ответ на вопрос How to perform SumIf using VBA on an array in Excel, в котором рассматривается комбинация SUM и SORT, что приводит к очень быстрым вычислениям, в то же время возвращающим те же значения, что и при использовании метода SUMIFS.

Смежные вопросы