【问题标题】:Deleting every second row in excel via VBA通过VBA删除excel中的每一行
【发布时间】:2018-08-09 16:24:50
【问题描述】:

我想编写一个代码,检查一张纸中有多少行,然后每隔一行删除一次。程序应该是这样的:

  1. 获取总行数
  2. 从最后一行开始,删除它
  3. 上两行,删除
  4. 到达第 2 行后,停止

这是我的代码,它在第 8 行停止工作 activeRow = activeRow - 2

Sub trendlucid()
    Dim numOfRows As Integer
    Dim activeRow As Integer
    numOfRows = Sheets(actualsheet).UsedRange.Rows.Count
    activeRow = numOfRows
    Do While activeRow > 1
        Rows(activeRow).EntireRow.Delete
        activeRow = activeRow - 2
    Loop
End Sub

我不知道它为什么会停止。谁能帮帮我?

谢谢你,祝你有美好的一天

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    删除行时,循环返回:

    Sub TestMe()
    
        Dim numOfRows As Long
        Dim activeRow As Long
        numOfRows = ActiveSheet.UsedRange.Rows.Count
        activeRow = numOfRows
    
        Dim i As Long
    
        For i = numOfRows To 1 Step -2
            ActiveSheet.Rows(i).EntireRow.Delete
        Next i
    
    End Sub
    

    如果您首先将它们保存在一个范围中,然后在最后删除该范围,则删除行的方法更快一些。因此,您只使用一次删除操作:

    https://stackoverflow.com/a/50350507/5448626

    【讨论】:

    • 谢谢,这确实有效,但为什么它不能与 activeRow 一起使用,我通过减去 2 来循环它。谢谢
    • @Kyrbi - 因为我认为问题只是在循环中。 actualsheetInteger 现在在代码中更新。
    • 好的,我现在尝试了你的代码,但它通过没有任何错误,但我的 excel 中仍然每隔一行。
    • @Kyrbi - 再试一次,我没有写入要删除的正确行。
    • 谢谢它现在确实有效,而且它是正确的答案。 :)
    【解决方案2】:

    你的代码有两个缺陷

    1. 不确定工作表参考

      您正在计算 UsedRange 行数 Sheets(actualsheet) 当您删除 ActiveSheet 行时(Rows(activeRow).EntireRow.Delete 中隐式引用的工作表)

      所以一定要引用同一张表(例如:ActiveSheet

    2. 不确定范围参考

      UsedRange 可能从不同于第 1 行的行开始,而Rows(index) 考虑从第 1 行开始的行索引

      所以参考UsedRange Rows() 而不是ActiveSheet(隐式假设)Rows()

    所有这些总结为:

    Sub trendlucid()
        Dim numOfRows As Long ' use Long instead of Integer to avoid overflow issue for more thna some 32k rows or so
        Dim activeRow As Integer
        With ActiveSheet.UsedRange ' reference "active" sheet 'UsedRange' range
            numOfRows = .Rows.Count ' count the number of rows of referenced range
            activeRow = numOfRows
            Do While activeRow > 1
                .Rows(activeRow).EntireRow.Delete ' reference 'UsedRange' 'Rows()' instead of 'ActiveSheet' 'Rows()'
                activeRow = activeRow - 2
            Loop
        End With
    End Sub
    

    【讨论】:

      【解决方案3】:

      你必须尝试类似的东西......

      您不需要将EntireRowRows 一起使用,只需要Row Index 并且Delete 操作将执行到整行。

      Sub trendlucid()
          Dim numOfRows As Long
          Dim i As Long
          numOfRows = ActiveSheet.UsedRange.Rows.Count
          For i = numOfRows To 2 Step -2
              Rows(i).Delete
          Next i
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        • 1970-01-01
        • 2017-08-30
        • 1970-01-01
        • 2013-06-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多