繁体   English   中英

编辑放置在 Word Doc VBA 某处的形状(文本框)中的文本

[英]Edit a the text in a Shape(textbox) that is placed somewhere on a Word Doc VBA

我正在尝试为word文档创建一种将某些文本字段数据替换为其他数据的方法。 在我的情况下,文本字段显示为形状的一部分,并且文本字段本身没有名称,所以我想可能通过它们的形状 ID 来做到这一点。 因此,例如,我有一个 5 个文本框彼此相邻,并说我想编辑第 4 个文本框来表达一些东西,因为它是空白的,而不影响其他文本框。 我需要做什么?

虽然 Process: 因为所有文件都具有相同的格式,所以如果我能找出那个形状或文本框的 id,我可以直接引用那个 id 并以这种方式更改文本字段。 该字段中的文本都是随机的,所以我不能做一个特定的查找单词和替换,所以这就是为什么我试图通过 id 来做,甚至只是让它计算页面上的形状数量一个word文档。

提示:我打开了段落标记以更清楚地查看文本框。

word文档示例

到目前为止我编写的代码示例:

Sub TextBox()
'find a specific textbox and edit it

    Dim doc As word.Document, rng As word.Range
    Dim shp As Shape, iShp As word.InlineShape
    Set doc = ActiveDocument

    Dim textbCount As String
    Dim textbId As String
    'textbCount = ActiveDocument.Shapes.Count
    'textbId = oShape.ID
    Dim sr As ShapeRange
    Set sr = shp.TextFrame.TextRange.ShapeRange(5)
    
    For Each shp In sr
        If shp.ID = 0 Then
            'oShape.TextFrame.TextRange.InsertAfter shp.ID
            'shp.Delete
        Debug.Print shp.Type
        Debug.Print shp.ID
        End If
    Next shp
    
    If ActiveDocument.Shapes.Count > 0 Then
        For Each shp In ActiveDocument.Shapes
            If shp.AutoShapeType = msoShapeRectangle Then
                If shp.TextFrame.HasText = True Then
                    'shp.TextFrame.TextRange.GoToNext (wdGoToField)
                    'shp.Delete
                    'shp.Delete
                    shp.TextFrame.TextRange.InsertAfter textbCount
                    Exit For
                End If
            End If
        Next shp
    End If
End Sub

这是您可以使用的代码,我能够找出答案。 代码所做的是检查您尝试阅读的 word 文档是否已打开,然后它首先检查文档上是否有任何形状,即 c > 0,因为文本框被归类为形状。 然后它执行一个 For Each 循环,遍历整个文档上的所有形状,每个形状都有自己的唯一标识符。

我已经对此进行了测试,如果模板具有相同格式的文本框,它们通常会共享相同的标识符,所以如果你说每 20 个文本框有 2 个 word 文档,并且它是另一个文本框的副本,只是在框中有不同的文本几乎就像他们拿了这个空白文档然后将其用作基本模板一样,如果单独打开,两个文档之间的 ID 很可能是相同的,如果将它们合并为一个文档,则 ID 会发生变化,因此您不会引用相同的数据。 要继续使用代码,它接下来会检查所有文本框是否有 #,这可以更改为任何内容,但对于我的情况,我想找出我将使用的 ID 框,因为单词 doc won'不告诉你,所以因为文件上没有其他地方有#,所以我用它们来找到盒子的位置。 知道 ID 后,您可以直接引用这些框,而不是使用 #,但您需要首先知道哪些有它们。

接下来,代码将打印到“立即窗口”,就像调试 window 一样,您可以在视图选项卡中打开,如果您的 windows 可以通过 ctrl + G 打开,它将打印的是具有# 然后打印该框中的任何文本,其中应包括 # 以及该框中的任何文本。

现在,如果您想在文本框中添加文本,我没有将它包含在我的示例中,甚至没有替换文本。 只需为 if shp.ID = 16 做一个 if 语句,然后在 If Then 语句中说 shp.TextFrame.TextRange.Text = "" 或者如果你有一个要传入的字符串,请将 "" 替换为任何字符串在双引号中,您可以将该文本框留空以使该文本框成为您的参考空白,也可以将文本放入其中以使其说出某些内容。

如果你像我一样做一个项目,它需要检查很多这些文本框以将字符串引用到另一个文本框,所以基本上一个文本框决定另一个文本框。 在 oShp 中大量使用 For Each shp 或等效于它并检查每个 ID 并将其存储在字符串变量中,然后执行单独的 For Each 以引用这些字符串变量以创建新的 if 语句或声明,因为您需要go 至少一次通过所有文本框以获取其中可能包含的任何数据,因为它一次通过 For Each 序列。

 Dim shp As Shape Dim oShp As Object Dim doc As Document Dim c As Integer Dim objWord As Object Dim objDoc As Document 'Set doc = ActiveDocument Set objWord = GetObject(, "Word.Application") objWord.Visible = True Set objDoc = objWord.Documents.Open("C:\Users\word.docx") 'Set this to wherever the word file is located along with the name of the word file so "C:\Users\worddoc.docx" is an example you could do 'Set objDoc = objWord.ActiveDocument Set doc = objWord.ActiveDocument Set oShp = doc.Shapes c = ActiveDocument.Shapes.Count 'Set text1 = shp.TextFrame.TextRange If c > 0 Then For Each shp In oShp If InStr(shp.TextFrame.TextRange.Text, "#") Then Debug.Print shp.ID Debug.Print shp.TextFrame.TextRange.Text End If Next shp Debug.Print c End If

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM