使用VBA删除开头和结尾的空格,但将空格保留在字符串中

时间:2019-06-22 20:11:56

标签: excel vba

我正在尝试清理和格式化从会计系统获得的一组数据,并且已经能够创建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.

我进行了几周的研究,一直未能找到一种解决方案,可以使内部空白保持“原样”,并在论坛中避免尽可能多的重复问题。预先感谢您的帮助。

2 个答案:

答案 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

正则表达式的解释

Trim开头和结尾的空白

^\s*(\S.*\S)\s*

选项:区分大小写; ^ $匹配行间的中断

$ 1

RegexBuddy创建

另一方面,如果您要避免使用正则表达式,并且您唯一的前导/结尾“空白”字符是spacetablinefeed,则 AND ,如果唯一的“内部”空白字符是space,则可以使用:

Function trimWhiteSpace(s As String) As String
    trimWhiteSpace = Trim(Replace(Replace([a1], vbLf, ""), vbTab, ""))
End Function

请注意,VBA Trim函数(与工作表函数不同)仅删除前导和尾随空格,而内部空间保持不变。但是,如果需要保留的字符串中有tab,则此方法将无效。

以上任何一种都可以合并到您的宏中。