Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何在非连续ForEach循环中使用变量_Excel_Vba_Foreach - Fatal编程技术网

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