【问题标题】:How to delete specific columns(not entirely) in excel vba [duplicate]如何在excel vba中删除特定列(不完全)[重复]
【发布时间】:2020-02-20 22:35:34
【问题描述】:

当 T、U、V 列在同一行的值为 0 时,我试图删除列。但是,我使用的代码只删除了其中的一些,如下所示,即使我已经指定在我分配的特定单元格中删除它们,某些行的 T、U、V 列仍有 0。我的代码的哪一部分做错了?

Dim j As Long

Dim lr As Long
lr = Sheets(1).Cells(Rows.Count, "U").End(xlUp).Row

For j = 1 To lr

   If Sheets(1).Cells(j, 21).Value = 0 And Sheets(1).Cells(j, 22).Value = 0 And Sheets(1).Cells(j, 23).Value = 0 Then
   Sheets(1).Range("T" & j & ":W" & j).Delete
      j = j + 1
      End If
      Next

应用我的代码后,仍有剩余的行为零。

所以最终我希望它成为

【问题讨论】:

  • 如果你删除了一行,那么它下面的行就会使用那个行号,所以代码会跳过它。这可能是为什么?
  • 如果您删除或添加行,您的循环需要倒退For j = lr To 1 Step -1 否则删除/添加会更改总行数并且您的循环会跳转。
  • 更好——使用Union创建一个要删除的范围,最后一步删除。或者使用Range.AutoFilter 并在末尾删除可见行。
  • @cena 查看您问题上方的链接。之前已经被问过几次了。在询问之前搜索可能非常有效。
  • @Pᴇʜ 是的,我进行了搜索,但我错过了 For j = lr To 1 Step -1 的部分。还是谢谢

标签: excel vba


【解决方案1】:

试试:

Sub testr()

    Dim LastRow As Long, i As Long

    With ThisWorkbook.Worksheets("Sheet1")

         LastRow = .Cells(.Rows.Count, "S").End(xlUp).Row

        For i = LastRow To 2 Step -1
            If .Range("T" & i).Value = 0 And .Range("U" & i).Value = 0 And .Range("V" & i).Value = 0 Then
                .Rows(i).EntireRow.Delete
            End If
        Next i

    End With

End Sub

【讨论】:

  • 是否可以不删除整行,而只删除 T 列到 V 列?
  • @cena 你的意思是“删除”(删除单元格)还是“清除”(删除内容)?
  • @Pᴇʜ 我认为一旦单元格被删除就移动单元格意味着删除单元格?(不确定)
  • @cena 是的,问题是您希望下面的其余数据向上移动 1 行,还是希望在零的位置有一个空行?
  • 试试:.Range("T" & i & ":V" & i).Delete Shift:=xlUp
【解决方案2】:

您可以将所有范围合并到一个范围中,然后一次全部删除:

Sub CLEAR_ZERO_ROWS()

Dim BigRange As Range
Dim MyArray As Variant
Dim i As Long

With ThisWorkbook.Sheets(1)
    MyArray = .Range("B2:D" & .Range("A" & .Rows.Count).End(xlUp).Row).Value 'values into array


    For i = 1 To UBound(MyArray) Step 1
        If MyArray(i, 1) + MyArray(i, 2) + MyArray(i, 3) = 0 Then
            If BigRange Is Nothing Then
                Set BigRange = .Range("A" & i + 1 & ":D" & i + 1)
            Else
                Set BigRange = Union(BigRange, .Range("A" & i + 1 & ":D" & i + 1))
            End If
        End If
    Next i

End With


'we delete all at once is bigrange is not nothing

If Not BigRange Is Nothing Then BigRange.Delete xlUp

Erase MyArray
Set BigRange = Nothing

End Sub

顺便说一句,该代码适用于我在 A:D 列上所做的假数据集,因此您需要调整该部分。在执行代码之前,我有:

我得到代码后:

请注意,在这两种情况下,F 列中的连续数字都没有被删除。该代码只是删除了 4 个数据单元格并向上移动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-10
    • 2012-08-18
    • 2018-12-01
    • 2020-04-04
    • 2022-12-15
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多