如何解决 excel-vba 中的错误 400
How to resolve error 400 in excel-vba
我正在编写 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
您使用的方法“.SpecialCells(xlCellTypeBlanks)”正在尝试 return 一个范围。如果没有空白单元格,下一部分“.cells.count”将尝试计算 Nothing。这就是为什么它给你一个错误。
因为您已经在检查 n>0,您可以在 "n= " 行的正上方添加 On Error Resume Next
。如果在此之后还有更多代码,您可能希望在此部分之后放置一个 On Error GoTo 0
,这样它就不会忽略后面的错误。
您可以使用 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
任你选
方式 1:使用 OERN(错误继续下一步)
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
方式二:使用自动过滤器
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
我正在编写 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
您使用的方法“.SpecialCells(xlCellTypeBlanks)”正在尝试 return 一个范围。如果没有空白单元格,下一部分“.cells.count”将尝试计算 Nothing。这就是为什么它给你一个错误。
因为您已经在检查 n>0,您可以在 "n= " 行的正上方添加 On Error Resume Next
。如果在此之后还有更多代码,您可能希望在此部分之后放置一个 On Error GoTo 0
,这样它就不会忽略后面的错误。
您可以使用 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
任你选
方式 1:使用 OERN(错误继续下一步)
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
方式二:使用自动过滤器
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