使用 VBA for Excel 从大量单元格中删除“额外”空格(超过 1 个)的更快方法

wal*_*man 4 excel vba replace spaces trim

如何从包含文本字符串的大范围单元格中更快地删除多余的空格?

假设有 5000 多个单元格。

我尝试过的一些方法包括:

For Each c In range
    c.Value = Trim(c.Value)
Next c
Run Code Online (Sandbox Code Playgroud)

For Each c In range
    c = WorksheetFunction.Trim(c)
Next c
Run Code Online (Sandbox Code Playgroud)

For Each c In range
    c.Value = Replace(c.Value, "     ", " ")
Next c
Run Code Online (Sandbox Code Playgroud)

任何提高速度的想法?

Jvd*_*vdV 14

聚会迟到了,但是...

不需要遍历单元格/值,也不需要递归函数来搜索和替换范围内的多个空格。

Application.Trim 实际上会处理单词之间的多个空格(并将修剪前导/尾随空格),在单词之间保留单个空格完好无损。

关于它的伟大之处在于,您可以在一次扫描中为函数提供全范围(或数组)以执行此操作!


在此处输入图片说明

Sub Test()

Dim rng As Range
Set rng = Sheets("Sheet1").Range("A1:A3")
rng.Value = Application.Trim(rng)

End Sub
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


需要考虑的一件事是,通过这种方式,您将使用其值覆盖位于目标范围内的任何公式。但是根据您的问题,您使用的是Range包含文本值的对象。只是不需要迭代=)

  • 从 VBA Trim() 函数来看,我绝不会猜测 Application.Trim 函数的工作方式会有所不同。谢谢 :) (2认同)
  • :+) 展示了一种最被忽视的方式@JvdV (2认同)
  • ++ 是的,同意@TM 我很少看到人们使用这个。:) (2认同)

Gar*_*ent 5

循环正在杀死你。这将一次性删除整列中的空格:

Sub SpaceKiller()
   Worksheets("Sheet1").Columns("A").Replace _
      What:=" ", _
      Replacement:="", _
      SearchOrder:=xlByColumns, _
      MatchCase:=True
End Sub
Run Code Online (Sandbox Code Playgroud)

调整范围以适应。如果你想删除空格,那么:

Sub SpaceKiller()
   Worksheets("Sheet1").Columns("A").Replace _
      What:="  ", _
      Replacement:=" ", _
      SearchOrder:=xlByColumns, _
      MatchCase:=True
End Sub
Run Code Online (Sandbox Code Playgroud)

编辑#1:

此版本将用单打替换双打,然后检查是否还有双打!

Sub SpaceKiller3()
   Worksheets("Sheet1").Columns("A").Replace _
      What:="  ", _
      Replacement:=" ", _
      SearchOrder:=xlByColumns, _
      MatchCase:=True

   Set r = Worksheets("Sheet1").Columns("A").Find(What:="  ")
   If r Is Nothing Then
      MsgBox "done"
   Else
      MsgBox "please run again"
   End If
End Sub
Run Code Online (Sandbox Code Playgroud)

您可以重新运行,直到看到完成为止

编辑#2:

根据Don Donoghue的评论,此版本将递归运行,直到所有双精度数都转换为单精度数:

Sub SpaceKiller3()
   Worksheets("Sheet1").Columns("A").Replace _
      What:="  ", _
      Replacement:=" ", _
      SearchOrder:=xlByColumns, _
      MatchCase:=True

   Set r = Worksheets("Sheet1").Columns("A").Find(What:="  ")
   If r Is Nothing Then
      MsgBox "done"
   Else
      Call SpaceKiller3
   End If
End Sub
Run Code Online (Sandbox Code Playgroud)