VBA,使用多个条件从每张纸上获取计数

时间:2013-09-08 05:55:10

标签: arrays excel-vba vba excel

我的工作簿中有10张,第10张包含前9张的名称。我试图使用VBA创建一个FORMULA来从每张表中获取计数。

例如,我在范围(a1:b500)的sheet1中有数据,并且计数的标准是针对A列中的每个非空白单元格,B列中应该有一个空白单元格。 / p>

是否可以创建一个UDF,它将范围(a1:a500)作为一个数组,范围(b1:b500)作为第二个数组,并根据上述标准给出计数?函数中的参数应该只是工作表名称 - 例如,函数应该将参数作为=GetCount(sheet1),其中GetCount是函数名称,sheet1是参数。

我找到了使用循环的解决方案,但我想避免在vba中使用循环,在Excel中使用countifsum(array)并使用数组功能试用

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

非常感谢任何帮助。提前谢谢

1 个答案:

答案 0 :(得分: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也是一个集成函数,我不会将它用作变量名。