excel vba worksheetfunction.sum - PullRequest
       3

excel vba worksheetfunction.sum

1 голос
/ 20 декабря 2011

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

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

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

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011

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

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

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

1 голос
/ 20 декабря 2011

Используя подход 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...