VBScript/VBA批量替换Word指定的内容

在Microsoft TechNet上《你好,脚本专家!》看到的技巧,原文是《如何加粗整个 Microsoft Word 文档中的特定词?》,代码摘录如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Const wdReplaceAll  = 2
 
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
 
Set objDoc = objWord.Documents.Open("C:\Scripts\Test.doc")
Set objSelection = objWord.Selection
 
objSelection.Find.Text = "Fabrikam"
objSelection.Find.Forward = TRUE
objSelection.Find.MatchWholeWord = TRUE
 
objSelection.Find.Replacement.Font.Bold = True
 
objSelection.Find.Execute ,,,,,,,,,,wdReplaceAll

其替换C:\Scripts\Test.doc内指定的Fabrikam单词格式为粗体,那么如何才能实现替换为另外指定的单词呢?注意objSelection.Find.Replacement.Font.Bold = True这句,其实我们只需要将其改动为objSelection.Find.Replacement.Text = “你要替换的字符串”,就可以实现这个功能了,如何批量替换Word里指定的字句?那就需要用到我前面介绍的枚举文件的文章《利用Scripting.FileSystemObject组件来枚举文件》,当然,你也可以借助于我编写的批量文件扫描及进程处理工具,这个里面有个批量打印的示例插件,大家可以参考修改一下。

使用BuiltInDocumentProperties设置或查询Word内置属性

Word的内置属性(WdBuiltInProperty)往往给我们提供了很多有用的信息,我们可以通过BuiltInDocumentProperties的方式进行访问这些属性,参考下面的VBScript代码:

1
2
3
4
5
6
Dim wdApp
Set wdApp = WSH.CreateObject("Word.Application")
wdApp.ActiveDocument.BuiltInDocumentProperties(Index)
' Set doc = wdApp.Documents.Open(...)
' doc.BuiltInDocumentProperties(Index) 这样也可以
Set wdApp = Nothing

注意这里的Index索引属性,其取值不同就代表操作不同的内置属性,其相关取值用Visual Basic描述如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Public Enum wdAttributes
  wdPropertyTitle = &H00000001 ' 标题
  wdPropertySubject = &H0000002 ' 主题
  wdPropertyAuthor = &H0000003 ' 作者
  wdPropertyKeywords = &H0000004 ' 关键词
  wdPropertyComments = &H0000005 ' 注释
  wdPropertyTemplate = &H0000006 ' 模板
  wdPropertyLastAuthor = &H0000007 ' 最后一次作者
  wdPropertyRevision = &H0000008 ' 校对修改
  wdPropertyAppName = &H0000009 ' 应用程序名
  wdPropertyTimeLastPrinted = &H000000A ' 最后一次打印时间
  wdPropertyTimeCreated = &H000000B ' 创建时间
  wdPropertyTimeLastSaved = &H000000C ' 最后一次保存时间
  wdPropertyVBATotalEdit = &H000000D ' VBA Edits的数目
  wdPropertyPages = &H000000E ' 总页数
  wdPropertyWords = &H000000F ' 总字数
  wdPropertyCharacters = &H0000010 ' 总字符数
  wdPropertySecurity = &H0000011 ' 安全设置
  wdPropertyCategory = &H0000012 ' 类别
  wdPropertyFormat = &H0000013 ' (尚未支持)
  wdPropertyManager = &H0000014 ' 管理器
  wdPropertyCompany = &H0000015 ' 公司
  wdPropertyBytes = &H0000016 ' 字节数
  wdPropertyLines = &H0000017 ' 行数
  wdPropertyParas = &H0000018 ' 段落数
  wdPropertySlides = &H0000019 ' (尚未支持)
  wdPropertyNotes = &H000001A ' 便签数
  wdPropertyHiddenSlides = &H000001B ' (尚未支持)
  wdPropertyMMClips = &H000001C ' (尚未支持)
  wdPropertyHyperlinkBase = &H000001D ' (尚未支持)
  wdPropertyCharsWSpaces = &H000001E ' 带空白字符的字符统计
end Enum

参考.NET版实现《WdBuiltInProperty Enumeration》

