我正在尝试清理#NA值和0(零值)的非常大的文件,我使用以下代码。目标是通过删除显然不需要的这些值来减小文件大小并提高文件性能。它是一个50 MB的文件,并且变得笨拙
Sub cleanna()
Dim i As Integer
Dim j As Integer
i = 7
Do While i < 1200
j = 1
Do While j < 5100
**If (Cells(i, j) = 0 Or IsError(Cells(i, j))) Then**
Cells(i, j).Select
Selection.ClearContents
j = j + 1
Else
j = j + 1
End If
Loop
i = i + 1
Loop
ActiveWorkbook.Save
End Sub
我在某些单元格和Bold的行中遇到类型不匹配错误13。不知道为什么。有线索吗?请帮忙。提前谢谢。
答案 0 :(得分:2)
正如陶斯克所指出的那样,问题来自于评估错误并检查为0的单元格。因此,最好确保它没有错误,然后检查它是否为零。
以下是我用于此的代码:
Sub DeleteErrorsAndBlanks()
Dim rngToCheck As Range
Dim rng As Range
'Speed up the calculation
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set rngToCheck = ActiveSheet.UsedRange
'Delete all errors
rngToCheck.SpecialCells(xlCellTypeFormulas, xlErrors).ClearContents
rngToCheck.SpecialCells(xlCellTypeConstants, xlErrors).ClearContents
'Delete all zeros
For Each rng In rngToCheck
If rng.Value = 0 Then rng.ClearContents
Next
'Reset application
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
答案 1 :(得分:1)
这是因为#N/A
与Integer相比会抛出错误。而且您不必选择单元格来清除其内容。试试这个:
If IsError(Cells(i, j) Then
Cells(i, j).ClearContents
Else
If Cells(i, j) = 0 Then
Cells(i, j).ClearContents
End If
End If
答案 2 :(得分:0)
由于VBA评估or
的两边即使第一个true
,也很难做到这一点。此外,仅检查IsError
是不够的,因为还有其他错误,例如#NUM和#VALUE,您不应该在True
案例中捕获这些错误。
我要做的是构建两个强大的功能并将if
改为
If isZero(Cells(i, j)) Or isNA(Cells(i, j)) Then
功能是:
Private Function isZero(ByVal rng As Excel.Range) As Boolean
On Error GoTo error:
If rng.Value = 0 Then
isZero = True
Exit Function
End If
'follow through to error is intentional
error:
isZero = False
End Function
Private Function isNA(ByVal rng As Excel.Range) As Boolean
On Error GoTo error:
If VarType(rng.Value) = vbError Then
If rng.Value = CVErr(xlErrNA) Then
isNA = True
Exit Function
End If
End If
'follow through to error is intentional
error:
isNA = False
End Function
注意将{1}}值隔离,将错误类型隔离为#N / A.