【问题标题】:For loop end variable doesn't changeFor循环结束变量不改变
【发布时间】:2015-12-22 05:46:48
【问题描述】:

我编写了一个非常简单的循环,它遍历表格列并将负值着色为红色,正值着色为绿色并删除空行。

删除行时会出现问题。我更新了RowCount 的值,并补偿i 以再次检查同一行,因为刚刚删除了一行。如果我有一列有 10 行,其中 2 行是空的,它们将被删除。我希望For i = 1 to RowCount 会在 8 处停止,但它会继续到 9 并产生错误,因为它随后会尝试删除不存在的第 9 行。

我需要做什么才能使循环在 8 处停止而不是继续(我假设 RowCount 的初始值。

Sub ColourFilledCells()
    Dim Table1 As ListObject
    Set Table1 = ThisWorkbook.Worksheets(1).ListObjects(1)

    Dim i As Lon, RowCount As Long

    RowCount = Table1.ListRows.Count

    For i = 1 To RowCount
        If Not Table1.DataBodyRange(i, 1) = Empty Then
            With Table1.DataBodyRange(i, 1)
                If .Value < 0 Then
                    .Interior.Color = RGB(255, 0, 0)
                ElseIf .Value > 0 Then
                    .Interior.Color = RGB(0, 255, 0)
                Else
                    .ColorIndex = 0
                End If
            End With
        ElseIf Table1.DataBodyRange(i, 1) = Empty Then
            Table1.ListRows(i).Delete
            RowCount = RowCount - 1
            i = i - 1
        End If
    Next i

End Sub

【问题讨论】:

  • 只需向后循环For i =RowCount to 1 step -1 并去掉ElseIf 中的两个计数器
  • ①使用条件格式来实现你的.Interior.Color颜色变化。 ② 要删除填充,请使用.Interior.Pattern = xlNone 而不是.Interior.ColorIndex = 0 ③ 请参阅this 以缩短删除行所需的时间。
  • @Jeeped,谢谢,1,会更容易,但我不希望颜色在按下按钮时改变。 2,对此一无所知:) 3. 我一直在玩 Fadi 的解决方案,现在我只是使用循环来创建在循环外根据需要着色/删除的范围。

标签: excel vba


【解决方案1】:

为避免删除影响 For 循环的问题,请倒数。

你的代码,重构(加上一些建议)

For i = RowCount to 1 Step -1
    If Not isempty( Table1.DataBodyRange(i, 1)) Then
        With Table1.DataBodyRange(i, 1)
            If .Value < 0 Then
                .Interior.Color = vbRed
            ElseIf .Value > 0 Then
                .Interior.Color = vbGreen
            Else
                .ColorIndex = xlColorIndexNone
            End If
        End With
    Else 
        Table1.ListRows(i).Delete
    End If
Next i

【讨论】:

  • 太好了,我不知道您将步骤更改为负数。我认为Else Then 应该是简单的Else
【解决方案2】:

试试这个代码:

Sub ColourFilledCells()
Dim Table1 As ListObject
Dim uRng As Range

Set Table1 = ThisWorkbook.Worksheets(1).ListObjects(1)

Dim i As Long, RowCount As Long

RowCount = Table1.ListRows.Count

For i = 1 To RowCount
    If Not Table1.DataBodyRange(i, 1) = Empty Then
        With Table1.DataBodyRange(i, 1)
            If .Value < 0 Then
                .Interior.Color = RGB(255, 0, 0)
            ElseIf .Value > 0 Then
                .Interior.Color = RGB(0, 255, 0)
            Else
                .ColorIndex = 0
            End If
        End With
    ElseIf Table1.DataBodyRange(i, 1) = Empty Then            
        If uRng Is Nothing Then
          Set uRng = Table1.ListRows(i).Range
        Else
          Set uRng = Union(uRng, Table1.ListRows(i).Range)            
        End If

    End If
Next i

If Not uRng Is Nothing Then uRng.Delete xlUp

End Sub

【讨论】:

  • 这很棒,因为在循环外同时删除了所有行,所以速度要快得多。到目前为止,我对范围的工作不多,uRng.Delete xlUp 中的xlUp 有什么作用?
  • @SilentRevolution,见:Range.Delete MethodxlUpxlShiftUp 都具有相同的值:-4162
猜你喜欢
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 2016-04-10
相关资源
最近更新 更多