VBA Countif(s)语法问题(和/或关于多个条件)

时间:2013-01-02 18:08:01

标签: vba syntax excel-vba countif excel

我已经浏览了Stackoverflow论坛(基本上是谷歌的其他地方)并且已经找到了很多“差不多”的问题答案,如果我对VBA更熟悉可能就足够了,但我已经与它混乱了一段时间,并没有能够解决。有点沮丧,所以我觉得是时候问了!对不起,如果我在解释我的问题时出现错误等等错误!这可能只是我的语法问题。

基本上我需要能够从电子表格中的列中获取数据,并让它对特定参数集的单元格进行Countifs(我认为无论如何)。我需要的所有数据都是页面尺寸,格式为“Dimension1 x Dimension 2”,例如“8.5 x 11”

Valtest = Application.WorksheetFunction.CountIfs(Range("P:P"), "8.5 x 11")

这个公式可能并不令人惊讶,效果很好。但我需要countifs(或我需要的任何东西)也能够给我尺寸< = 8.5 x< = 11以及翻转尺寸(< = 11 x< = 8.5)。

我尝试将公式更改为(和类似的)

等格式
Valtest = Application.WorksheetFunction.CountIfs(Range("P:P"), "<=8.5" & " x " & "11")

但是这将报告一个尺寸,例如3 x 4或22 x 11.我知道countifs可以使用多个参数(这就是为什么我正在搞乱它而不仅仅是一个普通的countif),但我不知道如果输入多个参数甚至是正确的路径,或者如果它是正确使用引用的东西或者...谁知道?

我能够使If-then语句正常工作(使用数组并使用计数器循环遍历每个单元格),但这显然不是最快的方法。在这里,只是为了让我的目标更清晰一些。

'如果x(0)<= 8.5且x(1)<= 11或 x(1)&lt; = 8.5并且x(0)<= 11然后

在相关问题中,我还需要能够查找例如&lt; = 11 x&lt; = 17或某些内容的页面,而不包括上一个问题的搜索结果(8.5 X 11) 。所以我需要知道多个参数的正确语法,这些参数会涉及类似于&lt; 8.5但less&gt; = 17的内容。

提前致谢!任何帮助都非常感谢。如果我没有充分解释,请告诉我。

编辑:我将要搜索的数据示例:

A                     Count for 8.5 x 11 (expected output)
8.6 x 11              5
8.5 x 11  
8.5 x 11  
8.5 x 11  
8.5 x 11  
8.4 x 11  
22 x 11  
10 x 17   

1 个答案:

答案 0 :(得分:1)

您可以尝试使用此UDF:复制并粘贴到常规VBA模块。您可以分别传递一个范围,以及小尺寸和大尺寸的下限/上限。

例如:计算8到10之间的小边以及12到14之间(包括)的大边的所有尺寸:

=CountSizes(A:A,8,10,12,14)

编辑:针对您的特定用例8.5x11或更小

=countsizes(A:A, 0, 8.5, 0, 11)  'one side btw 0 and 8.5 & one side btw 0 and 11.5   

EDIT3:展示如何使用VBA而不是UDF,包括第二列

Sub Tester()
    With ThisWorkBook.Sheets("Pages")
        'count only where second column has "Color"
        .Range("B1").Value = CountSizes(.Range("A:B"), "Color", 0, 8.5, 0, 11)
    End With
End sub

代码:

Function CountSizes(rng As Range, colorType As String, _
                     smallGE, smallLE, largeGE, largeLE)

    Dim tmp, val, v1, v2, small, large, arr, arrVals
    Dim num As Long, r As Long, nr As Long

    num = 0
    arr = rng.Value
    nr = UBound(arr, 1)
    For r = 1 To nr
        val = Trim(arr(r, 1))
        If val Like "*x*" Then
            arrVals = Split(val, "x")
            v1 = Trim(arrVals(0))
            v2 = Trim(arrVals(1))
            If IsNumeric(v1) And IsNumeric(v2) Then
                v1 = CDbl(v1)
                v2 = CDbl(v2)
                If v1 > v2 Then
                    small = v2: large = v1
                Else
                    small = v1: large = v2
                End If

                If small >= smallGE And small <= smallLE And _
                   large >= largeGE And large <= largeLE Then

                    If Trim(arr(r, 2)) = colorType Then
                        num = num + 1
                    End If

                End If

            End If
        End If
    Next r

    CountSizes = num
End Function