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