Excel Vba to Word:如何将页码写入文本框?

Excel Vba to Word:如何将页码写入文本框?,excel,ms-word,textfield,vba,Excel,Ms Word,Textfield,Vba,我正在编写一个Excel VBA宏,该宏将文本复制到Word for Windows文件和 稍后添加格式 它使用包含徽标的.dotx模板。左下角是一个带有序列号的文本框。序列号的文本已写入 垂直(从底部向上) 通过反复试验,我成功地在文本框中写入了一个序列号 使用: 所以我找到了正确的写作对象。 现在我在每一页上都有相同的序列号 我的目标是在页面上获得越来越多的序列号: 序列号的形状为: 第1页:abc1x 第2页:abc2x 第3页:abc3x 第10页:abc10x 它是由两个字符串包

我正在编写一个Excel VBA宏,该宏将文本复制到Word for Windows文件和 稍后添加格式

它使用包含徽标的.dotx模板。左下角是一个带有序列号的文本框。序列号的文本已写入 垂直(从底部向上)

通过反复试验,我成功地在文本框中写入了一个序列号 使用:

所以我找到了正确的写作对象。 现在我在每一页上都有相同的序列号

我的目标是在页面上获得越来越多的序列号: 序列号的形状为:

  • 第1页:abc1x
  • 第2页:abc2x
  • 第3页:abc3x
  • 第10页:abc10x
它是由两个字符串包围的页码

在另一个项目中,我做了类似的事情。 我用以下脚本写了“第1页,共10页”等:

    Dim uRange As Object
    Dim uneven As Object

    Set uneven = wdoc.Sections(1).Footers(wdHeaderFooterPrimary)
    Set uRange = wdoc.Sections(1).Footers(wdHeaderFooterPrimary).Range
    uRange.Delete

    uneven.Range.InsertAfter "Page "
    uRange.SetRange Start:=uneven.Range.End + 1, End:=uneven.Range.End + 1
    wdoc.Sections(1).Footers(wdHeaderFooterPrimary).Range.Fields.Add 
Range:=uRange, Type:=wdFieldEmpty, text:= _
    "PAGE  \* Arabic ", PreserveFormatting:=True

    uRange.SetRange Start:=uneven.Range.End + 1, End:=uneven.Range.End + 1
    uneven.Range.InsertAfter " of "
    uRange.SetRange Start:=uneven.Range.End + 1, End:=uneven.Range.End + 1

    wdoc.Sections(1).Footers(wdHeaderFooterPrimary).Range.Fields.Add 
Range:=uRange, Type:=wdFieldEmpty, text:= _
     "NUMPAGES  \* Arabic ", PreserveFormatting:=True
如何在文本框中的页面字段周围插入文本

(旁注:range和rangetext对象之间有什么区别?)

备注: 我将不得不应用解决办法,以均匀和不均匀的网页分开。 这不构成问题。 使事情变得更加困难: 我必须保留文本字段,因为它来自
企业标识人员。

有很多方法可以做到这一点。在插入下一个内容(文本或字段代码)之前,所有操作都涉及到“折叠”目标
范围

不久前,我编写了一组通用函数,这样我就可以轻松地插入文本和字段代码的任意组合,而无需对每个组合进行“调整”

首先定义
范围
对象。如果您想保留任何内容,请将其折叠。程序
InsertNewText
InsertNewField
分别获取要插入字段的目标
范围
和要插入的文本。
范围的折叠在这些过程中完成,并传递回调用过程以进行下一步

Sub InsertTextAndFields()
    Dim rngContent As Word.Range

    Set rngContent = wdoc.Sections(1).Headers( _
        wdHeaderFooterEvenPages).Shapes(2).TextFrame.TextRange
    rngContent.Collapse wdCollapseEnd

    Set rngContent = InsertNewText(rngContent, "abc")
    Set rngContent = InsertAField(rngContent, "Page")
    Set rngContent = InsertNewText(rngContent, "x")

End Sub

Function InsertNewText(rng As word.Range, newText As String) As word.Range
    rng.Text = newText
    rng.Collapse wdCollapseEnd
    Set InsertNewText = rng
End Function

Function InsertAField(rng As word.Range, _
                      fieldText As String) As word.Range

    Dim fld As word.Field
    Dim rngField As word.Range

    Set fld = rng.Document.Fields.Add(Range:=rng, _
              Text:=fieldText, PreserveFormatting:=False)

    Set rngField = fld.result
    rngField.Collapse wdCollapseEnd
    rngField.MoveStart wdCharacter, 1
    Set InsertAField = rngField
End Function

我不知道你所说的
rangetext
object是什么意思。有
范围。Text
是特定
范围
中的实际字符串内容
Text
也是Word的
Range
对象的默认属性,因此如果您将其保留在VBA中并指定(或尝试读取)字符串,VBA将假定您指的是
Text
属性并使用该属性。但是最好是具体的……如果您指的是
TextFrame.TextRange
,那么这只是
形状
对象中范围属性的名称。这在所有Office应用程序中共享。我不知道是因为对象模型这一部分的开发人员更喜欢它,它的命名是否有所不同,还是因为它与
ShapeRange
和Word和Excel的
Range
对象有区别……很好,它工作得很好,而且解决方案打包得很整齐!我是梅斯特哈夫特。(真正大师的作品)我还需要一个调整:计数是1,2,3…,8,9,a,B,C。。。。而不是第1页上的1、2、3、…、8、9、10、11:第2页上的abc1x:第3页上的abc2x:abc3x。。。第10页:abcAx我可以将您的解决方案与tex字段中的逻辑结合起来吗?它应该看起来像{如果{PAGE}<10”“{PAGE*阿拉伯语}”“{PAGE*字母}”“}我将公式放入文本字段中,(如果我在单词dokument中查看它,则公式位于文本字段的属性中)但是我不显示数字。@Ratilius你不应该以一种使答案无效的方式编辑一个问题,而这显然不是在最初的问题陈述中。创建嵌套字段是另一回事。请看我在本次讨论中的答案,特别是函数GeneratesTedField,谢谢您指出这一点。问一个新问题会是首选的方式吗?稍后我会在我的电脑上更改回这个问题。我手机上的界面非常笨拙。@Ratilius没关系,我已经为你回滚了它。如果链接中的信息不能为您解决问题,您最好提出一个新问题。FWIW所有解决这个问题的信息都在那里——这只是一个将它们组合在一起的问题。
Sub InsertTextAndFields()
    Dim rngContent As Word.Range

    Set rngContent = wdoc.Sections(1).Headers( _
        wdHeaderFooterEvenPages).Shapes(2).TextFrame.TextRange
    rngContent.Collapse wdCollapseEnd

    Set rngContent = InsertNewText(rngContent, "abc")
    Set rngContent = InsertAField(rngContent, "Page")
    Set rngContent = InsertNewText(rngContent, "x")

End Sub

Function InsertNewText(rng As word.Range, newText As String) As word.Range
    rng.Text = newText
    rng.Collapse wdCollapseEnd
    Set InsertNewText = rng
End Function

Function InsertAField(rng As word.Range, _
                      fieldText As String) As word.Range

    Dim fld As word.Field
    Dim rngField As word.Range

    Set fld = rng.Document.Fields.Add(Range:=rng, _
              Text:=fieldText, PreserveFormatting:=False)

    Set rngField = fld.result
    rngField.Collapse wdCollapseEnd
    rngField.MoveStart wdCharacter, 1
    Set InsertAField = rngField
End Function