Trim()不适用于表

时间:2016-01-19 14:22:07

标签: vba replace ms-word

我不得不Writing R data frames returned from SparkR:::map(修剪PDF转换器已添加到每个单元格的MS Word文档中的尾随空格),我很快发现使用标准的Word界面无法做到这一点,所以写了一个小的VBA脚本:

Sub TrimCellSpaces()
    Dim itable As Table
    Dim C As Cell
    For Each itable In ThisDocument.Tables
        For Each C In itable.Range.Cells
            C.Range.Text = Trim(C.Range.Text)
        Next
    Next
End Sub

我很惊讶这不仅没有删除尾随空格,甚至还在每个单元格的末尾添加了段落标记。所以我尝试了一种正则表达式方法:

Sub TrimCellSpaces()
    Dim myRE As New RegExp
    Dim itable As Table
    Dim C As Cell
    myRE.Pattern = "\s+$"
    For Each itable In ThisDocument.Tables
        For Each C In itable.Range.Cells
            With myRE
                C.Range.Text = .Replace(C.Range.Text, "")
            End With
        Next
    Next
End Sub

结果相同。我添加了一个断点,将C.Range.Text(替换前)的值复制到十六进制编辑器中,发现它以十六进制序列结束0D 0D 0707是ASCII Bell字符(!) )。

我将正则表达式更改为\s+(?!.*\w),脚本运行完美无缺。在替换操作之后,C.Range.Text的值仅以0D 07结束(减少一0D个。

我还尝试使用新创建的表,而不是Word的PDF导入程序生成的表 - 结果相同。

这里发生了什么? Word是否使用0D 0D 07作为“单元格结束”标记?或者是0D 07?为什么\s+只删除一个0D

1 个答案:

答案 0 :(得分:2)

Word中的所有单元格以ANSI 13 + ANSI 07结尾 - 它是"单元格的结尾"标记(一点点"阳光"如果您在UI中打开了非打印字符的显示)。 Word使用它来构造表并存储与单元相关的信息。

无法从表格单元格中删除此字符组合 - Word需要它。如果你可以删除它,表将破坏。所以Word只是阻止你删除它们。

如果您需要将表格单元格内容作为文本字符串,则基本上需要检查最后两个字符的字符代码并在使用字符串之前将其删除。您需要检查这两个字符,因为Microsoft更改了从几个版本的单元格返回文本的方式。有时它只返回一个字符,有时两者都有,这取决于你如何获取信息以及涉及哪个版本的Word。