2014-01-29 5 views
1

Я пытаюсь очистить очень большой файл #NA значений и 0 (нулевые значения), и я использую следующий код. Цель состоит в том, чтобы уменьшить размер файла, удалив эти значения, которые явно не нужны, и для улучшения производительности файла. Это 50 MB файл и стал громоздкимОчистка Excel значений #NA

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 

Я получаю ошибку типа несовпадение 13 в некоторых клетках и на линии в Жирный. Не знаю, почему. Любые подсказки? Пожалуйста помоги. Заранее спасибо.

ответ

2

Как указал Taosique, проблема возникает из ячеек с оценкой ошибки и проверяется на 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 
+0

Спасибо. Это очень полезно. Я использовал код Таосика. – Peekay

+0

Отлично! Если код (Taosique или мой) работает очень медленно, сообщите нам об этом. Можно дополнительно оптимизировать скорость выполнения (помимо параметров «Application ...») с использованием массивов. –

+0

Спасибо, Питер. Возможно, это помогло бы, если бы вы могли сказать, как это можно сделать быстрее с использованием массивов. В другом файле у меня более 2 миллиардов ячеек на листе, которые содержат некоторые данные (значение счета над используемым диапазоном, но половина из них может быть 0, N/As или «s»). Я могу использовать эту технику на этом листе. – Peekay

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 
+0

Спасибо большое. Похоже, что ошибка, которую вы указали, ожидала, но это случилось даже раньше. Там была пустая камера, и она застряла там. В моей книге много сумасшедших вещей, и я подозреваю, что есть некоторая коррупция. Я вернусь с дальнейшими комментариями. У меня есть другой файл намного больше (100 МБ), и мне нужно сделать то же самое. Не уверен, что Excel может обрабатывать такие большие файлы. Еще раз спасибо. – Peekay

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 

Примечание значение xlErrNA, который изолирует тип ошибки # Н/Д ,

+0

Большое спасибо. Конечно, мне нужна дополнительная помощь. – Peekay

Смежные вопросы