Как использовать WorksheetFunction.max / maxifs, чтобы найти максимальное значение в «столбце» многомерного массива - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть двумерный массив в vba, и я хочу использовать worksheetfunction.max и worksheetfunction.maxifs, чтобы найти максимальное значение в «столбце» массива.Я знаю, что могу использовать цикл для этого, но набор данных очень большой, и я хочу сократить время обработки.Кто-нибудь знает, могут ли таким образом использоваться worksheetfunction.max и worksheetfunction.maxifs, и если да, какие-либо идеи по поводу синтаксиса использовать?

1 Ответ

0 голосов
/ 11 апреля 2019

Я провел простой тест, рассчитывающий цикл цикла с функцией Max WorksheetFunction в одномерном массиве. Кажется, что их скорость сопоставима.

Вам потребуется использовать WorksheetFunction.Index в сочетании с WorksheetFunction.Max для многомерных массивов. Это сделало бы цикл массива явно быстрее из многомерных массивов

Test Array Loop Versus Max Function

Тестовый код

Option Explicit
Sub TestTimes()
    Dim Max1 As Long, Max2 As Long, results() As Long, n As Long, t1 As Double, t2 As Double
    results = getData

    For n = 1 To 10
        t1 = getWorksheetFunctionMaxTime(results, Max1)
        t2 = getWorksheetFunctionMaxTime(results, Max2)

        Debug.Print "WorksheetFunction Time: "; t1, "Array Loop Time: "; t2, Max1 = Max2
    Next
End Sub


Function getData() As Long()
    Dim results(1 To 10000000) As Long
    Dim r As Long
    For r = 1 To 10000000
        results(r) = r
    Next
    getData = results
End Function

Function getWorksheetFunctionMaxTime(ByRef results() As Long, ByRef Max As Long) As Double
    Dim t As Double: t = Timer
    Max = WorksheetFunction.Max(results)
    getWorksheetFunctionMaxTime = Round(Timer - t, 2)
End Function

Function getLoopArrayMaxTime(ByRef results() As Long, ByRef Max As Long) As Double
    Dim r As Long, LocalMax As Long
    Dim t As Double: t = Timer
    For r = 1 To 10000000
        If results(r) > LocalMax Then LocalMax = r
    Next
    Max = LocalMax
    getLoopArrayMaxTime = t
End Function
...