我正在尝试清理和格式化从会计系统获得的一组数据,并且已经能够创建VBA代码以在特定列范围内使用TRIM或CLEAN函数。
问题是我需要在字符串中保留空格(可以是2个,3个或更多个空格),但仍要删除前导/后缀空格,并且上述功能将内部空格减小为1。这不起作用对我而言,因为数据被用作与流程其他步骤中的其他信息进行匹配的关键。切记,空格键可能导致空格的前导/尾随空格,任何其他显示为空格甚至包含换行符的字符,因此,我再次希望将所有这些空格除去但内部空格。字符串可以由字母数字字符组成。
我在Private Sub中使用此代码(通过单击工作表中的按钮来执行代码)。
Dim rng1a As Range
Dim Area1a As Range
Set rng1a = Range("F2:F35001")
For Each Area1a In rng1a.Areas
Area1a.NumberFormat = "@"
Area1a.Value = Evaluate("IF(ROW(" & Area1a.Address & "),CLEAN(TRIM(" & Area1a.Address & ")))")
Next Area1a
示例(在F2:F35001范围内):
Original: Sample Text for Review. *(there are blanks after the string)
Result:Sample Text for Review.
Desired:Sample Text for Review.
我进行了几周的研究,一直未能找到一种解决方案,可以使内部空白保持“原样”,并在论坛中避免尽可能多的重复问题。预先感谢您的帮助。
答案 0 :(得分:1)
您是否尝试过使用LTRIM函数删除前导空格,然后使用RTRIM删除尾随空格,从而使内部空格完好无损?
从您的描述中,您不会期望TAB字符或回车符出现在字符串的中间,因此您可以对其进行替换:
strSource = Replace(strSource, vbTab, "")
strSource = Replace(strSource, vbCrLf, " ")
答案 1 :(得分:1)
您可以使用正则表达式执行此操作:
Option Explicit
Function trimWhiteSpace(s As String) As String
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
With RE
.Global = True
.MultiLine = True
.Pattern = "^\s*(\S.*\S)\s*"
trimWhiteSpace = .Replace(s, "$1")
End With
End Function
正则表达式的解释
^\s*(\S.*\S)\s*
选项:区分大小写; ^ $匹配行间的中断
^
\s*
(\S.*\S)
\S
.*
\S
\s*
$ 1
由RegexBuddy创建
另一方面,如果您要避免使用正则表达式,并且您唯一的前导/结尾“空白”字符是space
,tab
和linefeed
,则 AND ,如果唯一的“内部”空白字符是space
,则可以使用:
Function trimWhiteSpace(s As String) As String
trimWhiteSpace = Trim(Replace(Replace([a1], vbLf, ""), vbTab, ""))
End Function
请注意,VBA Trim函数(与工作表函数不同)仅删除前导和尾随空格,而内部空间保持不变。但是,如果需要保留的字符串中有tab
,则此方法将无效。
以上任何一种都可以合并到您的宏中。