1

我浏览了 Stackoverflow 论坛(基本上是 Google 上的其他任何地方),并找到了很多“几乎”我的问题的答案,如果我对 VBA 更熟悉一点,这些答案可能就足够了,但我已经搞砸了它有一段时间,一直无法理清。有点沮丧,所以我想是时候问了!抱歉,如果我在解释我的问题时出现措辞等错误!这可能只是我的语法问题。

基本上我需要能够从电子表格中的列中获取数据,并让它对一组特定参数的单元格进行计数(我认为无论如何)。我需要的所有数据都是页面尺寸,格式为“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) <= 8.5 且 x(0) <= 11 则

在一个相关问题中,我还需要能够找到例如 <=11 x <=17 或其他内容的页面,但不包括我之前的问题 (8.5 X 11) 的搜索结果。所以我需要知道多个参数的正确语法,这些参数会涉及到像 <8.5 但小于 >=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   
4

1 回答 1

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
于 2013-01-02T19:26:33.790 回答