我有非常大量的数据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
答案 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而不是零,但这应该会有所帮助。