Проблема в том, как вы определяете свои переменные. В своем первом коде вы сделали:
Dim rng1 As Range
'
'
'
Set rng1 = wb.Worksheets("STR").Range(Cells(1, 1), Cells(i, j))
Поскольку rng1
был создан как Range Object
, да, вам нужно установить его с Set
.
В вашем второй код, который вы сделали:
Dim rng1, rng2 As Range
'
'
'
'
Set rng1 = wb.Worksheets("SYN").Range(Cells(1, 1), Cells(a, b))
Set rng2 = wb.Worksheets("STR").Range(Cells(1, 1), Cells(i, j))
Обратите внимание, что только rng2
определяется как Range Object
. Переменная rng1
определяется как Variant
, опция по умолчанию в VBA, когда вы не указываете тип.
Таким образом, VBA думает, что rng1
является Variant
, а затем вы делаете:
Set rng1 = wb.Worksheets("SYN").Range(Cells(1, 1), Cells(a, b))
И это вызывает ошибку, потому что Set
должен использоваться только с объектами.
VBA, поскольку rng1
был определен как Variant
, ожидал такую строку :
rng1 = wb.Worksheets("SYN").Range(Cells(1, 1), Cells(a, b))
Это означает, что вы берете все эти значения в этом диапазоне в массив двумерный с именем rng1
. Вы не хотите этого делать, но это объясняет, почему VBA вызывает эту ошибку.
Решение действительно простое. Просто определите всегда , какой тип переменных / объектов вы используете.
Линия Dim rng1 as Range, rng2 As Range
должна решить вашу проблему. Всегда объявляйте правильно все ваши переменные.
Надеюсь, это поможет.