2012-04-17 106 views
0

UPDATE:删除整个行其列包含0,Excel 2007中VBA

好了,所以我用下面的代码和它做什么,我需要做的,即检查是否值是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 

我在做什么错了?当我为同一个工作簿中的另一个工作表做同样的事情时,它不会做任何事情。我正在使用以下代码从anohter工作表中删除零:

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包含上次使用的行的行值

+0

我认为你的意思是VBA(Excel内)而不是'vbscript'。问题重新标记 – brettdj 2012-04-18 02:30:26

+0

尝试逐行调试(F8)并检查每个变量的值。 – CaBieberach 2012-04-18 08:06:54

回答

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 
+0

给我一个错误,找不到Application.Intersect的方法。 您确定这在Excel 2007中兼容吗? – CarbonD1225 2012-04-17 19:01:41

+0

我用2010年,2007年,但应该有一个交叉方法 ​​- 尝试更改为普通的“相交”,而不是Application.Intersect。 (另外 - 确保范围实际相交 - 例如,如果列5为空,则会导致运行时错误 - 按设计)。 – tpascale 2012-04-17 22:15:38

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 
+0

如果您想要防止在删除行后必须将计数重置为-1,您还可以反向循环从下到上的计数。 – 2012-04-18 11:29:49

+0

是的,你可以实际使用DO WHILE ......循环以及 – StanFish 2012-04-18 11:36:14

0

我明白了。对于未来的参考,我用

ActiveWorkbook.Sheets("All_temporaryDifferences").Activate 

ActiveWorkbook.Sheets("All_Permanentdifferences").Activate 
+0

这是伟大的,你共享你的修复,但这个是不是真的一个很好的答案。它掩盖了你的实际问题。真正的答案是使用'Range()'或'Cells()'指定哪个工作表(请参阅我的答案) – 2016-04-23 00:11:55

0

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

您真正的问题是您正在使用对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