【问题标题】:My For Loop isn't deleting all the rows I want (VBA)我的 For 循环没有删除我想要的所有行(VBA)
【发布时间】:2021-11-11 08:19:01
【问题描述】:

我试图让我的 For 循环从我的工作表中删除一列中的所有 0,但它似乎留下了大约 9 行有 0。0 位于上一个过程中使用的列中InStr 函数和 9 0 是由于该函数无法找到子字符串。不确定这是否是问题所在。我的工作表中有大约 50,000 行。

Sub removeZeros()

Dim rng As Range, i As Long
Set rng = ActiveSheet.Range(Range("G2"), Range("G2").End(xlDown))

For i = rng.Rows.Count To 1 Step -1
    If rng.Cells(i, 3).Value = 0 Then rng.Cells(i).EntireRow.Delete
Next i

End Sub

任何帮助将不胜感激!

【问题讨论】:

  • 您知道您检查了rng.Cells(i, 3).Value = 0第一列中的值吗?而且您还知道,如果单元格包含字符串,则比较 rng.Cells(i, 3).Value = 0 将是 true?
  • 我在 VBA 方面没有经验,但我记得空列也可能会造成这样的问题 - 我不确定,如果是这种情况 - 可能是这 9 0 一个接一个?
  • @Storax 不是这样的,rng.Cells(rows , cols),如果那么它实际上是正确的
  • 是的,如果单元格为空,则比较 rng.Cells(i, 3).Value = 0 也将为真。如果要检查列 I 中的值,则必须调试并检查 rng.Cells(i, 3).Value = 0 是否为真。您可以在If rng.Cells(i, 3).Value = 0 Then rng.Cells(i).EntireRow.Delete 之前添加Debug.Assert rng.Cells(i, 3).Value <> 0,然后只要rng.Cells(i, 3).Value = 0 为真,代码就会停止。
  • Set rng = Range("G2:G" & cells(rows.count,"G").end(xlup).row)

标签: excel vba for-loop


【解决方案1】:

您知道哪些单元格未通过比较rng.Cells(i, 3).Value = 0 ,您可以使用以下代码更接近问题

Sub CheckCell()

    Dim i As Long
    
    Dim v As Variant
    Dim rg As Range
    
    i = 10
    Set rg = Range("I" & i)
    v = rg.Value
    Debug.Print v, TypeName(v), rg.Value = 0
    
End Sub

只需将i = 10 替换为检查失败的行。当然,您也可以debug 但这似乎超出了您的知识范围。或者您尝试assertions 以更接近根本原因

【讨论】:

  • 我是在完成我的 sub 之后还是之前运行这个 sub?另外,我正在检查 J 列中的 0,这是一个问题吗?
  • 没关系,您只需使用正确的数字调整行i= 10 。如果应该删除第 10 行,则保留第 10 行。如果应该删除第 234 行,则将其更改为 234。此代码不会修改任何数据,也不会解决问题。它应该让您更接近问题的原因。
  • 他们都回来了,0 Double True 另外,所有剩下的都被 InStr 函数赋予了 0,来自上一个子,因为没有找到子字符串
  • 恐怕没有
  • 我认为你必须学习如何调试,然后为受影响的行设置断点,然后逐步执行代码
猜你喜欢
  • 2018-07-08
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多