VBA-Code für SUMIFS?
-
06-07-2019 - |
Frage
Ich versuche, eine benutzerdefinierte Funktion zu schreiben, das mir eine Zelle aus der ersten Reihe in einem Bereich abrufen lassen, die x Anzahl von Kriterien erfüllt. Ich stelle mir das wäre sehr ähnlich die Art und Weise funktioniert SUMIFS, nur einfacher, dass sie nicht weiter die Verarbeitung nach dem ersten Spiel.
Hat jemand Code kennt die SUMIFS (Excel 07) Funktion in VBA?
zu reproduzierenSo zum Beispiel, wenn ich eine Tabelle in Excel habe wie:
W X Y Z
a b 6 1
a b 7 2
b b 7 3
Ich möchte in der Lage sein, eine Funktion zu schreiben, die mir den Wert in Spalte Z geben, wo Spalten W = a, X = b, Y> = 7 (mit anderen Worten der Wert 2).
SUMIFS kann dies etwa tun, vorausgesetzt, die Platte, die ich will, ist einzigartig und ich bin auf der Suche eine Reihe zurückzukehren. obwohl für meine Zwecke, werden diese Annahmen nicht funktionieren.
Lösung
IMHO ADO ist für den Einsatz in Excel-Tabellenfunktionen nicht geeignet (schlechte Leistung und nicht leicht auf das Arbeitsblatt verwendet werden, um die Daten enthält). hier ist eine VBA Alternative:
Function MFind(theRange As Range, ParamArray Tests() As Variant) As Variant
'
' Parameters are:
' The Range to be searched
' the values to be searched for in successive columns
' all search values except the last use =
' the last search value uses >=
' the function returns the value from the last column in the range
'
Dim vArr As Variant
Dim j As Long
Dim k As Long
Dim nParams As Long
Dim blFound As Boolean
vArr = theRange.Value2
nParams = UBound(Tests) - LBound(Tests) + 1
If nParams >= UBound(vArr, 2) Then
MFind = CVErr(xlErrValue)
Exit Function
End If
For j = 1 To UBound(vArr)
blFound = True
For k = LBound(Tests) To nParams - 2
If vArr(j, k + 1) <> Tests(k) Then
blFound = False
Exit For
End If
Next k
If blFound Then
If vArr(j, nParams) >= Tests(nParams - 1) Then
MFind = vArr(j, UBound(vArr, 2))
Exit For
End If
End If
Next j
End Function
Andere Tipps
Ein Beispiel unter Verwendung von ADO.
strFile = Workbooks(1).FullName
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
& ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open strCon
'I want to be able to write a function that will give me the value '
'in column Z where columns W=a, X=b, Y>=7 '
'(in other words the value 2).'
strSQL = "SELECT Top 1 Z " _
& "FROM [Sheet1$] " _
& "WHERE W='a' And X='b' And Y>=7"
rs.Open strSQL, cn
Result = rs.Fields("Z")
Deeno, ein UDF für diese aufweist, ist sehr nützlich, aber auch das gute alte =VLOOKUP()
nutzen könnten.
VLOOKUP()
funktioniert nur durch ein „Schlüssel“ aufzublicken, aber Sie können einen verketteten Schlüssel in einer Helfer-Spalte links machen. zB:
W X Y Z AA
a b 6 ab6 1
a b 7 ab7 2
b b 7 bb7 3
Dann =VLOOKUP(A1,$Z$1:$AA$3,2,FALSE)
wenn A1 den Wert hatte die Sie suchen. Wenn Ihre Daten mehr ist kompliziert Sie die Daten mit einem nicht verwendeten Zeichen anschließen konnte. (ZB: ein Rohr), so haben Sie eine | B | 6 statt ab6