【问题标题】:Outlook VBA -- Trimming non-printable charactersOutlook VBA -- 修剪不可打印的字符
【发布时间】:2013-09-29 18:09:46
【问题描述】:

我在试图将字符串绑定到 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 将它们视为空格)。想象一下“test”两边的任意数量的字符(显示为空格)。
  • 要找出真正位于输出字符串开头的字符,请尝试打印出代码点:Debug.Print(AscW(Left(CString,1)))。它打印什么?
  • 有帮助,谢谢你,约书亚。

标签: string vba outlook trim non-printable


【解决方案1】:

简单地说:VBA 中的字符串处理函数确实有效。如果您的字符串在输入字符串的开头或结尾有空格字符(特别是代码点为 32 的字符),那么它们将被删除。

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

Dim eightCharString As String(8)  ' This is a fixed-length string

没有一个 VBA 字符串函数返回固定长度的字符串。因此,除非您使用上述符号将CString 声明为固定长度字符串,否则这不是问题。

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

这是典型的基于正则表达式的修剪函数。下面构造的两种模式是

Start pattern: "^[\u0009\u0020\u00A0]*"
End pattern:   "[\u0009\u0020\u00A0]*$"

如果您想查找和删除额外的空格字符,只需将它们的代码点值添加到下面函数的列表中。例如,要将换行和回车视为要修剪的空格,请将代码点 10 和 13 添加到列表中。

代码:

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

【讨论】:

    猜你喜欢
    • 2011-07-12
    • 2020-11-04
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多