Excel VBA函数出现#VALUE错误

Kez*_*101 1 excel vba excel-vba

在我的Excel电子表格中,我有两列.

  • A包含值为"是","否"或"可能"的字符串.
  • B包含一年的字符串.

我需要一个函数来确定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
Run Code Online (Sandbox Code Playgroud)

这段代码的想法是,我们通过在给定的(在B列的范围)范围内的每一个细胞循环,并检查一年等于Year参数.如果A列上的等效单元格等于YNM参数,我们会增加count变量.

由于某些原因,当我使用以下参数时,此代码不起作用:

=CountIfYearAndValue('Years'!B1:B7,"Yes","Year 7")
Run Code Online (Sandbox Code Playgroud)

它只是做#VALUE错误并拒绝显示任何结果.

任何帮助将非常感激.

编辑:两个单元格中的所有值都是未格式化的数据类型("常规"),并且没有单元格为空.

小智 5

听起来你正在重新发明轮子......已经有一个内置功能(优点:比UDF快得多),它完全符合您的要求.它被称为COUNTIFS()

所有YESes都Year 7在第1行到第10行.

=COUNTIFS(B1:B10, "Year 7",A1:A10, "Yes")


我只是快速查看了您的代码,我认为可能有一些原因导致您的原始代码无法正常工作.

  • YNM是有效的列名,因此不应将其用作变量名.你应该避免像这样命名你的变量 - 给它一个更有意义的名字

  • YNM!= YMN你在你的代码有它(见函数定义,然后在拼写错误的版本StrComp()功能)

  • Year 是一个有效的VBA内置函数,因此您应该再次避免将它用作变量名,因为您将自己暴露给命名冲突.

  • 添加Option Explicit到模块的顶部.这需要您Dim保留所有变量.由于许多原因,它总是被推荐.

  • rng变量属于Range类型,因此您无需向其显式添加.Cells属性.即使它在某些情况下可能会有所帮助 - 在某种程度上更高级,您可能会面临一些运行时类型兼容性问题.(运行时可能会将rngRange变量转换为2D数组等)

  • 在第二个StrComp()函数中添加了显式转换,c.Offset(0, -1)因为您不希望运行时(很少但仍然可能)将您转换YesBoolean数据类型.显式转换为Stringjust会给你额外的保护 ; 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
Run Code Online (Sandbox Code Playgroud)

是的,我希望这可以帮助你理解点点滴滴:)任何问题请发表评论