адаптировать МАЛЫЙ (, ИНДЕКС (ЧАСТОТА ..) к VBA - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь найти минимальное ненулевое значение. Я нашел следующий пример в Интернете и безуспешно пытался адаптировать его к VBA.

=SMALL((A1,C1,E1),INDEX(FREQUENCY((A1,C1,E1),0),1)+1)

Вот моя адаптация:

myarr = Array(A, B, C)
.Range(Cells(D, 1), Cells(WorksheetFunction.Small(myarr,WorksheetFunction.Index(WorksheetFunction.Frequency(myarr, 0), 1) + 1),1)).EntireRow.Delete

где A, B, C, D - четыре целых числа.

В окне отладки функция SMALL возвратила «вне контекста», и как только эта строка кода была выполнена, компилятор выходит из подпрограммы, как если бы была выполнена команда «Выход из подпрограммы».

Полагаю, функция ЧАСТОТА не работает. Как заставить это работать?

Только для трех значений легко использовать нефункциональное решение, такое как вложенные IF, но меня интересует, как заставить функции работать так, как мне может понадобиться в будущем.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Не совсем уверен, что вы делаете, но вы можете выполнить MIN IF внутри Evaluate с массивом

Option Explicit
Public Sub GetMinGreaterThanZero()
    Dim arr()
    arr = Array(0, 4, 2, 1)
    Debug.Print Evaluate("=MIN(IF({" & Join(arr, ";") & "}>0,{" & Join(arr, ";") & "}))")
End Sub
0 голосов
/ 07 ноября 2018

Здесь есть несколько вариантов - самый простой вариант, , если у вас Office 365, - это использовать функцию MINIFS, например: WorksheetFunction.MinIf(myarr, myarr, "<>0")

Но, поскольку вы не отметили вопрос как , я буду использовать другую опцию:

Private Function MinPositive(Values As Variant) As Variant
    MinPositive = CVErr(xlErrValue)
    On Error GoTo FuncErr
    Dim TempVal As Double, Pointer As Long
    If IsArray(Values) Then
        TempVal = WorksheetFunction.Max(Values) 'High bound
        If TempVal <= 0 Then Exit Function 'No values greater than 0
        For Pointer = LBound(Values) To UBound(Values)
            If CDbl(Values(Pointer)) > 0 And CDbl(Values(Pointer)) < TempVal Then
                TempVal = CDbl(Values(Pointer)) 'Swap for lower number
            End If
        Next Pointer
    End If
    MinPositive = TempVal 'Output the Min value greater than 0
FuncErr:
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...