【问题标题】:VBA Countif(s) Syntax issue (and/or about multiple conditions)VBA Countif(s) 语法问题(和/或关于多个条件)
【发布时间】:2013-01-02 18:08:00
【问题描述】:

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

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

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

这个公式,可能并不令人惊讶,工作得很好。但我需要 countifs(或任何我需要的)也能够给我尺寸

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

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

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

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

'如果 x(0)

在一个相关问题中,我还需要能够找到例如 =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   

【问题讨论】:

  • 您能否展示您尝试验证的列数据的小样本?
  • 当然。一列可能包含如下数据: 8.6 x 11 8.5 x 11 8.5 x 11 8.5 x 11 8.5 x 11 8.4 x 11 22 x 11
  • 您说您还“需要查找页面”。那么您要查找的这些对应的pages 是什么?最好只是通过附加部分列来更新您的问题:) 剪切粘贴就可以了。我更新了你的数据,你能告诉我们你有什么,下一栏对应的页面名称吗?
  • 我只想将 countifs 语句的总数/结果输出到工作表上的另一个单元格。因此,在我用作示例的数据中,我希望找到每一页
  • @boncodigo 你编辑的格式没问题。这样做的最终结果是,我希望能够获取大量页面大小数据,将其粘贴到电子表格的一列中,并让 excel 告诉我一个单元格中的 8.5 x 11 参数适合多少页,另一个单元格中的 11 x 17 参数。等

标签: vba syntax excel countif


【解决方案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

【讨论】:

  • 在使用您的 UDF 和您的示例(将我的数据放在 A 列中)时,我得到的结果为 0。我猜有些东西我只是不理解?
  • 看起来效果很好。非常感谢。有没有一种等效的方法可以将其调整为非 UDF?我意识到我正在分裂头发,这更多是出于我的好奇心。基本上会发生这种情况,但是是否将结果放入特定单元格而无需输入公式?我希望其他人只需按下按钮或其他东西就可以使用它。谢谢。
  • 它和普通函数一样好用——你可以从另一个 Sub 调用它。我将编辑答案以表明这一点。
  • 是的。我开始自己整理。再次感谢。你和@bonCodigo 帮了大忙。感谢你们俩。希望我所做的工作看起来像您将要进行的编辑!呵呵。
  • 好的!不幸的是,还有一个!假设我在同一个电子表格中有另一列。它与每个维度条目重合,它可以是“颜色”或“黑白”,所以 A:A 将是您已经为我排序的维度,B:B 将是这两个维度之一。如何让这个当前的宏报告到两个单独的单元格中?一个用于颜色,一个用于黑白。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 2013-06-17
相关资源
最近更新 更多