2016-12-14 74 views
1

我有這段代碼刪除行,如果它有列D到L空單元格。
由於某種原因,它也刪除我的標題單元格位於C8。
任何人都知道爲什麼?以及如何解決它?VBA代碼刪除不正確的行

Sub RemoveEmptyRows() 

Dim ws As Worksheet 
For Each ws In Sheets 
ws.Activate 

    Dim n As Long 
    Dim nlast As Long 
    Dim rw As Range 
    Set rw = ActiveWorkbook.ActiveSheet.UsedRange.Rows 
    nlast = rw.count 
    For n = nlast To 1 Step -1 
     If (rw.Cells(n, 4).Value = "" And rw.Cells(n, 5).Value = "" And rw.Cells(n, 6).Value = "" And rw.Cells(n, 7).Value = "" And rw.Cells(n, 8).Value = "" And rw.Cells(n, 9).Value = "" And rw.Cells(n, 10).Value = "" And rw.Cells(n, 11).Value = "") Then 
      rw.Rows(n).Delete 
     End If 
    Next n 
    Next ws 
End Sub 
+2

如果頂部有空白行,'UsedRange'的行索引不一定匹配工作表的行索引。 – Comintern

+0

那麼,代碼有點混亂。例如。在循環內定義變量會讓我噁心。但實際上它刪除了第4列(D)到第11列(K)中沒有任何內容的每一整行。因此,如果您的D8:K8中的單元格爲空,則第8行將被刪除。嘗試使用F8逐步完成代碼。 – vacip

+0

或嘗試在單元格「D8」中放入某些內容(即某些空白字符)。或者,在代碼中檢查('If n <> 8') –

回答

3

的問題是,你正在使用的UsedRange的行和列的索引與他們的Worksheet的指標相匹配的假設。情況並非一定如此。正如你在評論中對@YowE3K指出的那樣,你有一些完全空的列。

該解決方案非常簡單 - 只需使用ws.Cells而不是rw.Cells即可。我還會把所有內容都放到With區塊中,以使其更快,更具可讀性。您也可以短路,通過將其轉換爲Select Case梯渴望If聲明:

Sub RemoveEmptyRows() 
    Dim ws As Worksheet 
    For Each ws In ThisWorkbook.Sheets 
     With ws 
      Dim n As Long 
      Dim nlast As Long 
      nlast = .UsedRange.Rows(.UsedRange.Rows.Count).Row 
      For n = nlast To 9 Step -1 
       Select Case False 
        Case .Cells(n, 4).Value = vbNullString 
        Case .Cells(n, 5).Value = vbNullString 
        Case .Cells(n, 6).Value = vbNullString 
        Case .Cells(n, 7).Value = vbNullString 
        Case .Cells(n, 8).Value = vbNullString 
        Case .Cells(n, 9).Value = vbNullString 
        Case .Cells(n, 10).Value = vbNullString 
        Case .Cells(n, 11).Value = vbNullString 
        Case Else 
         .Rows(n).Delete 
       End Select 
      Next n 
     End With 
    Next ws 
End Sub 

注意,也有更可靠的方法來找到表的最後一排。

+0

不應該rw.Rows(n).Delete是ws.Rows(n).Delete .. – MTBthePRO

+0

@MTBthePRO - 是的。固定。 – Comintern

+0

不,它仍然刪除標題.. – MTBthePRO

0

這是你的代碼稍作修改。

Sub RemoveEmptyRows() 

    Dim ws As Worksheet 
    Dim n As Long 
    Dim nlast As Long 
    Dim rw As Range 

    For Each ws In Worksheets 'changed. In case there are Chart Sheets. 
    'deleted ws.activate. AVOID THAT AS PLAGUE 
     Set rw = ws.UsedRange.Rows 
     With rw 
      nlast = .Count 
      For n = nlast To 2 Step -1 'Note the 2, to skip title row. As was pointed in comments. 
       If (.Cells(n, 4).Value2 = "" And .Cells(n, 5).Value2 = "" And .Cells(n, 6).Value2 = "" And .Cells(n, 7).Value2 = "" And .Cells(n, 8).Value2 = "" And .Cells(n, 9).Value2 = "" And .Cells(n, 10).Value2 = "" And .Cells(n, 11).Value2 = "") Then 
        .Rows(n).Delete 
       End If 
      Next n 
     End With 'rw 
    Next ws 
End Sub 
1

你的標題是C8,那麼請不要刪除,直到行號1:

更換

For n = nlast To 1 Step -1 

通過

For n = nlast To 9 Step -1 
0

你可以試試這個(未測試)代碼:

Sub RemoveEmptyRows() 
    Dim ws As Worksheet 
    Dim nCols As Long 

    For Each ws In Sheets 
     With Intersect(.Range("D:K"), .UsedRange) 
      nCols = .Columns.Count 
      With .SpecialCells(xlCellTypeBlanks) 
       For iArea = .Areas.Count To 1 Step -1 
        If .Areas(iArea).Count = nCols Then .Areas(iArea).EntireRow.Delete 
       Next 
      End With 
     End With 
    Next ws 
End Sub