【问题标题】:VBA Delete entire row if value is less than specified value - deletes wrong rows如果值小于指定值,VBA 删除整行 - 删除错误的行
【发布时间】:2015-03-18 17:55:18
【问题描述】:

我正在尝试运行一个小宏来搜索工作表的 S 列,如果 S 列中的值

我目前正在运行的代码删除了一些行,但似乎是随机删除的,而不是基于 s 中的单元格值。谁能看到我的错误来自哪里?

Sub sort_delete_500cust()

         Dim WS_Count As Integer
         Dim I, K As Integer
         Dim endrow As Long

         ' Set WS_Count equal to the number of worksheets in the active
         ' workbook.
         WS_Count = Workbooks("Standard.xlsx").Worksheets.count

         ' Begin the loop.
         For I = 1 To WS_Count

            With Worksheets(I)

                endrow = .Range("a" & .Rows.count).End(xlUp).row ' only works if cells are unmerged
                Range("A2:v2" & endrow).Sort _
                Key1:=Range("s2"), Order1:=xlDescending 'key is the sort by column

                                For K = 2 To endrow

                        If .Cells(K, 19).Value < 0.501 Then
                        .Range("S" & K).EntireRow.Delete

                        End If

                    Next K

            End With

         Next I

      End Sub

干杯!

【问题讨论】:

  • 专业提示,@pnuts。删除时,始终从底部开始,一直到顶部。
  • 干杯@pnuts。我会花一些时间来弄清楚 o_O

标签: vba excel if-statement delete-row


【解决方案1】:

您需要以相反的顺序遍历您的 K 循环。否则,行将在您删除时被跳过,因为它们被删除操作向上移动,并且您的 K 值在它们之上递增。

For K = endrow To 2 Step -1
    If CDec(.Cells(K, 19).Value) < CDec(0.501) Then
        .Range("S" & K).EntireRow.Delete
    End If
Next

【讨论】:

  • 干杯。这很有意义,但是我认为我的原始代码存在更多问题,因为它仍然留下一些值
  • @squarah - 使用CDbl 函数进行比较可能就像转换为双精度一样简单。查看更新的答案。
  • 不幸的是,这似乎并没有改变。我看到 0.501 是双精度数,但究竟是什么投射到双精度数?干杯!
  • @squarah - 实际上最安全的做法是将两边都转换为小数。您可以使用 CDec 函数执行此操作(请参阅更新的答案)。双重比较有时会有点不稳定。
  • 感谢您的帮助,该部分现在运行良好。我已将使用相同代码遇到的其他问题发布到另一个问题link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 2013-07-31
相关资源
最近更新 更多