是个 。在.Cells定义时,.Range是否必要?

时间:2016-04-02 01:32:56

标签: 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

定义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而不包含.。但是,当定义范围对象的范围正确引用其父工作表时,为什么我们需要引用范围对象的父级?

3 个答案:

答案 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错误

enter image description here

因此,始终建议对对象进行适当的限定,以便代码可以从任何地方运行

答案 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绑定,必须根据传递的参数解析它并将调用转发到正确的工作表。