簡體   English   中英

使用 VBA for Excel 從大量單元格中刪除“額外”空格(超過 1 個)的更快方法

[英]Faster way to remove 'extra' spaces (more than 1) from a large range of cells using VBA for Excel

如何從包含文本字符串的大范圍單元格中更快地刪除多余的空格?

假設有 5000 多個單元格。

我嘗試過的一些方法包括:

For Each c In range
    c.Value = Trim(c.Value)
Next c

For Each c In range
    c = WorksheetFunction.Trim(c)
Next c

For Each c In range
    c.Value = Replace(c.Value, "     ", " ")
Next c

任何提高速度的想法?

聚會遲到了,但是...

不需要遍歷單元格/值,也不需要遞歸函數來搜索和替換范圍內的多個空格。

Application.Trim實際上會處理單詞之間的多個空格(並將修剪前導/尾隨空格),在單詞之間保留單個空格完好無損。

關於它的偉大之處在於,您可以在一次掃描中為函數提供全范圍(或數組)以執行此操作!


在此處輸入圖片說明

Sub Test()

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

End Sub

在此處輸入圖片說明


需要考慮的一件事是,通過這種方式,您將使用其值覆蓋位於目標范圍內的任何公式。 但是根據您的問題,您使用的是包含文本值的Range對象。 只是不需要迭代=)

循環正在殺死你。 這將一次性刪除整列中的空格:

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

調整范圍以適應。 如果要刪除空格,則:

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

編輯#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

您可以重新運行,直到看到完成

編輯#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

當涉及大范圍時,我通常使用Evaluate than 循環。 這個功能有很多用途,但我不會在這里進一步討論。

'change the row count as deemed necessary..
Set rng = Range("C1:C" & Row.Count)

   rng.value = Evaluate("IF(" & rng.Address & "<>"""", _
               TRIM(" & rng.Address & "),"""")")

Set rng = Nothing

它可能取決於很多事情,但在我的情況下,最快的是一次在數組中獲取所有值:

' Dim range As Range, r As Long, c As Long, a
a = range
For r = 1 To UBound(a)
    For c = 1 To UBound(a, 2)
        a(r, c) = Trim(a(r, c))
    Next
Next
range = a

旁邊有備用柱子嗎?

Range("B1:B" & Range("A" & Rows.Count).End(xlUp).Row).Formula = "=Trim(A1)"
Columns(2).copy
Range("B1").PasteSpecial xlPasteValues
Columns(1).delete

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM