在我的Excel电子表格中,我有两列。
我需要一个函数来确定B列中一年的出现次数,其中A列中的等价值为“是”。
我目前有以下代码:
Function CountIfYearAndValue(Rng As Range, YNM As String, Year As String) As Integer
Dim count As Integer
count = 0
For Each c In Rng.Cells
If (StrComp(Abs(c.Value), Year, vbTextCompare) = 0) And (StrComp(Cells(c.Row, A), YMN, vbTextCompare) = 0) Then count = count + 1
Next
CountIfYearAndValue = count
End Function
这段代码的想法是我们遍历给定范围内的每个单元格(列B上的范围)并检查年份是否等于Year
参数。如果A列上的等效单元格等于YNM
参数,我们会增加count
变量。
由于某些原因,当我使用以下参数时,此代码不起作用:
=CountIfYearAndValue('Years'!B1:B7,"Yes","Year 7")
它只是出现#VALUE
错误并拒绝显示任何结果。
非常感谢任何帮助。
编辑:两个单元格中的所有值都是未格式化的数据类型(“常规”),并且没有单元格为空。
答案 0 :(得分:5)
听起来你正在重新发明轮子......已经有一个内置功能(优势:比UDF 快得多),完全你的内容之后。它被称为COUNTIFS()
第1行到第10行中YES
的所有Year 7
个。
=COUNTIFS(B1:B10, "Year 7",A1:A10, "Yes")
我只是快速查看了您的代码,我认为可能有一些原因导致原始代码无法正常工作。
YNM
是有效的列名,因此不应将其用作变量名。你应该避免像这样命名你的变量 - 给它一个更有意义的名字
YNM
!= YMN
(查看函数定义,然后是StrComp()
函数中的拼写错误的版本)
Year
是一个有效的VBA内置函数,因此您应该再次避免将其用作变量名,因为您将自己暴露给命名冲突。
在模块顶部添加Option Explicit
。这要求您Dim
确定所有变量。由于许多原因,它总是被推荐。
rng
变量属于Range
类型,因此您无需向其显式添加.Cells
属性。即使它在某些情况下可能会有所帮助 - 在更高级别的情况下,您可能会面临一些运行时类型兼容性问题。 (运行时可能会将您的rng
范围变量转换为2D数组等)
在StrComp()
周围的第二个c.Offset(0, -1)
函数中添加了显式转换,因为您不希望运行时(罕见但仍可能)转换您的Yes
到Boolean
数据类型。明确转换为String
只会为您提供额外保护; p(lol)
因此,这样的东西会返回正确的值
Function CountIfYearAndValue(rng As Range, choice As String, myYear As String) As Long
Dim count As Long
count = 0
Dim c As Range
For Each c In rng
If (StrComp(c, myYear, vbTextCompare) = 0) And (StrComp(CStr(c.Offset(0, -1)), choice, vbTextCompare) = 0) Then
count = count + 1
End If
Next c
CountIfYearAndValue = count
End Function
是的,我希望这可以帮助你理解点点滴滴:)任何问题请发表评论