1

x個の基準を満たす範囲の最初の行からセルを取得できるカスタム関数を作成しようとしています。これはSUMIFSの動作と非常に似ていると思いますが、最初の一致後に処理を続行しないという点で単純です。

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(つまり値2)である列Zの値を取得する関数を記述できるようにしたいと思います。

SUMIFSは、必要なレコードが一意であり、数値を返すことを検討していると仮定して、ほぼこれを行うことができます。しかし、私の目的では、これらの仮定は機能しません。

4

3 に答える 3

4

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")
于 2009-01-09T15:49:30.623 に答える
1

Deeno、これにUDFがあると非常に便利ですが、昔ながらのを使用することもできます=VLOOKUP()

VLOOKUP()1つの「キー」を検索することによってのみ機能しますが、左側のヘルパー列に連結キーを作成できます。例えば:

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ではなくa | B|6になります。

于 2009-12-20T08:04:49.003 に答える
1

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

End Function

于 2009-01-11T13:37:09.827 に答える