VBScript/VBA设置Word文档的页眉或页脚

由于工作需要我们常常需要批量设置Word文档的页眉或者页脚,除了递归遍历Word文件外,我们还需要借助Word.Application组件来实现页眉或页脚的增加或修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Option Explicit
 
Const MSWORD_FILENAME = "Word文件路径"
 
Const wdSeekCurrentPageFooter = 10
Const wdAlignParagraphCenter = 1
Const wdAlignParagraphRight = 2
Const wdSeekMainDocument = 0
 
Dim wdApp
Set wdApp = WSH.CreateObject( "Word.Application")
wdApp.visible = False
 
Set doc = wdApp.Documents.Open(MSWORD_FILENAME)
doc.Activate ' 激活打开的文档
doc.PageSetup.FooterDistance = 30 ' 设置页脚到页面底边的距离
 
' 定位到页脚
wdApp.ActiveWindow.ActivePane.View.SeekView _
 = wdSeekCurrentPageFooter
' 下面是针对字体的设置
wdApp.Selection.Font.Name = "Times New Roman"
wdApp.Selection.Font.Size = 14 ' 字号
wdApp.Selection.Font.Bold = True ' 加粗
wdApp.Selection.Text = "页脚0001"  ' 页脚文本
' 页脚文本的位置wdAlignParagraphRight为居右
wdApp.Selection.ParagraphFormat.Alignment _
 = wdAlignParagraphRight
' 返回定位到主文档
wdApp.ActiveWindow.ActivePane.View.SeekView _
 = wdSeekMainDocument
 
doc.Save ' 保存刚才的修改
doc.Close ' 关闭文档
Set doc = Nothing
 
wdApp.visible = True
wdApp.Quit
Set wdApp = Nothing

这里要注意的是设置页脚到底边距离的时候需要用到页面设置的功能,即PageSetup.FooterDistance。

VBScript实现Word和Excel的打印

只要是安装了Microsoft Office的Word和Excel电脑,微软都为我们提供了Word和Excel的COM组件,方便我们以COM对象访问的形式操纵Word或Excel文件,今天介绍个小功能,那就是打印。

首先是Word的打印,基本上的流程就是创建Word.Application对象,然后调用Documents.Open的方式打开doc文件,然后执行PrintOut方法打印文件,然后Close关闭,最后退出并销毁Word.Application对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Option Explicit
 
Const MSWORD_FILENAME = "Word文件路径"
Sub VBMain()
  Dim wdApp, Doc
  Set wdApp = WSH.CreateObject("Word.Application")
  wdApp.Visible = False
  Set Doc = wdApp.Documents.Open(MSWORD_FILENAME)
  Doc.PrintOut
  Doc.Close
  Set Doc = Nothing
  wdApp.Visible = True
  wdApp.Quit
  Set wdApp = Nothing
End Sub
 
Call VBMain()
WSH.Quit()

最后介绍下Excel的打印,同样的道理,创建对象,打开要打印的工作簿,选择要打印的工作表,打印,然后关闭工作表,退出并销毁对象。同样的一些操作可以参考Excel的VBA手册《Microsoft Excel Visual Basic参考》

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Option Explicit
 
Const MSEXCEL_FILENAME = "Excel文件路径"
Sub VBMain()
  Dim xlApp, WorkBooks, Sheet
  Set xlApp = WSH.CreateObject("Excel.Application")
  xlApp.Visible = False
  Set WorkBooks = xlApp.Workbooks.Open(MSEXCEL_FILENAME)
 
  Set Sheet = WorkBooks.Worksheets(1)  '打开第一个工作表
  ' 也可以打开上次保存时打开的活动工作表
  ' Set Sheet = WorkBooks.ActiveSheet  打开活动的工作表
  Sheet.PrintOut
  Set Sheet = Nothing
 
  WorkBooks.Close
  Set WorkBooks = Nothing
  xlApp.Quit
  Set xlApp = Nothing
End Sub
 
Call VBMain()
WSH.Quit()

对于想批量打印的朋友可以参考我这篇文章《采用插件机制的批量文件扫描及进程处理工具》