문제

X 수의 기준을 충족하는 범위에서 첫 번째 행에서 셀을 검색 할 수있는 사용자 정의 기능을 작성하려고합니다. 나는 이것이 Sumif가 작동하는 방식과 매우 유사하다고 생각합니다. 첫 경기 후에도 처리를 계속하지 않는다는 점에서 더 간단합니다.

VBA에서 sumifs (Excel 07) 함수를 재현하는 코드를 아는 사람이 있습니까?

예를 들어, Excel에 테이블이있는 경우 다음과 같습니다.

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

열 w = a, x = b, y> = 7 열 z의 값을 줄 함수를 작성하고 싶습니다 (즉, 값 2).

Sumifs는 내가 원하는 레코드가 독특하다고 가정하고 숫자를 반환하려고합니다. 그러나 내 목적을 위해서는 이러한 가정이 효과가 없습니다.

도움이 되었습니까?

해결책

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

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

엔드 기능

다른 팁

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, 이것을 위해 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이 찾고있는 가치가 있다면. 데이터가 더 복잡한 경우 사용되지 않은 문자 (예 : 파이프)와 데이터에 결합하여 AB6 대신 | B | 6을 가질 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top