清理#NA值的Excel

时间:2014-01-29 11:55:48

标签: excel-vba vba excel

我正在尝试清理#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。不知道为什么。有线索吗?请帮忙。提前谢谢。

3 个答案:

答案 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.