0

更新:

好的,所以我使用了下面的代码,它完成了我需要它做的事情,即检查值是否为 0,如果是,则删除整行。但是,我想一次对一个工作簿中的多个工作表执行此操作。以下代码所做的是它仅从当前电子表格中删除零,当您通过 VBA 脚本打开 excel 时,默认情况下该电子表格处于活动状态。这里是工作零删除代码:

Dim wsDCCTabA As Excel.Worksheet
Dim wsTempGtoS As Excel.Worksheet

Set wsDCCTabA = wbDCC.Worksheets("Login")
Set wsTempGtoS = wbCalc.Worksheets("All_TemporaryDifferences")

Dim LastRow As Long, n As Long
LastRow = wsTempGtoS.Range("E65536").End(xlUp).Row
For n = LastRow To 1 Step -1
If Cells(n, 5).Value = 0 Then
    Cells(n, 5).EntireRow.Delete
End If
Next

我究竟做错了什么?当我对同一个工作簿中的另一个工作表做同样的事情时,它什么也没做。我正在使用以下代码从另一个工作表中删除零:

Set wsPermGtoS = wbCalc.Worksheets("All_PermanentDifferences")
'delete rows with 0 description  
Dim LastRow As Long, n As Long
LastRow = wsPermGtoS.Range("E65536").End(xlUp).Row
For n = LastRow To 1 Step -1
If Cells(n, 5).Value = 0 Then
    Cells(n, 5).EntireRow.Delete
End If
Next

有什么想法吗?或做同样事情的另一种方式?

原始问题:

我想删除所有在特定列中为零的行。我正在使用以下代码,但似乎什么也没发生:

 CurrRow = (Range("E65536").End(xlUp).Row)
 For Count = StartRow To CurrRow
     If wsDCCTabA.Range("E" & Count).Value = "0" Then
         wsDCCTabA.Rows(Count).Delete
     End If
 Next

StartRow包含起始行值 CurrRow包含最后使用的行的行值

4

4 回答 4

1

看看这是否有帮助:

Sub DelSomeRows()

    Dim colNo As Long:      colNo = 5             ' hardcoded to look in col 5
    Dim ws    As Worksheet: Set ws = ActiveSheet  ' on the active sheet

    Dim rgCol As Range
    Set rgCol = ws.Columns(colNo)                          ' full col range (huge)
    Set rgCol = Application.Intersect(ws.UsedRange, rgCol) ' shrink to nec size
    Dim rgZeroCells As Range ' range to hold all the "0" cells (union of disjoint cells)
    Dim rgCell      As Range ' single cell to iterate
    For Each rgCell In rgCol.Cells
        If Not IsError(rgCell) Then
            If rgCell.Value = "0" Then
                If rgZeroCells Is Nothing Then
                    Set rgZeroCells = rgCell ' found 1st one, assign
                Else
                    Set rgZeroCells = Union(rgZeroCells, rgCell) ' found another, append
                End If
            End If
        End If
    Next rgCell
    If Not rgZeroCells Is Nothing Then
        rgZeroCells.EntireRow.Delete ' deletes all the target rows at once
    End If
End Sub
于 2012-04-17T18:05:52.093 回答
0

我知道了。为了将来参考,我使用了

ActiveWorkbook.Sheets("All_temporaryDifferences").Activate 

ActiveWorkbook.Sheets("All_Permanentdifferences").Activate
于 2012-04-18T21:54:37.007 回答
0

删除一行后,您需要减去“计数”变量

CurrRow = (Range("E65536").End(xlUp).Row)
For Count = StartRow To CurrRow
    If wsDCCTabA.Range("E" & Count).Value = "0" Then
        wsDCCTabA.Rows(Count).Delete
        ' Add this line:
        Count = Count - 1
    End If
Next
于 2012-04-18T06:00:54.303 回答
0

你不需要使用ActiveWorkbook.Sheets("All_temporaryDifferences").Activate. 实际上,如果与您ActiveWorkbook不同,wbCalc则会出现错误。

您真正的问题是您使用的是对Cells(n, 5).Value. 不合格意味着您没有指定要使用的工作表,因此它默认为活动工作表。这有时可能有效,但它是糟糕的代码。在你的情况下它没有工作。

相反,您应该始终使用合格的引用。wsTempGtoS.Cells(n, 5).Value是合格的参考。wsTempGtoS指定您想要的工作表,这样 VBA 就不会被猜测。

Dim LastRow As Long, n As Long
LastRow = wsTempGtoS.Range("E65536").End(xlUp).Row
For n = LastRow To 1 Step -1
    If wsTempGtoS.Cells(n, 5).Value = 0 Then
        wsTempGtoS.Cells(n, 5).EntireRow.Delete
    End If
Next

这:CurrRow = (Range("E65536").End(xlUp).Row)也是一个不合格的参考。相反,它应该是CurrRow = wsDCCTabA.Range("E65536").End(xlUp).Row.

于 2016-04-23T00:05:53.247 回答