2017-10-14 51 views
1

我做了一些宏,我升級了Diedrich的一個宏,在excel 2010中有一個MaxIfs,它與行代碼放在一起。我需要幫助來創建miniifs vba功能?

Public Function maxifs(MaxRange As Range, ParamArray Criteria() As Variant) As Variant 
Application.Volatile 
Dim n As Long 
Dim i, j As Long 
Dim c As Variant 
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 
    For j = 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, j).Value <> Criteria(c + 1) Then 
      f = False 
     End If 

    Next c 

    'Define z 
    z = MaxRange 

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

    Next j 
Next i 

maxifs = Application.Max(w) 
Exit Function 

ErrHandler: 
maxifs = CVErr(xlErrValue) 


End Function 

所以現在我會做minifs,如果我所有的價值都是正面的,那麼它不起作用。

我該怎麼辦?

PS:如果你在這個宏最大的位數的變化,將工作太

謝謝您的回答。

+0

難道我們要明白,功能maxifs作品,但沒有按minifs 「T?那麼,非工作代碼在哪裏?你能澄清一下嗎? – ccprog

回答

1

這是因爲你從數組w在0空槽,因爲您填寫的第一個時隙爲時隙1

所以w(0)0,其中,當所有的人都積極它是最小數。
因此更改K=-1而不是K=0最初將值分配給k時。

我也在循環前面移動z,沒有理由繼續分配該數組。它只需要分配一次。

此外,我改變了一些範圍,只查看使用的範圍,這樣您可以使用完整的列引用。

此外,循環需要通過行和列,而不是通過整個範圍的兩個循環,因爲它會導致許多不必要的循環。

Public Function minifs(MaxRange As Range, ParamArray Criteria() As Variant) As Variant 
Application.Volatile 
Dim n As Long 
Dim i, j As Long 
Dim c As Variant 
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 z 
z = Intersect(MaxRange, MaxRange.Parent.UsedRange).Value 
'Define k 
k = -1 

'Loop through cells of max range 
For i = 1 To UBound(z, 1) 
    For j = 1 To UBound(z, 2) 

'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 Intersect(Criteria(c), Criteria(c).Parent.UsedRange).Cells(i, j).Value <> Criteria(c + 1) Then 
      f = False 
     End If 

    Next c 



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

    Next j 
Next i 

minifs = Application.Min(w) 
Exit Function 

ErrHandler: 
minifs = CVErr(xlErrValue) 


End Function 

也記,因爲這隻會做標準=而不是任何其他功能一樣><<>,....

+0

好吧,我也會改變我的maxifs!謝謝你!你解決並保存我的宏 – Nicpir