【问题标题】:Relationship between Cell and Range() in VBA with ActiveCellVBA中Cell和Range()与ActiveCell的关系
【发布时间】:2017-09-19 22:30:00
【问题描述】:

我正在学习 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))

我被告知ActiveCell 是一个Range 对象。 Range("A1") 工作得非常好(当然),而 Range(ActiveCell) 抛出一个错误,所以我想这证实了 Range() 不接受 Range 对象。

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

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

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

.End() 不是在这里返回 Range 对象吗?

【问题讨论】:

标签: vba excel


【解决方案1】:

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

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 现在正试图找到一个只有一个范围对象的范围,它需要两个才能成为可行的范围。

【讨论】:

  • 谢谢!这是一个很好的解释。所以Range() 可以同时接收StringRange 对象?像Range("A2", Range("A2").End(xlDown).End(xlToRight))的例子一样,它的第一个参数参数是一个String,第二个参数参数是一个Range对象?
【解决方案2】:

由于ActiveCell.End(xlDown) 已经返回一个范围,你不需要将它包装到 Range() 中

试试

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

【讨论】:

  • 谢谢 - 我添加了一个编辑。我知道这很抱歉,因为没有更清楚。但我试图理解为什么。因为在Range("A2", Range("A2").End(xlDown).End(xlToRight)) 中,Range() 正在接收一个Range 对象。
  • Scott Craner 的回答最完整!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 2020-03-28
  • 2023-04-02
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多