取消组合单词形状会导致位置丢失

时间:2019-11-25 14:58:34

标签: vba ms-word

我继承了一个可用于预格式化Word文件的宏。其目的是浏览合同文本,并替换某些短语(查找并替换文本)。本质上,它是这样运行的:

FOR i = 1 To wdDoc.Shapes().Count
    Set shp = wdDoc.Shapes(i)
    If shp.Type = msoTextBox Then

        If InStr(shp.TextFrame.TextRange.Text, "Some legalese text") Then
           Call updateSectionThree(shp)
        End if 
    ' etc.
    END IF
NEXT i

以前,文档中的形状均为msoTextBox类型,但是现在对源文件进行更改意味着现在将这些形状中的大部分分组,类型为msoGroup。

为了快速解决此问题,我尝试取消所有对象的分组:

For Each s In wdDoc.Shapes
    If s.Type = msoGroup Then s.Ungroup
Next

我重复了几次以使所有内容嵌套。

问题是,当我这样做时,组中文本框的对象位置丢失了;例如,所有这些未分组的项目将出现在文档顶部,并以不同的边距偏移。

在运行宏之前,选择各种文本框和组时可以看到锚项目;是否可以在取消分组之前锁定位置。或者,获取这些值,然后将对象恢复到其原始相对位置?

或者:是否有可能在一组项目集中查找和替换文本(即,递归地沿着嵌套组向下移动,直到到达msoTextBox项,然后进行查找+替换)?如果是这样的话;该怎么做?

我认为这两个都是可靠的解决方案,但我不知道该怎么做。

我曾考虑过简单地调整每个文本框的.top属性,但是考虑到替换文本的大小并不总是相同,因此我看不到这种方法。它必须相对于文档的其他部分。

很乐意接受任何帮助,如果需要更多详细信息,请发表评论。我试图分享没有机密信息的情况。

1 个答案:

答案 0 :(得分:0)

此示例用于替换Word中对象组内部的文本框中的文本。我的测试文档有几个段落和一个分组的形状。形状组中有一个文本框。

enter image description here

该文本框的大小在组内可能会更改,但是在我的测试过程中该组的位置没有移动。

Option Explicit

Sub ReplaceTextBoxText()
    Dim wdDoc As Document
    Set wdDoc = ThisDocument

    Dim groupShp As Shape
    Set groupShp = wdDoc.Shapes(1)

    Dim textShp As Shape
    Set textShp = groupShp.GroupItems(1)

    Dim legalese As String
    legalese = textShp.TextFrame.TextRange.Text
    legalese = Replace(legalese, "This", "That")
    textShp.TextFrame.TextRange.Text = legalese

End Sub