【问题标题】:VBA- Auto-delete empty rows with Looping RangeVBA-使用循环范围自动删除空行
【发布时间】:2020-11-11 00:02:39
【问题描述】:

第一次使用该网站,因为我是 VBA 的新手,但我正在尝试编写一段代码来查看我选择的列,在本例中为 A 列,然后遍历每一行并删除空行直到数据集结束。我正在考虑做一个循环,我将引用我的数据集 A1 中的第一个单元格并将行号设置为一个整数,该整数将随着循环的每次完成而增加 1。

Private Sub CommandButton1_Click()

Dim X as Integer
    Set X = 1
For X = 1 to 100
If Sheet1.Range("A":X).Value = "" Then Rows(X).EntireRow.Delete
Next X 

结束子

感谢您提供的任何帮助或见解!

【问题讨论】:

  • 我想知道我的代码出了什么问题。对于 A1:A100 我希望它自动通过并删除空行,但我遇到了麻烦。我认为解决它的最简单方法是每次循环并将 A 列中的行引用更改为 1。比如 A1 = 0 → 删除行,A2 =1 → 保留,A3 =8 → 保留,A4 = 0 → 删除。
  • 对于它的价值,在列上过滤空单元格,然后使用 .SpecialCells(xlCellTypeVisible) 删除可见行要简单得多,而且要快得多.参考:stackoverflow.com/questions/17194394/…

标签: excel vba loops


【解决方案1】:

你错过了你的“结束如果”。此外,当遍历一个范围并删除行时,您需要自下而上循环,因为当删除一行时,它不会重新计算范围。

Sub CommandButton1_Click()

Dim x As Long
Dim lastrow As Long
    lastrow = Range("A1" & Rows.Count).End(xlUp).Row

        For x = lastrow To 1 Step -1

            If Worksheets(1).Range("A" & x).Value = "" Then 
                Worksheets(1).Range("A" & x).EntireRow.Delete
            End If
        Next x

End Sub

【讨论】:

  • 如果语句不需要在一行中添加end if
【解决方案2】:
  1. 您想在Range("A":X) 中进行连接,因此将: 更改为&(或使用cells)。

  2. 删除行时,您应该后退一步或创建一个联合范围,否则每次执行删除都会跳过一行。

  3. 您不想set 仅用于对象的整数。在 VBA 中使用整数而不是 long 也没有任何好处,因此最好始终使用 long,因为整数会在非常大的电子表格中产生溢出错误。

  4. Rows(X).EntireRow.Delete 使用的是相对引用而不是显式引用,使用 with 或显式引用每个范围对象。

  5. 您会立即使用循环覆盖X,因此您无需在循环之前为其分配值。

这里有一些代码可以满足你的需要:

    Dim lastrow As Long
    Dim x As Long
    
    With Sheet1
        lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
        For x = lastrow To 1 Step -1
            If .Cells(x, 1).Value = "" Then
                .Rows(x).EntireRow.Delete
            End If
        Next x
    End With

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多