是个 。 在.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它,并将调用转发到正确的工作表。