这是我在SO的第一篇文章。如你所知,我不是一名专业的程序员,只是一名普通的办公室工作人员,不时做一些VBA以更快地完成工作。
我想使用VBA循环一系列单元格,VBA在其中一列中包含特定的标志值。这些范围是非连续的,因为我们选择具有连续标志值的范围,并且该值在每一行中随机变化。
例如,在下表中,我们如何循环三次(因为有三个非连续范围和连续的-1标志)选择第一次迭代中的前三行,第二次运行中的第5行和第6行,并在第三次迭代中选择第8行?
+-------+---------+------+
| Index | Value | Flag |
+-------+---------+------+
| 1 | 0.43534 | -1 |
| 2 | 0.24366 | -1 |
| 3 | 0.23654 | -1 |
| 4 | 0.56854 | 0 |
| 5 | 0.97867 | -1 |
| 6 | 0.35678 | -1 |
| 7 | 0.47845 | 0 |
| 8 | 0.74567 | -1 |
+-------+---------+------+
答案 0 :(得分:1)
您仍然会正常循环,但使用If语句检查第3列(C)是否有-1,例如:
Dim i as Long
For i = 2 to 9 'Assumes 1 is a header row, despite 1-8 being counted
If Cells(i,3).Value= -1 Then
'Do something
End If
Next i
答案 1 :(得分:1)
以下代码会在消息框中显示结果,并指定Flag = -1
的所有范围。根据您的示例数据图片,输出将为$C$2:$C$4
,$C$6:$C$7
,$C$9
。
Sub Demo()
Dim ws As Worksheet
Dim cel As Range, rng As Range, fCell As Range, tempRng As Range
Dim lastRow As Long
Dim isNegative As Boolean
Set ws = ThisWorkbook.Sheets("Sheet2") 'change Sheet2 to your data sheet
isNegative = False
With ws
lastRow = .Cells(.Rows.Count, "C").End(xlUp).Row 'last row with data in Column C
For Each cel In .Range("C2:C" & lastRow + 1) 'loop through each cell in Column C
If cel.Value = -1 Then 'check if value is -1
If Not isNegative Then
Set fCell = cel
isNegative = True
End If
Else 'if not then set range
If isNegative Then
If rng Is Nothing Then
Set rng = .Range(fCell, cel.Offset(-1, 0).Address)
Else
Set rng = Union(rng, .Range(fCell, cel.Offset(-1, 0).Address))
End If
isNegative = False
End If
End If
Next cel
End With
For Each tempRng In rng.Areas 'loop through all ranges with -1
MsgBox tempRng.Address
'write your code here
Next tempRng
End Sub
以下是代码中使用的Booloean变量
isNegative
的简要说明。
isNegative
用于维护标记.Range("C2:C" & lastRow + 1)
范围内的最后一个单元格值是否为-1
,并在开头设置为FALSE
。首先-1
被抵消后,isNegative
设置为TRUE
,fCell
被分配相应的单元格地址。直到循环遇到-1
,isNegative
将保持TRUE
。当遇到值不等于-1
的单元格时,如果只有一个单元格rng
,则使用fCell
的{{1}}设置范围,使用Set rng = .Range(fCell, cel.Offset(-1, 0).Address)
使用-1
设置范围如果遇到多个Set rng = Union(rng, .Range(fCell, cel.Offset(-1, 0).Address))
的单元格,则会遇到其他-1
当遇到值不等于-1
的第二个或更多个连续单元时,没有任何反应。当遇到值为-1
的下一个单元格时,将重复上述过程。
答案 2 :(得分:0)
我会考虑使用像do while flag=-1
这样的东西。
或者使用条件if Flag(index)=Flag(index+1) then *do something*
,因为我觉得更复杂的东西需要设计一个模块类。