VBA通过非连续范围的联合放倒

时间:2019-03-15 15:12:58

标签: vba

我正在创建一个报告,在其中查看日期列,并基于该列中的值(介于某个范围之间),使用上一个单元格中的值递增一个聚合。因为日期在不连续的列中,所以我使用的是Union范围。我已经硬编码了下面的单元格值,并删除了其余的代码以解决循环问题。我的循环经过5次,但是每次出现$ I $ 2值和相同的日期值。我怎样才能使循环进入单元格K2及以后?

Dim c as Range

Range("I2").Select
Set installmentRng = Union(Cells(2, 9), Cells(2, 11), Cells(2, 13), Cells(2, 15), Cells(2, 17))

For Each c In installmentRng
    MsgBox (ActiveCell.Value)
    MsgBox (ActiveCell.Address)
Next c

2 个答案:

答案 0 :(得分:0)

如果将ActiveCell.Value替换为c.Value,我认为您的问题已解决。

如果可能的话,您根本不应使用Select。此外,如果将Msgbox替换为Debug.Print,则故障排除的麻烦将大大减轻。按Ctrl + G查看输出。

答案 1 :(得分:0)

ActiveCell是焦点所在的单元格(换句话说,如果用户开始输入内容,它将进入该单元格)。
在VBA中处理工作表数据时,通常不需要处理ActiveCell。在您的情况下,循环不会更改ActiveCell(并且不需要这样做)。相反,Range-变量c将会改变,您可以使用它:

For Each c In installmentRng
    MsgBox c.Value
    MsgBox c.Address
Next c

另外有两句话:
(1)不需要Range("I2").Select-语句。这会更改ActiveCell-但这并不是必须的(您几乎不需要Select语句,但是在(不良)VBA代码中经常看到它,因为宏记录器使用它。
(2)请勿在msgBox参数周围加上括号。