Excel 如何在非连续ForEach循环中使用变量
我试图为每个 以下工作:Excel 如何在非连续ForEach循环中使用变量,excel,vba,foreach,Excel,Vba,Foreach,我试图为每个 以下工作: Sub Macro1() For Each C In ActiveSheet.Range("C5:G5,B3:F3,D7:H7").Cells Debug.Print C Next C 'RESULT = 6,7,8,9,10,1,2,3,4,5,11,12,13,14,15 End Sub 但是范围确实会改变,所以我需要用变量来解决它们。 我尝试了以下方法,但均无效: 第一次尝试 Sub Macro2()
Sub Macro1()
For Each C In ActiveSheet.Range("C5:G5,B3:F3,D7:H7").Cells
Debug.Print C
Next C
'RESULT = 6,7,8,9,10,1,2,3,4,5,11,12,13,14,15
End Sub
但是范围确实会改变,所以我需要用变量来解决它们。
我尝试了以下方法,但均无效:
第一次尝试
Sub Macro2()
Dim rng1 As Range
Dim rng2 As Range
Dim rng3 As Range
Set rng1 = ActiveSheet.Range("C5:G5").Cells
Set rng2 = ActiveSheet.Range("B3:F3").Cells
Set rng3 = ActiveSheet.Range("D7:H7").Cells
For Each C In ActiveSheet.Range(rng1, rng2, rng3).Cells
Debug.Print C
Next C
'RESULT = "wrong number of arguments...
End Sub
第二次尝试
Sub Macro3()
Dim rng As Excel.Range
Set rng = Intersect(ActiveSheet.Range("C5:G5").Cells, ActiveSheet.Range("B3:F3").Cells, ActiveSheet.Range("D7:H7").Cells)
For Each C In rng
Debug.Print C
Next C
'RESULT = "run-time error 424
End Sub
期望的结果与我提供的第一个示例类似,但我需要返回带有变量的相同结果,而不是固定范围
更新@BDra为上述问题提供了一个有效的解决方案。
但是,在稍微不同的设置中应用相同的设置不起作用
理想的结果应该是
11,12,13,14,15,1,2,3,4,5,6,7,8,9,10
您的第二次尝试非常接近,但是Intersect
不会产生任何结果,因为这三个范围不相交。运行时错误被触发,因为rng=Nothing
你所追求的是工会:
Set rng = Union(ActiveSheet.Range("C5:G5").Cells, ActiveSheet.Range("B3:F3").Cells, ActiveSheet.Range("D7:H7").Cells)
有了这个编辑,你的第二个版本应该可以工作。你的第二次尝试非常接近,但是
相交
不会产生任何结果,因为这三个范围不相交。运行时错误被触发,因为rng=Nothing
你所追求的是工会:
Set rng = Union(ActiveSheet.Range("C5:G5").Cells, ActiveSheet.Range("B3:F3").Cells, ActiveSheet.Range("D7:H7").Cells)
有了这个编辑,你的第二个版本就可以了。BDra给出的答案解决了你的问题 备选方案 作为替代方案。在这种情况下,我建议将for循环隔离在它自己的子循环中,并将范围解析为参数。这样做的好处之一是,您现在可以在循环中使用无限多的范围,并且您的代码仍然很好且干净:-)
BDra给出的答案解决了您的问题 备选方案 作为替代方案。在这种情况下,我建议将for循环隔离在它自己的子循环中,并将范围解析为参数。这样做的好处之一是,您现在可以在循环中使用无限多的范围,并且您的代码仍然很好且干净:-)
谢谢BDra,效果很好。我更新了我的问题,因为有一个案例它不起作用。我可以请你看一下吗?谢谢BDra,效果很好。我更新了我的问题,因为有一个案例它不起作用。我可以请你看一下吗。如果你更新了,我想问题是工会创建了一个新的范围。你不能在这个范围内“排列”单元格;每个循环的
将按顺序运行。为了更好地控制流程,并能够按照您认为合适的方式安排顺序,我建议您再看看@Matthias Fuglsang Damgaard的解决方案。关于您的更新,我认为问题在于Union创建了一个新的范围。你不能在这个范围内“排列”单元格;每个
循环的将按顺序运行。为了更好地控制过程,并且能够按照您认为合适的方式安排顺序,我建议您再看看@Matthias Fuglsang Damgaard的解决方案。
Sub Main()
NextSub ActiveSheet.Range("B3:F3")
NextSub ActiveSheet.Range("C5:G5")
NextSub ActiveSheet.Range("D7:H7")
End Sub
Sub NextSub(rng as Range)
For Each C In rng.Cells
Debug.Print C
Next C
End Sub