带有ActiveCell的VBA中Cell和Range()之间的关系

时间:2017-09-19 14:17:36

标签: excel vba excel-vba

我学习VBA并且对于Range()对VBA的确切支持感到困惑。我对OOP和Java / Python等语言非常了解,但是VBA在这里给我留了一些循环。

我尝试使用

时出错
Set MyRange = Range(ActiveCell, Range(ActiveCell.End(xlDown)))

我知道正确的解决方案是

Set MyRange = Range(ActiveCell,ActiveCell.End(xlDown))

但我试图理解为什么会这样。该错误特别来自Range(ActiveCell.End(xlDown))。我知道.End()会从MSDN documentation返回Range个对象。

但是,当我写

MsgBox (TypeName(ActiveCell))

我被告知ActiveCellRange个对象。 Range("A1")完全正常(当然),而Range(ActiveCell)会引发错误,因此我猜这确认Range()不会接收Range个对象。

但是,"A1"显然是String。当我在我的VBA编辑器中输入Range()时,我看到Range()接受Cell作为参数参数。那么Cell世界中RangeVBA之间的关系是什么? Range是否继承Cell?我很困惑为什么Range()接受其他Range个对象,还有String

如果Range()不接受Range个对象作为参数,那么为什么这段代码会起作用呢?

Range("A2", Range("A2").End(xlDown).End(xlToRight))

不是.End()在此处返回Range个对象吗?

2 个答案:

答案 0 :(得分:5)

范围正在寻找表示单元格地址的字符串或两个记录范围范围的范围对象。

ActiveCell本身就是一个范围对象。所以在Range中使用它时:

  

Range(ActiveCell.End(xlDown))

范围正在寻找第二个范围对象。

您可以将地址作为字符串返回:

  

Range(ActiveCell.End(xlDown).Address)

哪个会起作用但会迫使vbe进行大量转换。这就像将直流电转换为交流直流电为手机充电一样。

只需使用:

  

ActiveCell.End(xlDown)

作为范围对象。

Set MyRange = Range(ActiveCell, ActiveCell.End(xlDown))

这是Range("A2", Range("A2").End(xlDown).End(xlToRight))起作用的原因。你要返回两个范围对象。 vbe假定范围的第一位"A2"Range("A2")

  

Range(Range("A2"), Range("A2").End(xlDown).End(xlToRight))

适用于每个内部范围都使用字符串来创建范围对象。

你的第一个就像:

  

Range("A2", Range(Range("A2")).End(xlDown).End(xlToRight))

正如您所看到的,第二个Range现在正在尝试查找仅包含一个范围对象的范围,并且需要两个范围作为可行范围。

答案 1 :(得分:1)

由于ActiveCell.End(xlDown)已经返回一个范围,因此您无需将其包装到Range()

尝试

Set MyRange = Range(ActiveCell, ActiveCell.End(xlDown))