我已经浏览了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
答案 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