Vba 在工作表中的区域/区域之间循环?

Vba 在工作表中的区域/区域之间循环?,vba,excel,Vba,Excel,我有一个工作表,里面有很多不同的区域,我想循环一下。我将要做一些计算,并且认为这比在一列中逐个单元格更快/更有效 我尝试了一些不同的方法,但不知道如何跳到下一个区域。我已经做了一些评论,最有希望的是最后一个(对于rng中的每个cel…),但是在我做了第一个cel.CurrentRegion之后。选择,然后做一些事情,我如何跳到下一个区域 所以我想得到A2:D4,做一些事情,然后转到下一个区域,A6:D9,然后转到A11:D15,等等 编辑:看起来我可以用一些For I循环来实现这一点,但我很

我有一个工作表,里面有很多不同的区域,我想循环一下。我将要做一些计算,并且认为这比在一列中逐个单元格更快/更有效

我尝试了一些不同的方法,但不知道如何跳到下一个区域。我已经做了一些评论,最有希望的是最后一个(
对于rng中的每个cel…
),但是在我做了第一个
cel.CurrentRegion之后。选择
,然后做一些事情,我如何跳到下一个区域

所以我想得到
A2:D4
,做一些事情,然后转到下一个区域,
A6:D9
,然后转到
A11:D15
,等等

编辑:看起来我可以用一些
For I
循环来实现这一点,但我很好奇,你是否可以用内置的
当前区域
/
区域
来实现这一点,或者如果我不得不这么做的话:

For i = 2 To lastRow
    Set CurrentRegion = .Range(.Cells(i, 1), .Cells(.Cells(i, 9).End(xlDown).row, 4))
    CurrentRegion.Select 
    ' Do things with the current region here...
    i = CurrentRegion.Rows(CurrentRegion.Rows.Count).row + 1
Next i

如果要将区域添加到电子表格中,可以使用类似
region-N
region-1
region-2
等)的名称来命名每个区域的第一个单元格

然后,像这样编写代码:

For j = 1 To n 'where n is the number of regions
    Set currentRegion = Range("region-" & j).CurrentRegion
    For Each cell In currentRegion
        'do your things
    Next cell
Next j
这样,您每次都可以添加一个区域,只要您使用
region-N
命名一个单元格,它就会被您的代码接受

当然,您可能会想到许多方法来使
For循环的
n
动态(如果您硬编码它,则每次添加新区域时都必须更改它)。例如:

For Each namedRange In ActiveWorkbook.Names
    If Left(namedRange,7) = "region-" Then
        Set currentRegion = Range(namedRange).CurrentRegion
        For Each cell In currentRegion
            'do your things
        Next cell
    End If
Next namedRange

如果要将区域添加到电子表格中,可以使用类似
region-N
region-1
region-2
等)的名称来命名每个区域的第一个单元格

然后,像这样编写代码:

For j = 1 To n 'where n is the number of regions
    Set currentRegion = Range("region-" & j).CurrentRegion
    For Each cell In currentRegion
        'do your things
    Next cell
Next j
这样,您每次都可以添加一个区域,只要您使用
region-N
命名一个单元格,它就会被您的代码接受

当然,您可能会想到许多方法来使
For循环的
n
动态(如果您硬编码它,则每次添加新区域时都必须更改它)。例如:

For Each namedRange In ActiveWorkbook.Names
    If Left(namedRange,7) = "region-" Then
        Set currentRegion = Range(namedRange).CurrentRegion
        For Each cell In currentRegion
            'do your things
        Next cell
    End If
Next namedRange

你可以试试这样的

Sub LoopThroughZones()
Dim lr As Long, iRow As Object
Dim Area As Range, Rng As Range, Cell As Range

lr = Cells(Rows.Count, 1).End(xlUp).Row

'Loopting through each block
For Each Area In Range("A2:A" & lr).SpecialCells(xlCellTypeConstants, 2).Areas
    Area.Resize(, 4).Select
Next Area

'Looping through each cell in each block
For Each Area In Range("A2:A" & lr).SpecialCells(xlCellTypeConstants, 2).Areas
    Set Rng = Area.Resize(, 4)
    For Each Cell In Rng
        Cell.Select
    Next Cell
Next Area
End Sub

你可以试试这样的

Sub LoopThroughZones()
Dim lr As Long, iRow As Object
Dim Area As Range, Rng As Range, Cell As Range

lr = Cells(Rows.Count, 1).End(xlUp).Row

'Loopting through each block
For Each Area In Range("A2:A" & lr).SpecialCells(xlCellTypeConstants, 2).Areas
    Area.Resize(, 4).Select
