Excel 是的。由.Cells定义时是否需要在.Range中?
人们普遍认为这不是“最佳实践”Excel 是的。由.Cells定义时是否需要在.Range中?,excel,vba,range,Excel,Vba,Range,人们普遍认为这不是“最佳实践” 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 解决方案:使用.Cells而不是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
解决方案:使用.Cells
而不是Cells
。案件结案
但是…
当两个属性继承在中定义的工作表属性时,此定义中是否需要
这怎么可能,
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
时,该对象的Range
函数具有作用域。当代码位于此工作簿或用户模块或类中时,具有最近可用范围的Range
函数是全局Range
对象(当然假设没有用户定义的Range
函数)。该应用程序绑定到应用程序,该应用程序必须根据传递的参数解析该应用程序,并将调用转发到正确的工作表。否,如果括号内的单元格引用符合条件,则不需要
,除非代码位于工作表模块中。也就是说,运行set rng=.range(.cells(…),.cells(…)
比运行set rng=range(.cells(…),.cells(…)
更快,所以包含
会有一些好处
对于工作表
模块,需要
。我的观点与此略有不同
是这是必需的。您不能总是控制用户从何处运行代码
请考虑以下几个测试用例
场景
工作簿有2个工作表。第1张和第2张
测试1(从模块运行)
两个代码给出相同的结果
测试2(从活页1的活页代码区域运行)
两个代码给出相同的结果
测试3(从表2的表代码区域运行)
您将得到应用程序定义或对象定义的错误
因此,始终建议正确地限定对象,以便代码可以从任何地方运行@Jeeped-当我测试它时,实际上我有点惊讶。将行Debug.Print Range(“A1”).Parent.Name
放在工作表中,然后激活其他内容并运行它。@chrisneilsen-实际上,我不是。无论单元格引用是否合格,从工作表模块调用的Range(Foo)
都将被评估为Me.Range(Foo)
<代码>范围(Foo)
从任何其他地方调用将作为ActiveSheet.Range(Foo)
计算。这些论点无关紧要。事实上由于单元格
的作用域行为与范围
相对于工作表对象的作用域行为相同,因此工作表对象的作用域解析问题完全相同。我必须承认,工作表代码表的私有性质覆盖了“孤狼”范围对象的性质,但同时不能在工作表上使用除非您只使用它们的字符串地址,否则其他工作表中单元格的作用域。@Jeeped-不用担心,first并不意味着您认为最有用的答案。如果你觉得悉达思的回答对你个人或其他可能无意中发现这个问题的人更有帮助,请毫不犹豫地接受我的回答。@BrakNicku不,这是一个关于意大利面的问题。不合格的范围
不会神奇地作用于应用程序
,而是作用于隐藏的\u全局
模块,并最终解析为活动表
是什么。MSDN讲的是半真半假的话,如果你看的是实际的内部情况,这些话会完全误导你。工作表代码隐藏中使用的非限定范围
解析为该工作表,因为这是VBA中作用域的工作方式Me
有一个Range
属性,所以非限定的Range
类似于Me.Range
,就像Me.TextBox1
在表单的代码隐藏中与TextBox1
相同。现在更有意义:)我与Siddharth在一起。这实际上取决于什么是“活动表”,如果活动表是图表表,那么底部的一组代码错误肯定会出现,除非使用了.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)
'~~> This code fails
set rng = range(.cells(2, 1), .cells(rows.count, 1).end(xlup))