2016-12-06 2 views
-1

Я пытаюсь создать функцию для вычисления максимального диапазона на основе 2 критериев, как это делает функция Excel в 2016 году (MAX.IFS), насколько я знаю, что я делаю это нормально, но он возвращает ошибку #VALUE.Определенная пользователем функция для эмуляции Max.ifs в VBA 2010

Не могли бы вы мне помочь?

Option Base 1 
Function MaxIf(RangoUno As Range, RangoDos As Range, RangoTres As Range, RUno As Variant, RDos As Variant) As Variant 
Dim x() As Variant, y() As Variant, z() As Long, w() As Long 
Dim i As Long 
Dim ConstraintUno As Variant, ConstraintDos As Variant, k As Long 
i = 1 
k = 0 
ConstraintUno = RUno 
ConstraintDos = RDos 
x = RangoUno 'Rango que contiene la primera restricción 
y = RangoDos 'Rango que contiene la segunda restricción 
z = RangoTres 'Rango que contiene los valores numericos 
    For i = 1 To RangoUno.Rows.Count 
    If x(i, 1) = RUno Then 
    If y(i, 1) = RDos Then 
    k = k + 1 
    ReDim Preserve w(k, 1) 
    w(k, 1) = z(i, 1) ' w() es una matriz que almacena los valores numericos en cuya fila cumpla con las rectricciones 1 y 2 
     End If 
    End If 
    Next i 
MaxIf = application.max(w) 
End Function 
+0

Вы не можете 'ReDim Preserve w (k, 1)'. Только «Самый высокий размер» может измениться с помощью «ReDim Preserve». Поскольку вы используете только 1 для верхнего измерения, просто транспонируйте массивы. – Comintern

+0

Вы можете полностью избавиться от размеров 'w', просто сделав его' Long' вместо массива 'Long', инициализируя его' -2,147,483,648', а затем используя 'If z (i, 1)> w Тогда w = z (i, 1) '. Это избавляет от необходимости также «Application.Max». (Но мне не нравится тот факт, что 'w' объявлен как' Long' в любом случае - он, несомненно, путает людей, которые используют эту функцию.) – YowE3K

ответ

3

Две вещи, чтобы исправить код:

1) Изменение z() as long в z() as Variant

2) Вы не можете redim w так, как вы делаете (с 2D массива). Тем не менее, вы можете избежать этой головной боли, делая w одномерный массив, так как вы просто держать простые значения в нем, чтобы вызвать Application.Max ...

ReDim Preserve w(k) 
w(k) = z(i, 1) 
.... 
MaxIf = application.max(w) 

ОДС работал хорошо для меня после того, как эти изменения.

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