Принято считать, что это не "лучшая практика".
dim rng as range
with thisworkbook '<~~ possibly set an external workbook
with .worksheets("sheet1")
set rng = .range(cells(2, 1), cells(rows.count, 1).end(xlup))
end with
end with
Два свойства Range.Cells, которые определяют область действия объекта Range, по умолчанию будут иметь свойство ActiveSheet. Если это не Sheet1 (определяется как .Parent в операторе With... End With), назначение не будет выполнено,
Run-tim error '1004': Application-defined or object-defined error
Решение: используйте .Cells
не Cells
. Дело закрыто.
Но...
Это .
необходимо в этом определении объекта Range, когда оба свойства Range.Cells наследуют свойство рабочего листа .Parent, определенное в операторе With... End With?
Как это может,
dim rng as range
with thisworkbook '<~~ possibly set an external workbook
with .worksheets("sheet1")
' define rng as Sheet1!A2 to the last populated cell in Sheet1!A:A
set rng = .range(.cells(2, 1), .cells(rows.count, 1).end(xlup)) '<~~ .range
end with
end with
debug.print rng.address(0, 0, external:=true)
... отличаться от этого,
dim rng as range
with thisworkbook '<~~ possibly set an external workbook
with .worksheets("sheet1")
' define rng as Sheet1!A2 to the last populated cell in Sheet1!A:A
set rng = range(.cells(2, 1), .cells(rows.count, 1).end(xlup)) '<~~ range not .range
end with
end with
debug.print rng.address(0, 0, external:=true)
Мы используем .range
когда параметры, определяющие область действия диапазона, неоднозначны; например .range([A1])
Ячейка A1
может быть из любого рабочего листа и по умолчанию будет иметь свойство ActiveSheet без .
, Но почему мы должны ссылаться на родителя объекта диапазона, когда определяющая его область правильно ссылается на родительский лист?