Excel VBA - UDF возвращает 0 или пусто или # значение - PullRequest
0 голосов
/ 10 июня 2019

Я создаю свою индивидуальную функцию. Я написал код и протестировал его как «sub, и он работал хорошо. Затем я преобразовал его в функцию, чтобы иметь возможность использовать его в целом. Вещи, которые я изменил, являются; добавление объявления функции, получение ввода из ячейки Excel и указание вывода функции. Все остальные остались прежними.

Моя функция имеет только один вход, который является выбранной ячейкой из листа Excel. И я ожидаю, что функция возвращает один вывод. Тем не менее, он возвращает 0. • объявление функции. «Функция IbpBomLevel (ByVal Target As Range) в качестве варианта • ввод функции в качестве выбранной ячейки. "ProductID = Target • вывод функции. "IbpBomLevel = fullText

Я использовал явную опцию, чтобы избежать несуществующих функций. Кроме того, я уверен насчет ввода, функция действительно принимает выбранную ячейку в качестве ввода. Но проблема в том, что в каждом цикле «ProductID должен быть изменен. Однако, когда я объявил, что «IbpBomLevel (вывод функции) = ProductID, и увидел, что ProductID является первым параметром, выбранным пользователем из ячейки. Это означает, что цикл не работает. Когда я проверяю его как« sub, я получаю результат, который Я хочу. Я не уверен, в чем проблема.

Option Explicit

Function IbpBomLevel(ByVal Target As Range) As Variant

Dim Wb As Workbook
Dim Ws As Worksheet
Dim MyRange As Range
Dim SourceID As Variant
Dim SourceID2 As Variant
Dim SourceID3 As Variant
Dim Product As Variant
Dim Item As Variant
Dim Location As Variant
Dim Resource As Variant
Dim I As Variant
Dim T As Variant
Dim Z As Variant
Dim X As Variant
Dim Y As Variant
Dim Index As Variant
Dim Index2 As Variant
Dim Index3 As Variant
Dim BomLevel As Variant
Dim FoundCell As Variant
Dim fullText As Variant

Dim ProductID As Variant
ProductID = Target

Set Wb = Workbooks("Kitap.xlsx")
Windows("Kitap.xlsx").Activate

On Error GoTo T_Error

Set Ws = Wb.Worksheets("Production Source Header")
Sheets("Production Source Header").Select

Set MyRange = Worksheets("Production Source Header").Range("B:C")

SourceID = CVar(Application.WorksheetFunction.VLookup(ProductID, MyRange, 2, False))

I = 1
T = 0
Z = 1

If IsEmpty(SourceID) = False Then

    Do While (IsEmpty(SourceID) = False) And (T = 0)

        BomLevel = Z

        Windows("Kitap.xlsx").Activate
        Set Ws = Wb.Worksheets("Production Source Header")
        Sheets("Production Source Header").Select
        Set MyRange = Worksheets("Production Source Header").Range("B:C")

        SourceID = CVar(Application.WorksheetFunction.VLookup(ProductID, MyRange, 2, False))

        Set FoundCell = ActiveSheet.Range("C:C").Find(What:=SourceID)

        If Not FoundCell Is Nothing Then
            Index = FoundCell.Row
            Location = Cells(Index, 1)
            Product = Cells(Index, 2)
        Else
        End If

        X = I
        I = I + 1

        Windows("Kitap.xlsx").Activate
        Set Ws = Wb.Worksheets("Production Source Item")
        Sheets("Production Source Item").Select
        Set MyRange = Worksheets("Production Source Item").Range("B:B")

        SourceID2 = CVar(Application.WorksheetFunction.VLookup(SourceID, MyRange, 1, False))

        Do While (IsEmpty(SourceID2) = False) And (I - X = 1)

            Set MyRange = Worksheets("Production Source Item").Range("B:B")

            SourceID2 = CVar(Application.WorksheetFunction.VLookup(SourceID, MyRange, 1, False))

            Set FoundCell = ActiveSheet.Range("B:B").Find(What:=SourceID2)

            If Not FoundCell Is Nothing Then
                Index2 = FoundCell.Row
                Item = Cells(Index2, 1)
                Windows("Kitap.xlsx").Activate
                Set Ws = Wb.Worksheets("Production Source Header")
                Sheets("Production Source Header").Select
            Else
            End If

            Y = I
            I = I + 1

            Windows("Kitap.xlsx").Activate
            Set Ws = Wb.Worksheets("Production Source Resource")
            Sheets("Production Source Resource").Select

            Set MyRange = Worksheets("Production Source Resource").Range("B:B")

            SourceID3 = CVar(Application.WorksheetFunction.VLookup(SourceID, MyRange, 1, False))

            Do While IsEmpty(SourceID3) = False And (I - Y = 1)

                Set MyRange = Range("B:B")
                    SourceID3 = CVar(Application.WorksheetFunction.VLookup(SourceID, MyRange, 1, False))
                Set FoundCell = ActiveSheet.Range("B:B").Find(What:=SourceID3)

                If Not FoundCell Is Nothing Then
                    Index3 = FoundCell.Row
                    Resource = Cells(Index3, 1)
                    Windows("Kitap.xlsx").Activate
                    Set Ws = Wb.Worksheets("Production Source Header")
                    Sheets("Production Source Header").Select
                Else
                End If

            I = I + 1

            Loop
        Loop

        fullText = fullText & " Location: " & Location & " // Header: " & Product & " // Item: " & Item & " // Resource: " & Resource
        Z = Z + 1

        ProductID = Item
        Set MyRange = Worksheets("Production Source Header").Range("B:C")

        SourceID = (Application.WorksheetFunction.VLookup(ProductID, MyRange, 2, False))

T_Error:
        If Err.Number = 1004 Then

            On Error Resume Next
            T = 1

        Else
        End If

    Loop

    IbpBomLevel = fullText

Else
    MsgBox ("Bom Missing")
End If

End Function
...