2016-12-08 4 views
1

Я попытался адаптировать код из другого сообщения во что-то более легкое для понимания. При запуске кода я все равно получаю сообщение об ошибке «Тип несоответствия» для этой строки: w(k) = z(i, 1). Кто-нибудь имеет представление об этой ошибке?Создать код VBA для MAXifs

Моего код

Option Base 1 

Function MaxIf(MaxRange As Range, Lookup_Range1 As Range, Var_Range1 As Variant, _ 
       Lookup_Range2 As Range, Var_Range2 As Variant) As Variant 

    Dim x() As Variant, y() As Variant, z() As Variant, w() As Long 
    Dim i As Long 
    Dim Constraint1 As Variant, Constraint2 As Variant, k As Long 

    i = 1 
    k = 0 
    Constraint1 = Var_Range1 
    Constraint2 = Var_Range2 
    x = Lookup_Range1 
    y = Lookup_Range2 
    z = MaxRange 

    For i = 1 To Lookup_Range1.Rows.Count 
     If x(i, 1) = Var_Range1 Then 
      If y(i, 1) = Var_Range2 Then 
       k = k + 1 
       ReDim Preserve w(k) 
       w(k) = z(i, 1) 
      End If 
     End If 
    Next i 
    MaxIf = Application.Max(w) 

End Function    
+4

Каково значение 'z (i, 1)', когда вы получаете ошибку? Я предполагаю, что он содержит строку «String», ошибку или какой-либо другой тип данных, который нельзя неявно отбрасывать в «Long». Вы можете проверить, добавив строку 'Debug.Assert IsNumeric (z (i, 1))' непосредственно над линией ошибки. – Comintern

+0

@ Diedrich попытается объяснить, что вы хотите от своей 'функции'? Возможно, добавьте экранный снимок рабочего листа и каков ожидаемый результат. –

+0

Я думаю, вы пытаетесь получить max в диапазоне, когда соответствующие ячейки в других столбцах соответствуют определенным критериям. Вы можете достичь этого с помощью простой формулы, такой как 'MAX (- (Range1 = Criteria1) * - (Range2 = Criteria2) * MaxRange), например. 'Max (- (A1: A15 =" John ") * - (B1: B15 = 20) * C1: C15)' – nightcrawler23

ответ

0

, поскольку вы заинтересованы в возвращении максимального значения из некоторых выбирать между MaxRange диапазоном, то вы можете перебрать его числовых только значения и проверки условий в соответствующем клетки Lookup_Range1 и Lookup_Range2 только, как следует:

Function MaxIF(MaxRange As Range, Lookup_Range1 As Range, Var_Range1 As Variant, _ 
       Lookup_Range2 As Range, Var_Range2 As Variant) As Variant 

    Dim LU1 As Variant, LU2 As Variant 
    Dim founds As Long 
    Dim cell As Range 

    LU1 = Lookup_Range1.Value2 '<--| store Lookup_Range1 values 
    LU2 = Lookup_Range2.Value2 '<--| store Lookup_Range2 values 

    ReDim ValuesForMax(1 To MaxRange.Rows.count) As Long '<--| initialize ValuesForMax to its maximum possible size 
    For Each cell In MaxRange.Columns(1).SpecialCells(xlCellTypeConstants, xlNumbers) 
     If LU1(cell.row, 1) = Var_Range1 Then '<--| check 'Lookup_Range1' value in corresponding row of current 'MaxRange' cell 
      If LU2(cell.row, 1) = Var_Range2 Then '<--| check 'Lookup_Range2' value in corresponding row of current 'MaxRange' cell 
       founds = founds + 1 
       ValuesForMax(founds) = CLng(cell) '<--| store current 'MaxRange' cell 
      End If 
     End If 
    Next cell 
    ReDim Preserve ValuesForMax(1 To founds) '<--| resize ValuesForMax to its actual values number 
    MaxIF = Application.max(ValuesForMax) 
End Function 

где я дал более значимые имена переменным

+0

Спасибо за помощь всем. user3598756, я получаю ошибку Runtime Ошибка 9 «индекс вне диапазона» при запуске вашего кода, в строке: Если LU1 (cell.Row, 1) = Var_Range1 Then '<- | проверьте значение «Lookup_Range1» в соответствующей строке текущей ячейки «MaxRange». Знаете ли вы, что может быть причиной этого? – Diedrich

+0

Какие три диапазона вы передали функции? – user3598756

+0

Все они были определены диапазонами с использованием последних строк. Что-то вроде: диапазон (листы («данные»). Ячейки (2, определенный столбец), листы («данные»). Ячейки (последняя строка, определенный столбец)), я не могу предоставить фактический код прямо сейчас, поскольку я в настоящее время работаю и не имею доступа к своему персональному компьютеру/файлам. Сегодня я могу отправить фактические диапазоны. Еще раз спасибо! – Diedrich

0

После получения кода для работы было ограничено, что вы ограничены двумя условиями. Я решил продолжить этот код, чтобы не ограничивать количество условий для функции MaxIfs. См. Здесь код:

Function MaxIfs(MaxRange As Range, ParamArray Criteria() As Variant) As Variant 
    Dim n As Long 
    Dim i As Long 
    Dim c As Long 
    Dim f As Boolean 
    Dim w() As Long 
    Dim k As Long 
    Dim z As Variant 

    'Error if less than 1 criteria 
    On Error GoTo ErrHandler 
    n = UBound(Criteria) 
    If n < 1 Then 
     'too few criteria 
     GoTo ErrHandler 
    End If 

    'Define k 
    k = 0 

    'Loop through cells of max range 
    For i = 1 To MaxRange.Count 

    'Start by assuming there is a match 
    f = True 

     'Loop through conditions 
     For c = 0 To n - 1 Step 2 

      'Does cell in criteria range match condition? 
      If Criteria(c).Cells(i).Value <> Criteria(c + 1) Then 
       f = False 
      End If 

     Next c 

     'Define z 
     z = MaxRange 

     'Were all criteria satisfied? 
     If f Then 
      k = k + 1 
      ReDim Preserve w(k) 
      w(k) = z(i, 1) 
     End If 

    Next i 

    MaxIfs = Application.Max(w) 

    Exit Function 
    ErrHandler: 
    MaxIfs = CVErr(xlErrValue) 

End Function 

Этот код позволяет использовать несколько условий.

Этот код был разработан с учетом большого количества кода, отправленного Хансом В. в Lounge Lounge.

Diedrich

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