我继承了一个可用于预格式化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属性,但是考虑到替换文本的大小并不总是相同,因此我看不到这种方法。它必须相对于文档的其他部分。
很乐意接受任何帮助,如果需要更多详细信息,请发表评论。我试图分享没有机密信息的情况。
答案 0 :(得分:0)
此示例用于替换Word中对象组内部的文本框中的文本。我的测试文档有几个段落和一个分组的形状。形状组中有一个文本框。
该文本框的大小在组内可能会更改,但是在我的测试过程中该组的位置没有移动。
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