Vba 修改表格单元格的.Range.Text将删除任何附加注释

Vba 修改表格单元格的.Range.Text将删除任何附加注释,vba,replace,ms-word,Vba,Replace,Ms Word,我已经编写了一个小的VBA程序来删除MS Word表格单元格中的尾随空格。它遍历每个表的所有单元格,并使用命令修改它们的.Range.Text对象 C.Range.Text = myRE.Replace(C.Range.Text, "") 其中myRE是一个VBScript RegExp 5.5对象,myRE.Pattern=\s+*\W整个程序都可以找到 除了一个问题外,该程序运行良好。它还将删除单元格中的所有注释。之前: 多余的空间消失后,评论也消失了: 查看本地对象树,我可以看到更改C.

我已经编写了一个小的VBA程序来删除MS Word表格单元格中的尾随空格。它遍历每个表的所有单元格,并使用命令修改它们的.Range.Text对象

C.Range.Text = myRE.Replace(C.Range.Text, "")
其中myRE是一个VBScript RegExp 5.5对象,myRE.Pattern=\s+*\W整个程序都可以找到

除了一个问题外,该程序运行良好。它还将删除单元格中的所有注释。之前:

多余的空间消失后,评论也消失了:

查看本地对象树,我可以看到更改C.Range.Text也会更改C.Range.Comments-但为什么


如何防止出现这种情况?

当使用Range.Text时,就像使用正则表达式或任何处理字符串的函数时一样,当纯字符串写回单元格时,所有格式和其他非文本字符都会丢失

例如,如果单元格文本中的单个字符的格式为粗体,粗体格式将丢失。或者,如果单元格中有更改跟踪,则会丢失。任何脚注或尾注都将丢失。评论也属于这一类

您需要一种不同的方法,一种尊重Word如何在文档中存储非文本信息的方法。这里有一个建议,即循环表中的单元格,在单元格末尾提取范围,然后只要找到预定义的空白字符,就将范围的起点向后移动。当不再满足此标准时,该范围将被删除。注意我不知道为什么我需要使用范围。删除两次-第一次没有效果

你需要弄清楚什么是空白。我使用了空格、回车符和制表符。您当然可以向sWhitespace字符串添加其他字符串

Sub RemoveWhiteSpaceEndOfCell()
  Dim cel As word.Cell
  Dim sWhitespace As String
  Dim rng As word.Range
  Dim lWhiteSpaceChars As Long

  'define what constitutes Whitespace. 
  'Here: a space, a carriage return and a tab
  sWhitespace = Chr(32) & Chr(13) & Chr(9)
  For Each cel In ActiveDocument.Tables(1).Range.Cells
    Set rng = cel.Range
    'set the Range to the end of the cell
    rng.Collapse wdCollapseEnd
    rng.MoveEnd wdCharacter, -1
    'move the starting point back as long as whitespace is found
    lWhiteSpaceChars = rng.MoveStartWhile(sWhitespace, wdBackward)
    'Only if whitespace was found, delete the range
    If lWhiteSpaceChars <> 0 Then
        'rng.Select 'For debugging purposes
        rng.Delete
        rng.Delete
    End If
  Next
End Sub

您可以手动将注释应用于空单元格吗?可以。不过,我的单元格不是空的。Word将格式和额外信息与文本内联存储,即使文本不容易看到,所以在删除/替换文本时需要小心。向空单元格中添加评论,然后选择整个单元格,然后按delete键,将删除该单元格中的评论。投票人对我如何提出更好的问题有何评论?