用空白替换包含零的单元格

时间:2015-11-20 18:48:08

标签: excel vba excel-vba

我有非常大量的数据A4:EW8000 +,我想用空白单元格替换包含零的单元格。格式化单元格不是一种选择,因为我需要保留当前格式。我正在寻找用空白单元替换零的最快方法。

我可以通过循环执行此操作,但速度非常慢。代码如下:

Sub clearzero() 
Dim rng As Range 
For Each rng In Range("A1:EW10000")
    If rng.Value = 0 Then 
        rng.Value = "" 
    End If 
Next 
End Sub

有没有简单的方法可以在没有循环的情况下完成此操作?

我尝试了以下代码,但它似乎无法正常工作。它挂起Excel一段时间(没有响应)然后它循环遍历范围并使每个单元格空白。

Sub RemoveZero()
  Dim LastRow As Long
  Const StartRow As Long = 2
  LastRow = Cells.Find(What:="0", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlValues).Row
  With Range("B:EW")
     .Value = Range("B:EW").Value
     .Replace "0", "0", xlWhole, , False
     On Error Resume Next
     .SpecialCells(xlConstants).Value = ""
     .SpecialCells(xlFormulas).Value = 0
  End With
End Sub

2 个答案:

答案 0 :(得分:4)

这是自动替换所需的所有VBA:

[a4:ew10000].Replace 0, "", 1

<强>更新

虽然上述内容简明扼要,但以下可能是最快的方法。我的电脑在整个范围内只需不到四分之一秒:

Sub RemoveZero()

    Dim i&, j&, v, r As Range

    Set r = [a4:ew10000]
    v = r.Value2
    For i = 1 To UBound(v, 1)
        For j = 1 To UBound(v, 2)
            If Len(v(i, j)) Then
                If v(i, j) = 0 Then r(i, j) = vbNullString
            End If
        Next
    Next

End Sub

答案 1 :(得分:3)

我发现有时在这样的批量替换操作中循环遍历列实际上更为便利。

dim c as long
with worksheets("Sheet1")
    with .cells(1, 1).currentregion
        for c = 1 to .columns.count
            with .columns(c)
                .replace what:=0, replacement:=vbNullString, lookat:=xlWhole
            end with
        next c
    end with
end with

将整个范围拆分为几个较小的操作可以提高整体性能。我自己的经验是在更大的数据块上(例如142列×~250K行)并从SQL提要中替换NULL而不是零,但这应该会有所帮助。