这被广泛接受,这不是'最佳实践'。
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 object属性将默认为ActiveSheet property。如果这不是Sheet1(在.Parent中定义为With ... End With statement),则分配将失败,
Run-tim error '1004': Application-defined or object-defined error
解决方案:使用.Cells
而不是Cells
。案件结案。
当Range object属性都继承了Range.Cells中定义的.Parent工作表属性时,此With ... End With statement定义中是否需要.
?
怎么可能呢,
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 property而不包含.
。但是,当定义范围对象的范围正确引用其父工作表时,为什么我们需要引用范围对象的父级?
答案 0 :(得分:20)
我的意见略有不同。
是这是必需的。您无法始终控制用户从哪里运行代码。
请考虑这几个测试用例
<强> SCENARIO 强>
工作簿有2个工作表。 Sheet1和Sheet2
TEST 1(从模块运行)
两个代码都给出相同的结果
TEST 2(从Sheet1的图纸代码区域运行)
两个代码都给出相同的结果
TEST 3(从Sheet2的图纸代码区域运行)
'~~> This code fails
set rng = range(.cells(2, 1), .cells(rows.count, 1).end(xlup))
您将收到Application Defined or Object defined
错误
因此,始终建议对对象进行适当的限定,以便代码可以从任何地方运行
答案 1 :(得分:9)
不,除非代码在.
模块中,否则括号内的单元格引用是合格的,Worksheet
不是必需的。也就是说,运行set rng = .range(.cells(...), .cells(...))
比运行set rng = range(.cells(...), .cells(...))
更快,因此包括.
会有所帮助。
对于Worksheet
模块,.
是必需的。
答案 2 :(得分:7)
答案似乎是:只有代码位于Worksheet对象中。我强烈怀疑这是因为Worksheet对象是唯一既可扩展又具有Range
功能的对象。从工作表调用Range
时,该对象的Range
函数具有范围。当代码位于ThisWorkbook或用户模块或类中时,具有最接近可用范围的Range
函数是全局Range
对象(当然假设没有用户定义{{ 1}}功能)。那个与Range
绑定,必须根据传递的参数解析它并将调用转发到正确的工作表。