Set code = Left(Range(Cells(r - 1, "A"), InStr(1, "_", Cells(r, "A")) - 1))
Функция Left
хочет получить строку и целое число, но вы не указали целое число. Вот то же выражение, без вызова внешней функции Left
:
Set code = Range(Cells(r - 1, "A"), InStr(1, "_", Cells(r, "A")) - 1)
Заметили что-нибудь? Результат InStr
передается в качестве 2-го аргумента свойству (101) * (неквалифицированному), и это не то, что вы хотели.
На самом деле вам не нужно Range
позвони вообще. Это должно быть ближе к вашим намерениям:
Set code = Left(Cells(r - 1, "A"), InStr(1, "_", Cells(r, "A")) - 1)
Обратите внимание, что здесь происходит довольно много неявного кода; в явном виде читается так:
Set code = Left(ActiveSheet.Cells(r - 1, "A").Value, InStr(1, "_", ActiveSheet.Cells(r, "A").Value) - 1)
Вы действительно намереваетесь работать только с тем рабочим листом, который окажется активным? Скорее всего, нет, но если это так, рассмотрите возможность явного определения этих Cells
вызовов с помощью ActiveSheet
. Если вы хотите работать с указанным c листом, вместо этого используйте этот объект листа в качестве классификатора.
Теперь вы используете Set
для этого назначения, но code
не является объектом ссылка, и это еще одна проблема.
Строки не являются объектами в VBA, они назначаются с обычным синтаксисом присваивания значений. То есть без ключевого слова Set
(вы могли бы иметь прежнее ключевое слово Let
, если хотите, но это не нужно):
code = Left(ActiveSheet.Cells(r - 1, "A").Value, InStr(1, "_", ActiveSheet.Cells(r, "A").Value) - 1)
Теперь, Range.Value
(здесь явно, неявно в Ваш код) будет Variant
, а не String
. В большинстве случаев это не имеет значения.
Пока одна ячейка не имеет подтипа Variant/Error
(например, #N/A
или #VALUE!
ошибки листа); тогда все взрывается с ошибкой несоответствия типов . Чтобы избежать этого, вы можете использовать Text
ячейки вместо Value
, или вы можете перетащить это значение в собственную локальную переменную Variant
и продолжать обрабатывать его как строку только тогда, когда IsError
возвращает False
за это.