循环使用条件选择的非连续行

时间:2017-09-26 12:09:53

标签: excel vba excel-vba

这是我在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 |
+-------+---------+------+

3 个答案:

答案 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设置为TRUEfCell被分配相应的单元格地址。直到循环遇到-1isNegative将保持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*,因为我觉得更复杂的东西需要设计一个模块类。