关于利用Word的Word对象实现公文标题换行功能时遇到的问题 本人最近在设计一个从Excel中的数据在Word中生成公文的程序时,在处理生成的公文标题时遇到了问题。 因为根据《党政机关公文格式》的国家标准,公文标题在回行时,要做到词意完整。但我在Excel中的标题不会事先根据在Word中的排版预先做好换行处理,因此标题在输入Word中时首先是一整段文字,当标题较长出现自动换行时,就有可能出现将一个词语拆分到了不同行的情况。因此我写了下面这段代码,来实现自动在行末的完整词语前进行换行。由于没有在Word中找到与行相关的对象,因此我的思路是使用Selection对象的Endkey方法,模拟End键来获取每一行行末的位置。在单位电脑上的WPS中运行时已经能够满足要求。 但是,当我用家里电脑上的MicrosoftOffice2019运行时,却遇到了一个问题,那就是Word会将书名号(《》)、引号(“”)、括号(())等符号对和其中的内容整体视为一个Word对象,而在WPS中则会将这些符号中的每一个词单独视作一个Word对象。这将会导致,一旦标题中出现上述这些符号时,就很容易在这些符号前进行换行。 因此在这里求助各位大佬2个问题: 一、是否可以改变Word识别词组对象的方式。 二、除了利用Endkey方法外,是否有其他方式来操作Word中的行。 下面是我写的代码: - Sub 公文标题提行(ByVal doc As Word.Document, ByVal titlpnum As Integer) '此过程有两个参数,第一个是文本所在的word.document对象,第二个是利用换行符提行前的标题所在的段数
- Dim wd As Word.Range, s$, tr As Word.Range, e0%
- With doc
- With .Paragraphs(titlpnum).Range '对标题所在range对象进行处理
- .Parent.Range(.Start, .Start).Select '将光标移动至标题所在range对象开头
- Do Until .Application.Selection.Start = .End - 1 '循环直到光标移动至标题所在range对象末尾,因为默认会有一个换行符,所以等号右边是End-1
- Debug.Print .Text
- .Application.Selection.EndKey wdLine '将光标移动至行尾
- e0 = .Application.Selection.Start '获取光标在行尾时的位置
- For Each wd In .Words '对range对象中每一个word对象进行循环
- If .Application.Selection.Start > wd.Start And .Application.Selection.Start < wd.End Then '判断处于行尾的光标是否位于一个word对象中间
- Debug.Print .Text
- wd.InsertBefore Chr(10) '如果光标处于一个word对象中间,则在该word对象前插入换行符进行提行
- Debug.Print .Text
- Exit For
- End If
- Next wd
- If e0 = .Application.Selection.Start And .Application.Selection.Start <> .End - 1 Then .Application.Selection.Start = e0 + 1 '利用换行后光标位置会+1判断在完成word对象循环后是否进行了提行操作,如果没有则将光标后移1个字符移动至下一行开始下一次判断
- Loop
- End With
- End With
- End Sub
复制代码
|