Во-первых, вы передавали число в качестве значения буквы столбца. 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) Я попытался скопировать ваш код и запустить его, но все равно напоминает мне ошибку в той же строке.
Хорошо работает для меня, если нет возвращаемого значения, которое возвращает ошибку, которую я имел в виду под "бомбой".