Метод VBA VLookup не работает для чисел и строк - PullRequest
0 голосов
/ 15 октября 2019

У меня есть рабочая книга с кодами продуктов и названиями. Внутри формы находятся различные текстовые поля, в которые пользователь может ввести код, и соответствующая метка будет обновлена ​​в соответствии с именем, найденным в книге. Каждое текстовое поле выполняет следующую подпрограмму при изменении

Private Sub FindItem(x As Long)

Dim Name As Variant

Name = Application.VLookup(AddStockForm.Controls("Code" & x).Text, Sheet1.Range("B:C"), 2, False)
If IsError(Name) Then
 AddStockForm.Controls("Name" & x).Caption = "Unknown Code"
Else
 AddStockForm.Controls("Name" & x).Caption = Name
End If

End Sub

Подпрограмма принимает пользовательский ввод в целевом поле (например, Code1) и находит соответствующее имя и записывает его в метку (например, Name1). ОДНАКО, коды продуктов представляют собой либо строки, либо буквенно-цифровые и простые тексты, либо цифры. По глупым причинам, не зависящим от меня, некоторые коды должны быть числами, другие должны содержать буквы.

Этот код работает ОТЛИЧНО для любого кода с символом в нем (MYCODE или 500A), но не чисел, он пишет «Неизвестный код» для любого числа, и они находятся в диапазоне поиска. Я искал вокруг stackoverflow и ответы предлагают объявить как варианты, я сделал это, даже назначив Controls().Text как вариант, прежде чем использовать его в VLookup. Я подозреваю, что проблема в

AddStockForm.Controls("Code" & x).Text

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

Есть идеи?

1 Ответ

0 голосов
/ 15 октября 2019

Одна вещь, которую вы можете сделать, это создать отдельную функцию, в которой есть отдельные части, которые вы хотите сделать. В этом случае мы сначала проверяем входное значение. Если это числовое значение, мы хотим попробовать выполнить поиск в виде строки, а затем в виде числа, если это не удалось. Если входное значение не является числовым, мы можем продолжить поиск в обычном режиме.

Public Function lookupStringOrInt(inputValue As Variant, tableArray As Range, colIndexNum As Long, Optional rangeLookup As Boolean) As Variant

    If IsNumeric(inputValue) Then
        lookupStringOrInt = Application.IfError(Application.VLookup(inputValue & "", tableArray, colIndexNum, rangeLookup), Application.VLookup(inputValue * 1, tableArray, colIndexNum, rangeLookup))
    Else
        lookupStringOrInt = Application.VLookup(inputValue, tableArray, colIndexNum, rangeLookup)
    End If

End Function

Затем вы можете вызвать это в своем коде со строкой

name = lookupStringOrInt(AddStockForm.Controls("Code" & x) & "", Sheet1.Range("B:C"), 2, False)

Если значениеВы ищете не существует, функция вернет «Ошибка 2042». Вы можете справиться с этим так, как вам нравится.

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