String VBA修剪留下前导空白

String VBA修剪留下前导空白,string,excel,vba,String,Excel,Vba,我试图比较宏中的字符串,但输入的数据并不总是一致的。差异可以归结为前导空格的数量(即“测试”与“测试”与“测试”) 对于我的宏,示例中的三个字符串应该是等效的。但是,我不能使用替换,因为字符串中间的任何空间(例如“测试123”)都应该保留。我原以为这就是Trim应该做的(以及删除所有尾随空格)。但是当我在琴弦上使用Trim时,我看不出有什么不同,而且我肯定在琴弦的前面留下了空白 那么A)Trim在VBA中真正起什么作用?B) 是否有一个内置函数用于我正在尝试做的事情,或者我只需要编写一个函数 谢

我试图比较宏中的字符串,但输入的数据并不总是一致的。差异可以归结为前导空格的数量(即“测试”与“测试”与“测试”)

对于我的宏,示例中的三个字符串应该是等效的。但是,我不能使用替换,因为字符串中间的任何空间(例如“测试123”)都应该保留。我原以为这就是Trim应该做的(以及删除所有尾随空格)。但是当我在琴弦上使用Trim时,我看不出有什么不同,而且我肯定在琴弦的前面留下了空白

那么A)Trim在VBA中真正起什么作用?B) 是否有一个内置函数用于我正在尝试做的事情,或者我只需要编写一个函数


谢谢

为什么不尝试使用Instr函数呢?像这样的

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
函数comp2string(str1作为字符串,str2作为字符串)作为布尔值
如果InStr(str1,str2)0或InStr(str2,str1)0,则
Comp2Strings=True
其他的
Comp2Strings=False
如果结束
端函数
基本上,您正在检查string1是否包含string2或string2是否包含string1。这将始终有效,您不必修剪数据。

trim()将删除所有前导空格


您的数据可能包含不可见的字符,但也不是空格。

如果看不到您的代码,则很难知道,但您也可以将
应用程序.WorksheetFunction.Clean()
方法与删除不可打印字符的
Trim()
方法结合使用


VBA的修剪功能仅限于处理空间。它将删除字符串开头和结尾的空格

为了处理诸如换行符和制表符之类的事情,我总是导入MicrosoftVBScript正则表达式库,并用它来替换空白字符

在VBA窗口中,转到工具、参考、查找Microsoft VBScript正则表达式5.5。检查并点击OK

然后您可以创建一个相当简单的函数来修剪所有空白,而不仅仅是空白

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

因此,正如加里的学生所评价的那样,这个角色并不是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
函数TrueTrim(v作为字符串)作为字符串
像线一样变暗
暗如弦
坏的=“| 127 | 129 | 141 | 143 | 144 | 160 | | 173 | |”字符,不输出某些内容
"人眼可以根据视觉来看东西,http://www.gtwiki.org/mwiki/?title=VB_Chr_Values
out=v
只要第一个字符是空白,就把它切掉
如果v“那么
当AscW(左(出,1))小于33或仪表(1,坏,“| | |”和AscW(左(出,1))和“| |”0'左(出,1)=”或左(出,1)=Chr(9)或左(出,1)=Chr(160)时执行
out=右(out,Len(out)-1)
环
只要最后一个字符是空白,就把它切掉
当AscW(右(出,1))小于33或指令(1,坏,“| |”&AscW(右(出,1))和“| |”)0'右(出,1)=”或右(出,1)=Chr(9)或右(出,1)=Chr(160)时执行
out=左(out,Len(out)-1
环
如果“else out=”“且无需处理,则结束
'捕获结果以返回
TrueTrim=out
端函数

非可打印内容将网页分成不同的行。我分别用X、Y和Z替换它们

调试。打印修剪(中间(“X测试”,2))“第一位在VBA中计为2

调试。打印修剪(中间(“XY测试”,3))“第二位在VBA中计为3

调试。打印修剪(中间(“X Y Z测试”,2))“需要更多轮:)


程序员喜欢使用内置工具(inSTR、Mid、Left和其他工具)整齐地切碎大文本。使用几个子级的文本(即使用.textContent和.innerText)可能会导致一些不可打印的内容需要处理,但是DOM和正则表达式不适合初学者。精确寻址内部文本的子元素(子元素一个接一个!)可能有助于避免不可打印的字符

Trim
会删除前导空格和尾随空格。你确定那是一个空间吗?请尝试
打印Asc(Txt)
以查看ascii码是否为32,或者您的数据在字符串开头没有空格(字符代码32),或者您的代码实现不正确。VBA修剪功能在该功能的VBA帮助中有详细描述。它与同名的工作表函数有些不同。Comp2Strings=(InStr(str1,str2)0或InStr(str2,str1)0)这将在
str1=“test”
str1=“test”
的情况下失败。根据OP,只有一个字符串具有前导或尾随空格。因此,这会起作用这会告诉我是否有前导空格(或空格字符,取决于str2)m,但我需要清除这些空格,以便以后存储(很抱歉,在原始帖子中没有提到这一点,我没有考虑,因为我的问题是InStr返回0,而在我的大脑中,它应该返回一个大于0的值)事实证明是这样的。我使用代码(left({cell}m1))来获取字符(对于那些好奇的人来说是160)。考虑到我之前创建了一个函数来清除前导空格(任何小于32、160的代码值,以及其他一些代码值)。如果您要修剪数据,我将使用正则表达式解决方案,它更通用、更简单robust@Jeanno下面的正则表达式解决方案没有捕获所有字符,这个解决方案成功了。据我所知,这应该是可行的。我只是从来都不是正则表达式的粉丝,太容易把代码的密度搞砸了。这对OP的问题不起作用<代码>\s与vbscript中的NBSP(字符代码160)不匹配。不过,您可以使用类似于
[\s\xA0]
的正则表达式,并使用适当的l开头和结尾
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