String Outlook VBA--修剪不可打印的字符

String Outlook VBA--修剪不可打印的字符,string,vba,outlook,trim,non-printable,String,Vba,Outlook,Trim,Non Printable,我真的很难在Outlook VBA中找到我所需要的东西。我在网上试过100种不同的东西,包括这里 我使用以下方法: CString = LTrim$(RTrim$(Mid(itm.Body, InStr(1, itm.Body, CCMark) + Len(CCMark), _ InStr(InStr(1, itm.Body, CCMark) + Len(CCMark), itm.Body, CCMark) - (InStr(1, itm.Body, CCMark) +

我真的很难在Outlook VBA中找到我所需要的东西。我在网上试过100种不同的东西,包括这里

我使用以下方法:

CString = LTrim$(RTrim$(Mid(itm.Body, InStr(1, itm.Body, CCMark) + Len(CCMark), _
            InStr(InStr(1, itm.Body, CCMark) + Len(CCMark), itm.Body, CCMark) - (InStr(1, itm.Body, CCMark) + Len(CCMark)))))
CCMark=“C/”

但是由于电子邮件的正文包含:C/test C/,所以变量(CString)转到“test”

我尝试使用第二个变量Trim、RTrim、LTrim、Trim$、LTrim$和RTrim$。此外,我还尝试用双空格和单空格替换。我尝试过互联网上流行的TrimAll函数,它试图找到不同的Chr()值以及vbTab等。这些函数似乎都不能替代任何东西

字符串保持不变

这是固定长度还是可变长度(“大小”)字符串的问题?我还没有找到一种将固定长度转换为可变长度的方法。传递函数不起作用

关于如何得出“测试”结果,有什么建议吗


非常感谢您的帮助。

简单地说:VBA中的字符串处理函数实际上可以工作。如果您的字符串在输入字符串的开头或结尾有空格字符(特别是代码点为32的字符),则将删除它们

“固定长度”字符串仅在您使用特殊语法明确声明它们时才存在:

Dim eightCharString As String(8)  ' This is a fixed-length string
VBA字符串函数均不返回固定长度的字符串。因此,除非您使用上述符号将
CString
声明为固定长度字符串,否则这不是问题所在

从逻辑上讲,唯一的可能性是您认为是空格的字符实际上不是空格。电子邮件中最有可能的候选字符是HTML不间断空格字符,或代码点0xA0(十进制160)。到目前为止,替换源字符串中多个字符的最简单方法是使用正则表达式

下面是典型的基于regex的trim函数。下面构造的两种模式是

Start pattern: "^[\u0009\u0020\u00A0]*"
End pattern:   "[\u0009\u0020\u00A0]*$"
如果要查找并删除其他空格字符,只需将其代码点值添加到下面函数的列表中即可。例如,为了将行提要和回车返回为要修剪的空格,将代码点10和13添加到列表中。 代码:


这篇文章删除了额外的“空格”(尽管我认为VBA不认为它们是空格)。假设“test”两侧有任意数量的字符(显示为空格)。要找出哪个字符真正位于输出字符串的开头,请尝试打印代码点:
Debug.Print(AscW(左(CString,1)))
。它印的是什么?很有帮助,谢谢你,约书亚。
Private m_RxTrimStart As RegExp
Private m_RxTrimEnd   As RegExp 

Public Function RxTrim(ByRef Source As String) As String 

    ' Only create and compile the RegExp objects once
    If m_RxTrimStart Is Nothing Then

        ' A verbose way of constructing the regex object so you
        ' can see exactly what's going on  
        Dim spaceCodePoints As Variant, vCodePoint
        Dim strSpaceClass As String, strHexPoint As String

        ' Add additional code points here if desired
        spaceCodePoints = Array(9, 32, 160)
        strSpaceClass = "["
        For Each vCodePoint In spaceCodePoints
            ' Assemble a four-character hex code point 
            strHexPoint   = Hex$(CLng(vCodePoint))
            strHexPoint   = String("0", 4 - Len(strHexPoint)) & strHexPoint
            strSpaceClass = strSpaceClass & "\u" & strHexPoint
        Next 
        strSpaceClass = strSpaceClass & "]*" 

        ' Start anchor + spaces character class
        Set m_RxTrimStart = New RegExp
        m_RxTrimStart.Pattern = "^" & strSpaceClass

        ' Spaces character class + end anchor
        Set m_RxTrimEnd   = New RegExp
        m_RxTrimEnd.Pattern   = strSpaceClass & "$"
    End If

    RxTrim = m_RxTrimEnd.Replace(m_RxTrimStart.Replace(Source, ""), "")

End Function