Excel VBA函数出现#VALUE错误
在我的Excel电子表格中,我有两列。
- A包含值为“是”,“否”或“可能”的string。
- B包含一年的string。
我需要一个函数来确定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
variables。
出于某种原因,当我使用以下参数时,此代码不起作用:
=CountIfYearAndValue('Years'!B1:B7,"Yes","Year 7")
它只是执行#VALUE
错误,并拒绝显示任何结果。
任何帮助将非常感激。
编辑:两个单元格中的所有值都是未格式化的数据types(“常规”),没有单元格为空。
这听起来像是在重新发明轮子…已经有一个内置的函数( 优势:比UDF快得多 ), 完全符合你的要求。 它被称为COUNTIFS()
Year 7
1至10行中的Year 7
年的所有YESES。
=COUNTIFS(B1:B10, "Year 7",A1:A10, "Yes")
我只是简单地看了一下你的代码,我想可能有几个原因可能导致你的原始代码无法正常工作。
-
YNM
是一个有效的列名,因此它不应该被用作variables名。 你应该避免像这样命名你的variables – 给它一个更有意义的名字 -
YNM
!=YMN
就像你在代码中一样( 参见函数定义,然后在StrComp()
函数中拼写错误 ) -
Year
是一个有效的VBA内置函数,因此再一次您应该避免使用它作为variables名称,因为你暴露自己的命名冲突。 -
在你的模块的顶部添加
Option Explicit
。 这需要你把所有的variables都调出来。 总是有很多原因。 -
rng
variables是Range
types的,所以你不需要明确地添加.Cells
属性。 尽pipe在某些情况下可能会有所帮助,但在更高级的层面上,您可能会遇到一些运行时types兼容性问题。 ( 运行时可能会将您的范围variables转换为二维数组等 ) -
在
c.Offset(0, -1)
周围的第二个StrComp()
函数中添加了显式转换,因为您不希望运行时( 很less但仍可能 )将Yes
转换为Boolean
型数据types。 显式转换为一个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
对,我希望这可以帮助你理解点点滴滴:)任何问题请发表评论