[英]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.