【问题标题】:UDF Vlookup Sum Error. Always returns "#VALUE!"UDF Vlookup 总和错误。始终返回“#VALUE!”
【发布时间】:2019-04-26 12:07:27
【问题描述】:

我想创建一个函数,该函数返回 Vlookup 的所有返回值的总和。查找值具有由“&”分隔的参数。此外,必须在参数前添加“DD00”的“DD”、“DD0”,以匹配查找范围内的查找值。例如,Cell(1,2)="DD003&03A",该函数应将 DD003 和 DD003A 的返回值相加。以下是我的代码:

Option Explicit

Public Function DPPR_Vlookup(Lookup_Value As String, Lookup_Range As Range, Column_Index As Long, Optional Match_Case As Integer) As Variant

Dim D_Code() As String

Dim Pos_1 As Long

Dim i As Integer

Dim Sum_Value As Long

Dim x1 As Long
Dim x2 As Long
Dim x3 As Long


Pos_1 = InStr(1, Lookup_Value, "&", vbTextCompare)

    With Application.WorksheetFunction

        If Pos_1 = 0 Then

        DPPR_Vlookup = .VLookup(Lookup_Value, Lookup_Range, Column_Index, Match_Case)

        Else

        D_Code() = Split(Lookup_Value, "&")

            Sum_Value = 0

            For i = 1 To UBound(D_Code())

                If IsError(.VLookup("DD" & D_Code(i), Lookup_Range, Column_Index, Match_Case)) = True Then

                x1 = 0

                Else

                x1 = .VLookup("DD" & D_Code(i), Lookup_Range, Column_Index, Match_Case)

                End If


                If IsError(.VLookup("DD0" & D_Code(i), Lookup_Range, Column_Index, Match_Case)) = True Then

                x2 = 0

                Else

                x2 = .VLookup("DD0" & D_Code(i), Lookup_Range, Column_Index, Match_Case)

                End If


                If IsError(.VLookup("DD00" & D_Code(i), Lookup_Range, Column_Index, Match_Case)) = True Then

                x3 = 0

                Else

                x3 = .VLookup("DD00" & D_Code(i), Lookup_Range, Column_Index, Match_Case)

                End If


                Sum_Value = Sum_Value + x1 + x2 + x3

                x1 = 0
                x2 = 0
                x3 = 0

            Next i


DPPR_Vlookup = Sum_Value


        End If

    End With

End Function



所有带有“&”的参数的结果总是“#VALUE!”。我已将错误考虑在内,该值应为 0。此外,查找范围中存在 DD003 和 DD003A 的值,但该函数仅返回“#VALUE!”。请帮忙。

【问题讨论】:

  • 工作表样本和预期结果有助于理解您的查询
  • 您能否提供一些示例数据以及如何在公式中使用该函数?见minimal reproducible example。要调试您的函数,请创建一个帮助程序来调用您的函数。这样您就可以使用 F8 逐步完成它并检查哪里出错了。
  • 您实际上并没有处理错误。如果未找到查找值,application.worksheetfunction.vlookup 会引发 run-time 错误,这将导致 #VALUE! 错误。您需要使用application.vlookup,它会返回一个错误值,您可以使用iserror 进行检查。

标签: excel vba


【解决方案1】:

请注意,DD003&03A 的第一个值不需要添加前缀。此外,Split 方法返回的数组索引以 0 开头,因此您需要以 i = 0 开头,或者更好的是动态地以 i = LBound(D_Code()) 开头。

正如评论中提到的WorksheetFunction.Vlookup 返回一个无法用IsError() 捕获的运行时错误,所以我改为Application.Vlookup

我还为可能的前缀添加了一个数组,这样我们就可以轻松地使用循环而不是一遍又一遍地重复相同的代码。

最后用一个测试程序来轻松调试你的函数,这样你就可以使用F8一步一步地完成它。

Option Explicit

Public Sub Test_DPPR_Vlookup()

    Debug.Print DPPR_Vlookup([E2], [A:B], 2, 0)

End Sub

Public Function DPPR_Vlookup(Lookup_Value As String, Lookup_Range As Variant, Column_Index As Variant, Optional Match_Case As Boolean) As Variant
    Dim Pos_1 As Long
    Pos_1 = InStr(1, Lookup_Value, "&", vbTextCompare)

    Dim Prefix As Variant
    Dim Prefixes() As Variant
    Prefixes = Array("", "DD", "DD0", "DD00") 'note that the first is needed to also lookup without prefixes (first item)

    With Application
        If Pos_1 = 0 Then
            DPPR_Vlookup = .VLookup(Lookup_Value, Lookup_Range, Column_Index, Match_Case)
        Else
            Dim D_Code() As String
            D_Code() = Split(Lookup_Value, "&")

            Dim Sum_Value As Long
            Sum_Value = 0

            Dim i As Long, LookupResult As Variant
            For i = 0 To UBound(D_Code()) 'note array item counting starts with 0
                For Each Prefix In Prefixes
                    LookupResult = .VLookup(Prefix & D_Code(i), Lookup_Range, Column_Index, Match_Case)
                    If Not IsError(LookupResult) Then
                        Sum_Value = Sum_Value + LookupResult
                    End If
                Next Prefix
            Next i

            DPPR_Vlookup = Sum_Value
        End If
    End With
End Function

Result 使用的公式是=DPPR_Vlookup(E2,A:B,2,0)

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 2018-02-12
    • 2018-02-11
    • 2015-10-29
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多