2

ワークブックに 10 枚のシートがあり、10 番目のシートには最初の 9 枚のシートの名前が含まれています。各シートからカウントを取得するために、VBA を使用して FORMULA を作成しようとしていました。

たとえば、sheet1範囲 (a1:b500) からのデータがあり、カウントの基準は、列 A の空白以外のセルごとに、列 B に空白のセルがあるはずです。

範囲 (a1:a500) を 1 つの配列として取り、範囲 (b1:b500) を 2 番目の配列として取り、上記の基準に基づいてカウントを与える UDF を作成することは可能ですか? 関数の引数はシート名のみにする必要があります。たとえば、関数は引数として を使用する必要があります。=GetCount(sheet1)ここGetCountで、 は関数名で、sheet1 は引数です。

countifループを使用して解決策を見つけましたが、vba でループを使用したりsum(array)、Excel でループを使用したり、配列機能で試したりしたくない

Function GetCount(Str As String)
    Application.Volatile (True)
    Dim wb As Workbook
    Dim sh As Worksheet
    Dim rng1 As Range
    Dim r As Integer
    Dim strCount As Integer
        Set wb = Workbooks("Integrated Working Tracker")
        Set sh = wb.Sheets(Str)
        Set rng1 = sh.Range("a1:a500")
        For Each c In rng1.Cells
         If c.Value <> "" And c.Offset(0, 1).Value = "" Then
         strCount = strCount + 1
         End If
        Next
    GetCount = strCount
    Set sh = Nothing
    Set wb = Nothing
    Set rng1 = Nothing
End Function

どんな助けでも大歓迎です。前もって感謝します

4

1 に答える 1

1

sumproduct数式でこれを行うことができます。

セル自体では、数式は次のように機能します。

=SUMPRODUCT((A1:A500<>"")*(B1:B500=""))

個々の条件式は、計算で結合されている場合、1 または 0 に変換され、行単位の結果が合計されます。

VBA には がありますWorksheetfunction.SumProductが (私が覚えている限りでは、これを再度テストしていません)、これはこの「特定の」機能 (= ブール式を 1 または 0 に変換する) をサポートしていません。したがって、使用する必要がありますEvaluate

Function GetCount(shName As String)
    Dim wb As Workbook
    Dim sh As Worksheet

    Set wb = Workbooks("Integrated Working Tracker")
    Set sh = wb.Worksheets(shName)
    GetCount = sh.Evaluate("SUMPRODUCT((A1:A500<>"""")*(B1:B500=""""))")
End Function

編集:Strも統合関数であるため、変数名としては使用しません。

于 2013-09-08T09:48:35.160 に答える