Ошибка времени выполнения '1004' Ошибка приложения или объекта в функции Vlookup - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь использовать функцию Vlookup, в соответствии со значением Textbox1, введенным пользователем в Userform Guntest, автоматически ища соответствующие функции пистолета.Однако в настоящее время программа не запускается, поскольку напоминает мне

'Ошибка выполнения' 1004 ', сбой метода' Диапазон объекта '_Global'.

Появляется ошибкаRetrieve1=…

Буду признателен, если вы поможете мне проверить, в чем проблема, поскольку у меня действительно ограниченные знания и опыт использования VBA.

Заранее спасибо.

Похоже, что некоторые объекты не определены, но я не могу понять, где.

Код модуля 1:

Public Guncode As String
Option Explicit

Sub Test()

    Call Vlookup

End Sub

Sub Vlookup()

    Dim Retrieve1 As String
    Dim Retrieve2 As String
    Dim FinalRow As Long
    Dim FinalColumn As Long
    Dim WholeRange As String

    If GunTest.TextBox1 = "" Then
        Exit Sub
    If GunTest.TextBox1 <> "" Then

        MsgBox Guncode
    End If
    End If

    With Sheets(1)

        FinalRow = Range("A65536").End(xlUp).Row
        FinalColumn = Range("IV1").End(xlToLeft).Column
        WholeRange = "A2:" & CStr(FinalColumn) & CStr(FinalRow)

        Retrieve1 = Application.WorksheetFunction.Vlookup(Trim(Guncode), Range(WholeRange), 1, False) 'Locate specific tool according to QR code number
        Retrieve2 = Application.WorksheetFunction.Vlookup(Trim(Guncode), Range(WholeRange), 5, False) 'Locate specific gun type according to QR code number

        If Guncode = "" Then
            MsgBox "This gun doesn't exist in database!"
        Else
            MsgBox "The tool number is:" & Retrieve1 & vbCrLf & "The gun type is:" & Retrieve2
        End If
    End With

End Sub

код пользовательской формы:

Option Explicit

Private Sub Label1_Click()

End Sub

Private Sub CommandButton1_Click()

    If TextBox1 = "" Then Exit Sub 'Set condition 1 of exiting the program

    Guncode = GunTest.TextBox1

    With Me

        Call Module1.Test

    End With

End Sub

Private Sub PartID_Click()

End Sub

Private Sub TextBox1_Change()

End Sub

Private Sub UserForm_Click()

End Sub

Он должен работать правильно, но это не так.Любая помощь будет оценена, спасибо!

1 Ответ

1 голос
/ 27 июня 2019

Во-первых, вы передавали число в качестве значения буквы столбца. CSTR () волшебным образом не превращает его в буквенный эквивалент, но мне нравится ваш энтузиазм.

Во-вторых, ваш метод будет бомбить, если значение не найдено, поэтому вам нужно написать свою собственную обработку ошибок для него.

Sub Vlookup()
    Dim Retrieve1 As String
    Dim Retrieve2 As String
    Dim FinalRow As Long
    Dim FinalColumn As Long
    Dim WholeRange As String
    Dim vArr
    Dim col_Letter As String

    If GunTest.TextBox1 = "" Then
        Exit Sub
        If GunTest.TextBox1 <> "" Then
            MsgBox Guncode
        End If
    End If

    With ThisWorkbook.Sheets("Sheet1")
        FinalRow = .Range("A65536").End(xlUp).Row
        FinalColumn = .Range("IV1").End(xlToLeft).Column
        vArr = Split(Cells(1, FinalColumn).Address(True, False), "$")
        col_Letter = vArr(0)
        WholeRange = "A2:" & col_Letter & CStr(FinalRow) '<---- you were passing a number in as the column value
        Retrieve1 = Application.WorksheetFunction.Vlookup(Trim(Guncode), .Range(WholeRange), 1, False) 'Locate specific tool according to QR code number
        Retrieve2 = Application.WorksheetFunction.Vlookup(Trim(Guncode), .Range(WholeRange), 5, False) 'Locate specific gun type according to QR code number

        If Guncode = "" Then
            MsgBox "This gun doesn't exist in database!"
        Else
            MsgBox "The tool number is:" & Retrieve1 & vbCrLf & "The gun type is:" & Retrieve2
        End If
    End With
End Sub

1. Я не уверен, в чем причина использования адреса (True, False) для номера строки.

Это происходит от комбинации этих двух функций. Параметр true / false указывает функции использовать / не использовать абсолютные ссылки в адресе.

Разделить (выражение [, разделитель] [, предел] [, сравнить]) https://www.techonthenet.com/excel/formulas/split.php

выражение. Адрес (RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo) https://docs.microsoft.com/en-us/office/vba/api/excel.range.address

Разве ячейка (1, FinalColumn) не должна обозначать номер столбца?

Нет, ячейки fucntiosn в основном возвращают пересечение / адрес строк и столбцов.

Попробуйте это, например: debug.Print; thisworkbook.Sheets ( "Лист1"). Клетки (2,2)

Вы упомянули, что CSTR магическим образом не преобразуется в буквенный эквивалент, так во что бы он превратился? Не могли бы вы уточнить?

Это функция преобразования типов данных. CSTR (666) по существу делает это: этот 666 становится этим "666"

2. Варра (0). Меня смущает, что означает параметр 0 в скобках. На самом деле это общий вопрос, который у меня всегда возникает в отношении спецификации параметров.

Это рефлекс позиции массива. Функция split возвращает массив строк. Поскольку мы используем для захвата значения метки столбца, нам нужно указать только первую позицию.

(3) Я попытался скопировать ваш код и запустить его, но все равно напоминает мне ошибку в той же строке.

Хорошо работает для меня, если нет возвращаемого значения, которое возвращает ошибку, которую я имел в виду под "бомбой".

...