UDF Vlookup Sum Ошибка. Всегда возвращает "# ЗНАЧЕНИЕ!" - PullRequest
0 голосов
/ 26 апреля 2019

Я хочу создать функцию, в которой функция возвращает сумму всех возвращаемых значений Vlookup.Значение «У поиска» имеет параметры, разделенные «&».Кроме того, «DD», «DD0» для «DD00» должны быть добавлены перед параметром, чтобы соответствовать значению поиска в диапазоне поиска.Например, 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 присутствует в lookup_range, но функция возвращает только «#VALUE!».Пожалуйста, помогите.

1 Ответ

0 голосов
/ 26 апреля 2019

Обратите внимание, что для первого значения 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)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...