2016-12-28 73 views
0

我想写一个循环,基于两个条件添加单元格到一个范围。程序级变量在循环中丢失值吗?

1)的细胞或者是向右或已在的范围内的小区的向下,

2)的单元是相同的颜色作为先前指定的颜色。

Sub DefineContiguousRegion() 

Dim c As Range 
Dim areNewCells As Boolean 

Do 
    areNewCells = False 
    For Each c In CurrentRange 
     If (Intersect(CurrentRange, c.Offset(1)) Is Nothing) And c.Offset(1).Interior.ColorIndex = CurrentColor Then 
      areNewCells = True 
      CurrentRange = Union(CurrentRange, c.Offset(1)) 
     End If 
     If (Intersect(CurrentRange, c.Offset(, 1)) Is Nothing) And c.Offset(, 1).Interior.ColorIndex = CurrentColor Then 
      areNewCells = True 
      CurrentRange = Union(CurrentRange, c.Offset(, 1)) 
     End If 
    Next 
Loop Until areNewCells = False 

的问题是,可变areNewCells在的末端对于每一个环被重置为断章取义。所以即使条件从未被满足,即使该值从未被设置为真。

这是怎么发生的?我该如何解决它?

如果有人能想出一个更简单的方法来创建这个范围,那很好,但我真正想要的是更好地理解变量范围/生命期,因为这是一个学习项目,而不是时间敏感的工作相关。

+0

您是否通过加强与在本地窗口观察'areNewCells'的价值? – Porcupine911

+0

是的。我在Loop Until之前的“next”语句中有一个断点。一旦我到达“下一个”声明,本地窗口就会清除。 – Rubikkon

+0

CurrentRange的定义在哪里? –

回答

0

既然你问了更简单的方法,你可以考虑下面的代码:

With CurrentRange 
    For Each c In Union(.Offset(, .Columns.count).Resize(.Rows.count + 1, 1), .Offset(.Rows.count).Resize(1)) '<--| loop through wanted cells only 
     If c.Interior.ColorIndex = CurrentColor Then Set CurrentRange = Union(CurrentRange, c) 
    Next c 
End With 
+0

@Rubikon,您是否通过了它? – user3598756