2013-01-02 331 views
1

我环顾了Stackoverflow论坛(基本上在Google上的其他任何地方),并且发现了很多“几乎”如果我对VBA更熟悉一点就足够了,但是我已经搞砸了一段时间了,而且还没有弄清楚。有点沮丧,所以我觉得是时候问了!对不起,如果我解释我的问题时得到错误等错误!这可能只是我的语法问题。VBA Countif(s)语法问题(和/或关于多个条件)

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

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

这个公式,可能相当不出所料,工作得很好。但我需要标识(或任何我需要的)也能够给我的尺寸< = 8.5 x < = 11以及翻转尺寸(< = 11 x < = 8.5)。

我试图改变公式样形式(以及类似)

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

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

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

“如果X(0)< = 8.5和x(1)< = 11或 X(1)< = 8.5和x(0)< = 11然后

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

你能告诉您想要验证的列数据的一小部分样本? – bonCodigo

+0

当然。列可能有数据是这样的: 8.6×11 8.5×11 8.5×11 8.5×11 8.5×11 8.4×11 22×11 – Finch042

+0

你说你还“需要找到网页”于是这些相应的“页面”是你要查找的?最好只是通过添加一部分专栏来更新你的问题:)剪切粘贴就可以了。我更新了你的数据,你能告诉我们你有什么,在下一列中有相应的页面名称吗? – bonCodigo

回答

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 
+0

在使用你的UDF和你的例子(把我的数据放在列A中)我只是得到0的结果。我猜我有些东西我只是不理解? – Finch042

+0

查看我的编辑 - 更新您的第一个使用案例。 –

+0

看起来像是完美的工作。非常感谢。有没有相应的方法来适应这个非UDF?我意识到我正在分裂头发,这更关注我的好奇心。基本上有这种情况发生,但是将结果放入特定的单元格而不必输入公式?我希望其他人能够在按下按钮之后使用它。谢谢。 – Finch042