Обратите внимание, что для первого значения 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](https://i.stack.imgur.com/srmWW.png)