是个 。 在.Cells中定义时需要。

人们普遍认为这不是“最佳做法”。

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对象范围的两个Range.Cell属性将默认为ActiveSheet属性 。 如果这不是Sheet1(定义为With … End With语句中的.Parent ),则分配将失败,

 Run-tim error '1004': Application-defined or object-defined error 

解决scheme:使用.Cells不是Cells 。 案件结案。

但…

是的. 当Range.Cells属性inheritanceWith … End With语句中定义的.Parent工作表属性时,在此Range对象定义中是否必要?

这怎么可能,

 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属性没有. 。 但是为什么当定义范围的范围已经正确引用了它的父级工作表时,我们需要引用范围对象的父级呢?

我的意见在这里略有不同。

是的,这是必需的。 你不能总是控制用户从哪里运行代码。

请考虑这几个testing用例

情景

工作簿有2个工作表。 Sheet1和Sheet2


testing1(从模块运行)

两个代码给出相同的结果

testing2(从Sheet1的Sheet代码区域运行)

两个代码给出相同的结果

testing3(从Sheet2的Sheet代码区域运行)

 '~~> This code fails set rng = range(.cells(2, 1), .cells(rows.count, 1).end(xlup)) 

你会得到Application Defined or Object defined错误

在这里输入图像描述

因此总是build议适当限定对象,以便代码可以从任何地方运行

不,这个. 除非代码位于Worksheet模块中,否则不需要在括号内的单元格引用进行限定。 这就是说运行set rng = .range(.cells(...), .cells(...))比运行set rng = range(.cells(...), .cells(...))所以包括. 做一些好事。

对于Worksheet模块, 是必须的。

答案似乎是:仅当代码位于Worksheet对象中时。 我强烈怀疑这是因为工作表对象是唯一可扩展并具有Range函数的对象。 当从工作表中调用Range ,该对象的Range函数具有范围。 当代码位于ThisWorkbook或用户模块或类中时,具有最接近的可用作用域的Range函数是全局的Range对象(当然假设没有用户定义的Range函数)。 那个绑定到Application ,它必须根据传递的参数parsing它,并将调用转发到正确的工作表。