Код VBA для SUMIFS? - PullRequest
       11

Код VBA для SUMIFS?

1 голос
/ 09 января 2009

Я пытаюсь написать пользовательскую функцию, которая позволит мне получить ячейку из первой строки в диапазоне, который соответствует x количеству критериев. Я предполагаю, что это будет очень похоже на работу SUMIFS, просто проще в том, что он не продолжит обработку после первого совпадения.

Кто-нибудь знает код для воспроизведения функции SUMIFS (Excel 07) в VBA?

Так, например, если у меня есть таблица в Excel, как:

W X Y Z
a b 6 1
a b 7 2
b b 7 3

Я хочу иметь возможность написать функцию, которая даст мне значение в столбце Z, где столбцы W = a, X = b, Y> = 7 (другими словами, значение 2).

SUMIFS может приблизительно сделать это, предполагая, что запись, которую я хочу, уникальна, и я хочу вернуть число. Для моих целей эти предположения не сработают.

Ответы [ 3 ]

4 голосов
/ 09 января 2009

Пример использования 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")
1 голос
/ 20 декабря 2009

Deeno, наличие UDF для этого очень полезно, но вы также можете использовать старый =VLOOKUP().

VLOOKUP() работает только при поиске одного «ключа», но вы можете сделать связанный ключ в вспомогательном столбце слева. например:

W X Y Z    AA
a b 6 ab6  1
a b 7 ab7  2
b b 7 bb7  3

Тогда =VLOOKUP(A1,$Z$1:$AA$3,2,FALSE), если A1 имеет значение, которое вы ищете. Если ваши данные более сложны, вы можете объединить данные с неиспользуемым символом (например, труба), чтобы у вас был | B | 6 вместо ab6.

1 голос
/ 11 января 2009

IMHO ADO не подходит для использования в функциях листа Excel (низкая производительность и их нелегко использовать на листе, содержащем данные). вот альтернатива VBA:


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</p>

<pre><code>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

...