2012-04-17 77 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

相關問題