Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 是的。由.Cells定义时是否需要在.Range中?_Excel_Vba_Range - Fatal编程技术网

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))