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,你选择的答案确实是最适合你的