It is pretty much widely accepted that this is not 'best practise'.
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
The two Range.Cells properties that define the scope of the Range object will default to the ActiveSheet property. If this is not Sheet1 (defined as the .Parent in the With ... End With statement), the assignment will fail with,
Run-tim error '1004': Application-defined or object-defined error
Solution: use .Cells
not Cells
. Case closed.
But...
Is the .
necessary in this Range object definition when both the Range.Cells properties inherit the .Parent worksheet property that is defined in the With ... End With statement?
How can this,
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)
... be different from this,
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)
We use .range
when the parameters that define the scope of the range are ambiguous; e.g. .range([A1])
The A1
cell could be from any worksheet and will default to the ActiveSheet property without the .
. But why do we need to reference the parent of a range object when the scope that defines it has properly referenced its parent worksheet?
No, the
.
is not required where the cell references inside the brackets are qualified, unless the code is in aWorksheet
module. That said it is faster to runset rng = .range(.cells(...), .cells(...))
than it is to runset rng = range(.cells(...), .cells(...))
so including the.
does some good.For a
Worksheet
module, the.
is required.My opinion is slightly different here.
YES it is required. You can't always control where the user may run the code from.
Please consider these few test cases
SCENARIO
Workbook has 2 worksheets. Sheet1 and Sheet2
TEST 1 (Running from a module)
Both Code give same result
TEST 2 (Running from a Sheet code area of Sheet1)
Both Code give same result
TEST 3 (Running from a Sheet code area of Sheet2)
You will get
Application Defined or Object defined
errorAnd hence it is always advisable to properly qualify your objects so that the code can run from anywhere
The answer seems to be: only if the code is located in a Worksheet object. I strongly suspect that this is because the Worksheet objects are the only ones that are both extensible and have a
Range
function. WhenRange
is called from a Worksheet, that object'sRange
function has scope. When the code is located in ThisWorkbook or a user module or class, theRange
function with the closest available scope is the globalRange
object (assuming of course that there isn't a user definedRange
function). That one is tied to theApplication
, which has to resolve it based on the passed parameters and forward the call to the correct Worksheet.