2017-06-17 852 views
2

我正在寫一個excel-vba來查找和刪除整行,如果在特定列中有空白單元格。如果至少有一個空白單元格,但如果沒有空白單元格,則顯示錯誤400,我的宏工作正常。我的代碼是如何解決excel-vba中的錯誤400

Sub GPF_Sign() 
Dim i As Integer, n as integer 
Dim LROW As Long 

    LROW = Sheets("GPF").Range("B200").End(xlUp).Row 

    n = Range("D9:D" & LROW).SpecialCells(xlCellTypeBlanks).Cells.Count 
    If n > 0 Then 
     Range("D9:D" & LROW).SpecialCells(xlCellTypeBlanks).EntireRow.Delete 
    End If 
End Sub 
+0

? –

+0

,因爲我的行不能超過150個 –

+0

您可以使用這個來代替指定範圍值LROW = Sheets(「GPF」)。Range(「B」&rows.count).End(xlUp).Row' –

回答

1

任你選

方法1:使用OERN( On Error Resume Next)

Sub WAY_ONE() 
    Dim ws As Worksheet, LROW As Long 
    Dim rng As Range 

    Set ws = Sheets("GPF") 

    With ws 
     LROW = .Range("B" & .Rows.Count).End(xlUp).Row 

     On Error Resume Next 
     Set rng = .Range("D9:D" & LROW).SpecialCells(xlCellTypeBlanks) 
     On Error GoTo 0 

     If Not rng Is Nothing Then rng.EntireRow.Delete 
    End With 
End Sub 

方式二:你爲什麼要使用B200的LROW使用自動篩選

Sub WAY_TWO() 
    Dim ws As Worksheet, LROW As Long 
    Dim rng As Range 

    Set ws = Sheets("GPF") 

    With ws 
     .AutoFilterMode = False 

     LROW = .Range("B" & .Rows.Count).End(xlUp).Row 

     Set rng = .Range("D9:D" & LROW) 

     With rng 'Filter, offset(to exclude headers) and delete visible rows 
      .AutoFilter Field:=1, Criteria1:="" 
      .Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete 
     End With 

     .AutoFilterMode = False 
    End With 
End Sub 
1

您正在使用「.SpecialCells(xlCellTypeBlanks)」的方法,試圖返回一個範圍。如果沒有空白單元格,則下一部分「.cells.count」試圖計數Nothing。這就是爲什麼它會給你一個錯誤。

由於您已經在檢查n> 0,所以您可以在「n =」行上方添加On Error Resume Next。如果在此之後還有更多的代碼,則可能需要在此部分之後放置On Error GoTo 0,以便它不會忽略稍後的錯誤。

+0

或者,'LROW'必須大於或等於9. – OldUgly

4

您可以使用On Error Resume Next,但這不是通常推薦的方法,因爲它可能會掩蓋其他錯誤。相反,嘗試在無差錯的方式計算n

n = Application.CountIf(Sheets("GPF").Range("D9:D" & LROW), "") 

另一個,還是更好的辦法是使用AutoFilter

Sub GPF_Sign() 
    With Sheets("GPF").Range("D8:D200") 
    .AutoFilter 1, "" 
    .Offset(1).EntireRow.Delete 
    .AutoFilter 
    End With 
End Sub 
+0

++我也會去自動過濾器 –

+0

順便說一句,它應該是'.Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete' –

+1

@SiddharthRout謝謝。 btw'SpecialCells(xlCellTypeVisible)'不需要,因爲'.Delete'只對可見的行生效:) –