在工作表中循环区域/区域?

我有一个工作表,我想循环通过一堆不同的领域。 我将要做一些计算,并认为它会比列逐个单元更快更有效。

我尝试了一些不同的东西,但不知道如何跳到下一个区域。 我已经提出了一些意见,最有前途的是最后一个( For each cel in rng... ,但是我做了第一个cel.CurrentRegion.Select ,然后做事情,我怎么跳到下一个区域?

这是一个什么样的现在做的。

 Sub loop_through_zones() Dim rng As Range, area As Range, singleArea As Range, cel As Range Set rng = Range("A2:D15") For Each area In rng.Areas ' This just selects all the data. area.Select Next area For Each area In rng.CurrentRegion ' this just loops through cells in an area. area.Select Next area For Each cel In rng cel.CurrentRegion.Select ' gets current region! 'do something with region here ' ... ' now, go to the next REGION, not cel in current area...? Next cel End Sub 

在这里输入图像说明

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

编辑:它看起来像我可以做一些For i循环,但我很好奇,如果你可以用内置的CurrentRegion / Areas ,或者如果我必须这样做它kludgy:

 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 

你可以尝试这样的事情…

 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 

如果要将区域添加到电子表格中,则可以使用名称(如region-Nregion-1region-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的单元格,它就会被你的代码所取代。

当然,你可以想象很多方法来创buildFor Loopndynamic(如果你对它进行硬编码,每次添加一个新区域都必须改变它)。 例如:

 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 

我将在数组中定义每个不同的区域,然后遍历数组来进行修改/计算。 像这样的东西:

  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列中的随机空白单元格可能会造成一些破坏。