【问题标题】:Replace cells containing zero with blank将包含零的单元格替换为空白
【发布时间】:2016-02-23 08:51:11
【问题描述】:

我有大量数据 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

【问题讨论】:

标签: vba excel


【解决方案1】:

这是自动化替换所需的所有 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

【讨论】:

  • 我认为LookAt:=xlWhole在这样的操作中是非常必要的。
  • 取决于 OP 想要什么。我以不同的方式阅读它,但在第二次阅读时,他似乎只想在0 是整个值时替换它。更新了答案。
  • 是的。我也重新阅读了它,并且可以看到您的想法来自哪里,因为 OP 没有明确说明任何一种方式。
  • @ExcelHero 我试过[a4:ew10000].Replace 0, "", 1,它执行了请求的任务,但它挂断了 excel 约 30 秒,然后执行总共需要约 2 分钟的任务。
  • 我只想替换整个零值。我有一些 0.0001234 的值要保持。
【解决方案2】:

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

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 而不是零,但这应该会有所帮助。

【讨论】:

  • lookat:=xlWhole 是关键。我正在使用xlPart 并将 40s 变成 4s。=(
  • @Jeeped 我会使用Empty 而不是vbNullString 来获得真正的空单元格。 vbNullString 单元格对我来说最烦人的“功能”一直是在选择单元格的列/范围时将它们添加到计数中,因此我无法快速查看有多少元素真正具有任何价值。
  • vbNullString 与"" 不同,并创建一个真正的空白单元格。它不包含在 COUNT 或 COUNTA 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2022-11-13
  • 1970-01-01
相关资源
最近更新 更多