对于我的宏,示例中的三个字符串应该是等效的。但是我不能使用Replace,因为字符串中间的任何空格(如“test one two three”)都应该被保留。我原本以为这就是Trim应该做的事情(以及删除所有尾随空格)。但是当我在字符串上使用Trim时,我没有看到任何区别,并且我绝对会留下字符串前面的空格。
所以A)VBA中Trim真正的作用是什么?B)是否有内置函数可以实现我想要做的事情,还是我需要编写一个函数?
谢谢!
正如Gary's Student所说的,这个字符不是32,而实际上是160。作为一个简单的人来讲,空格就是空格。因此,我创建了以下函数,可以删除所有Unicode字符,这些字符对人眼无法显示(即非特殊字符、非字母数字字符)。该函数如下:
Function TrueTrim(v As String) As String
Dim out As String
Dim bad As String
bad = "||127||129||141||143||144||160||173||" 'Characters that don't output something
'the human eye can see based on http://www.gtwiki.org/mwiki/?title=VB_Chr_Values
out = v
'Chop off the first character so long as it's white space
If v <> "" Then
Do While AscW(Left(out, 1)) < 33 Or InStr(1, bad, "||" & AscW(Left(out, 1)) & "||") <> 0 'Left(out, 1) = " " Or Left(out, 1) = Chr(9) Or Left(out, 1) = Chr(160)
out = Right(out, Len(out) - 1)
Loop
'Chop off the last character so long as it's white space
Do While AscW(Right(out, 1)) < 33 Or InStr(1, bad, "||" & AscW(Right(out, 1)) & "||") <> 0 'Right(out, 1) = " " Or Right(out, 1) = Chr(9) Or Right(out, 1) = Chr(160)
out = Left(out, Len(out) - 1)
Loop
End If 'else out = "" and there's no processing to be done
'Capture result for return
TrueTrim = out
End Function
TRIM()函数将删除所有前导空格。
Sub demo()
Dim s As String
s = " test "
s2 = Trim(s)
msg = ""
For i = 1 To Len(s2)
msg = msg & i & vbTab & Mid(s2, i, 1) & vbCrLf
Next i
MsgBox msg
End Sub
可能存在看不见但不是空格的字符,导致数据出现问题。
没有看到你的代码很难知道,但你也可以使用Application.WorksheetFunction.Clean()
方法与删除非打印字符的Trim()
方法结合使用。
Function Comp2Strings(str1 As String, str2 As String) As Boolean
If InStr(str1, str2) <> 0 Or InStr(str2, str1) <> 0 Then
Comp2Strings = True
Else
Comp2Strings = False
End If
End Function
基本上,您正在检查string1是否包含string2或string2是否包含string1。这始终有效,并且您无需修剪数据。
str1 = " test"
和 str1 = "test "
。 - stenciVBA的Trim函数仅限于处理空格。它将删除字符串开头和结尾的空格。
为了处理换行符和制表符等内容,我一直导入Microsoft VBScript RegEx库并使用它来替换空白字符。
在您的VBA窗口中,转到工具,引用,然后找到Microsoft VBScript Regular Expressions 5.5。选中它并点击确定。
然后,您可以创建一个相当简单的函数来修剪所有空格,而不仅仅是空格。
Private Function TrimEx(stringToClean As String)
Dim re As New RegExp
' Matches any whitespace at start of string
re.Pattern = "^\s*"
stringToClean = re.Replace(stringToClean, "")
' Matches any whitespace at end of string
re.Pattern = "\s*$"
stringToClean = re.Replace(stringToClean, "")
TrimEx = stringToClean
End Function
\s
在vbscript中无法匹配NBSP(字符代码160)。但是,你可以使用类似[\s\xA0]
的正则表达式,并设置适当的开头和结尾锚点以及多行集合设置为true。 - Ron Rosenfeld非打印字符分隔网页的不同行。我分别用X、Y和Z替换了它们。
Debug.Print Trim(Mid("X test ", 2)) ' 在VBA中,第一个位置计为2
Debug.Print Trim(Mid("XY test ", 3)) ' 在VBA中,第二个位置计为3
Debug.Print Trim(Mid("X Y Z test ", 2)) ' 需要更多轮次 :)
程序员喜欢使用大文本,因为可以使用内置工具(如inSTR、Mid、Left等)进行整齐地切割。使用来自多个子元素的文本(即使用.textContent与.innerText)可能会导致需要处理多个非打印字符,但DOM和REGEX并不适合初学者。精确地处理内部文本的子元素(逐个子元素!)可能有助于避免非打印字符。