Next Area

'Looping through each cell in each block
For Each Area In Range("A2:A" & lr).SpecialCells(xlCellTypeConstants, 2).Areas
    Set Rng = Area.Resize(, 4)
    For Each Cell In Rng
        Cell.Select
    Next Cell
Next Area
End Sub

我将在数组中定义每个不同的区域,然后在数组中循环以进行修改/计算。类似于:

    Option Explicit

    Sub Regions()

    Dim rng As Range
    Dim wks As Worksheet
    Dim Region() As Range
    Dim i As Integer, j As Integer
    Dim LastRow As Integer, LastColumn As Integer

    'Your worksheet name

    Set wks = Worksheets("Sheet1")

    'Find last row and column of data

    LastRow = wks.Cells.SpecialCells(xlCellTypeLastCell).Row
    LastColumn = wks.Cells.SpecialCells(xlCellTypeLastCell).Column

    'Put distinct range areas into an array

    j = 1

    For i = 2 To LastRow

        If Not Cells(i, 1) = "" And (Cells(i, 1).Offset(-1, 0).Value = "" _
        Or wks.Cells(i, 1).Offset(-1, 0).Row = 1) Then

           ReDim Preserve Region(1 To j)
           Set rng = wks.Range(Cells(i, 1), Cells(LastRow, LastColumn))
           Set Region(j) = _
           wks.Range(Cells(i, 1), Cells(rng.End(xlDown).Row, rng.End(xlToRight).Column))
           j = j + 1

        End If

    Next i

    Dim rngCell As Range

    For i = 1 To UBound(Region)
        Region(i).Select

             'My test
             For Each rngCell In Region(i)
                   rngCell.Interior.ColorIndex = 1 + i
             Next

    Next i

    End Sub

这是一种非常粗糙的确定下一个区域开始位置的方法,因此如果您的电子表格在每个区域之间没有空白单元格,您可能需要对其进行调整。或者,列a中的随机空白单元格可能会造成一些混乱。

我将在数组中定义每个不同的区域,然后在数组中循环以进行修改s/计算。类似于以下内容:

    Option Explicit

    Sub Regions()

    Dim rng As Range
    Dim wks As Worksheet
    Dim Region() As Range
    Dim i As Integer, j As Integer
    Dim LastRow As Integer, LastColumn As Integer

    'Your worksheet name

    Set wks = Worksheets("Sheet1")

    'Find last row and column of data

    LastRow = wks.Cells.SpecialCells(xlCellTypeLastCell).Row
    LastColumn = wks.Cells.SpecialCells(xlCellTypeLastCell).Column

    'Put distinct range areas into an array

    j = 1

    For i = 2 To LastRow

        If Not Cells(i, 1) = "" And (Cells(i, 1).Offset(-1, 0).Value = "" _
        Or wks.Cells(i, 1).Offset(-1, 0).Row = 1) Then

           ReDim Preserve Region(1 To j)
           Set rng = wks.Range(Cells(i, 1), Cells(LastRow, LastColumn))
           Set Region(j) = _
           wks.Range(Cells(i, 1), Cells(rng.End(xlDown).Row, rng.End(xlToRight).Column))
           j = j + 1

        End If

    Next i

    Dim rngCell As Range

    For i = 1 To UBound(Region)
        Region(i).Select

             'My test
             For Each rngCell In Region(i)
                   rngCell.Interior.ColorIndex = 1 + i
             Next

    Next i

    End Sub

这是一种非常粗糙的确定下一个区域开始位置的方法,因此如果您的电子表格在每个区域之间没有空白单元格,您可能需要对其进行调整。或者,a列中的随机空白单元格可能会造成一些混乱。

哦,天哪,这太棒了!它使用了内置的
区域
,这正是我试图使用/学习的nd非常直观,无需添加许多附加步骤。谢谢!:D@BruceWayne不客气!很高兴你发现它很有用。:)哦,伙计,这太棒了!它使用了内置的
区域
,这正是我试图使用/学习的,并且非常直观,无需添加许多额外的步骤。谢谢D@BruceWayne不客气!很高兴您发现它很有用。:)谢谢这个-我喜欢它,并且可能会将它应用到我拥有的其他一些文件中。现在,它将为我当前的宏添加更多的代码,但非常感谢您的聪明建议!不客气@brucewayne,您选择的答案确实是最适合您的案例的答案谢谢-我喜欢它,并且可能会将其应用到我的其他一些文件中。现在,它将为我当前的宏添加更多的代码,但非常感谢您的聪明建议!不客气@brucewayne,你选择的答案确实是最适合你的