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 reproduzieren

So 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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top