Dim sfx As Long
sfx = Application.VLookup(LooupValue, Worksheets("Merge").Range("D:BD"), 2, False)
Если vlookup
дает xlErrNA
, то есть #N/A
, то VBA не может преобразовать свой результат в Long
, и вы получите именно это: несоответствие типов ошибка - потому что xlErrNA
- это значение Error
, которое не может быть неявно преобразовано в String
, Long
или что-либо еще. Единственный тип, который может содержать эти данные, это Variant
.
Dim result As Variant
result = Application.VLookup(LooupValue, Worksheets("Merge").Range("D:BD"), 2, False)
Dim sfx As Long
If Not IsError(result) Then
sfx = CLng(result)
Else
'lookup yielded no match
End If
Кроме того, похоже, что это одно за другим:
LooupValue = ActiveCell.Value
Вероятно, ActiveCell
- это не та же ячейка, что и Target
, то есть ячейка, которая была изменена. Вам, вероятно, нужно это вместо:
LookupValue = Target.Value
Я бы также рекомендовал делать неквалифицированные Range
(то же самое с Rows
, Colomns
, Names
и Cells
) явно определенными вызовами - потому что тот же самый код ведет себя по-разному в зависимости от того, где он написан в Присваивая им Me
, вы делаете свой код более явным. Код, который говорит, что он делает, и делает то, что говорит , всегда лучше кода.
Worksheets("Merge")
- это запах: если лист существует в ThisWorkbook
во время компиляции, присвойте ему кодовое имя (т.е. установите его свойство (Name)
) и используйте этот идентификатор напрямую:
result = Application.VLookup(LooupValue, MergeSheet.Range("D:BD"), 2, False)
Если лист существует только во время выполнения (например, он находится в рабочей книге, которая была открыта макросом), то у вас должна быть ссылка на эту рабочую книгу рядом с тем местом, где вы открыли этот файл, например, Set book = Application.Workbooks.Open(path)
- используйте эту ссылку для уточнения вызова участника Worksheets
, вместо того, чтобы косвенно ссылаться на ActiveWorkbook
.
Диапазон поиска D:DB
является чрезмерным, когда вы ищете только значение в столбце E
. Если этот жестко запрограммированный 2
останется, я бы сделал диапазон поиска равным D:E
.