2011-12-20 2 views
1

У меня есть функция, которая должна вычислять сумму в массиве ячеек. Эта функция вызывается в другой подпрограмме очень часто и поэтому должна быть реальной. Сначала я использовал цикл for для получения чисел, но он был слишком медленным. Затем я хотел использовать функцию листа, но это не работает по неизвестным причинам. Вот код функции:excel vba workheetfunction.sum

Function CalcMD(rownumbers, colnumber) 

Dim MMDRow As Integer 
Dim SearchRange As String 
Dim FirstAddress As Boolean 

MMDRow = MMDRow() 
FirstAddress = False 
SearchRange = "" 

'building the search range 
For i = 0 To UBound(rownumbers) 
    If rownumbers(i) > 0 And rownumbers(i) < MMDRow Then 
     If FirstAddress = False Then 
      SearchRange = SearchRange & cells(rownumbers(i), colnumber).Address(False, False) 
      FirstAddress = True 
     Else 
      SearchRange = SearchRange & ";" & cells(rownumbers(i), colnumber).Address(False, False) 
     End If 
    End If 
Next 

CalcMD = WorksheetFunction.Sum(Range(SearchRange)) 

End Function 

Есть ли лучший/быстрый способ получить этот результат?

+1

Что такое 'MMDRow()'? И увидеть скриншот или рабочий пример того, что вы хотите достичь, будет удобно :) – brettdj

+0

Я получаю массив всех рябинов, где определенное имя находится в ячейке. Но мне не нужна последняя строка, где это имя, потому что в нем содержится ячейка для суммы других строк. Функция вычисляет сумму человеко-дней в ежемесячной колонке. Если это значение больше, чем максимальное допустимое значение, я должен уменьшить значения в этом столбце. После каждого уменьшения я вызываю функцию, чтобы проверить, равна ли сумма максимально допустимому значению. Поэтому он должен быть очень быстрым. Надеюсь, это поможет. – user366121

+0

MMDRow() - это еще одна функция, которая получает строку над суммами. – user366121

ответ

2

. Попробуйте. Самая сложная часть - найти последнюю строку, которую вы хотите суммировать, я думаю, что это то, где мы должны работать, если эта первая попытка не решит ваше дело.

Function CalcMD(rownumbers, colnumber) 

    Dim MMDRow As Integer, iMaxRow As Integer 
    Dim SearchRange As String 

    MMDRow = MMDRow() 

    'Find the last row where you want to sum the data 
    iMaxRow = WorksheetFunction.Min(MMDRow - 1, WorksheetFunction.Max(rownumbers)) 

    CalcMD = WorksheetFunction.Sum(Cells(iMaxRow, colnumber)) 

End Function 

Пожалуйста, обратите внимание, что не так много проверки ошибок здесь (особенно для проверки входных данных)

+0

Привет, я пробовал ваш код, и он не работает, потому что вы пытаетесь найти ячейку, в которой находится сумма. Я не хочу найти эту камеру. Я хочу рассчитать по rowarray, что фактически представляет собой сумма, потому что формула в последней строке не может быть обновлена ​​соответствующим образом, и тогда у меня будет неправильная сумма для распространения. Я должен перебирать все строки, добавлять все значения и извлекать сумму. – user366121

+0

Думаю, у меня есть лучшая идея. Я вычисляю разницу и вызываю функцию один раз, а затем делаю это, пока разница не станет равной нулю. – user366121

1

Использование подхода JMax в:

Function CalcMD(rownumbers, colnumber) 

    Dim MMDRow As Integer, iMaxRow As Integer 
    Dim SearchRange As String 

    MMDRow = MMDRow() 

    'Find the last row where you want to sum the data 
    iMaxRow = WorksheetFunction.Min(MMDRow - 1, WorksheetFunction.Max(rownumbers)) 

    CalcMD = WorksheetFunction.SumIF(Cells(iMaxRow, colnumber),">0") 

End Function 

Это то, что вы ищете?