VBA/VBScript提取Word(*.doc)文件中包含的图片(照片)

要处理的人事简历表是典型的Word文档,其中一人一份doc,里面包含有个人的照片,如果要把里面的照片复制出来就比较麻烦了,一般手动的做法是选择文件另存为,保存类型选择“网页(*.htm; *.html)”,这样就会另存为网页形式,同时会有个以文件名开头,以.files结尾的文件夹,点击进去就可以看到Word里面嵌入的所有资源,包含所需要的图片资源。

值得注意的是该文件夹里同一张图片正常会有两个副本,其中一张图片文件体积较大,另一张图片文件体积较小,显而易见较小体积的文件是Word自动创建的缩略图,在绝大多数情况下我们可能仅仅需要原始的插入图片,那么选择较大体积的图片文件即可,好在我要处理的人事简历表只有员工的一张照片,那么另存为网页后的文件夹也仅仅只有两张图片,一张原始图片,一张缩略图,这两张图片可以通过大小区分。

继续阅读

Office Word 2003 使用邮件合并功能实现连续编号备忘

这里做个备忘,主要是工作上偶尔会遇到的一个简单操作,常见的场景是会议资料封面需要编号,或者某某证书有唯一的序列号标识。其实很长一段时间是用打码机手动一张一张打码进行编号,这个工作特别累人,尤其是在文件比较多、任务比较紧的情况下,如何自动让Word根据模板来生成已经编好号的页面成为考虑的首要内容。

对于程序员来说,第一种想法就是编程,通过VBA技术进行脚本编程,替换设定好的模板指定占位符进行批量生成确实可以很好的解决问题,唯一麻烦的地方是如果以后文件有改动,程序需要重新配置,而且授人以鱼不如授之以渔,对于不会编程的同事来说,我还需要教会他们完成这项工作,所以今天文章主要介绍的就是如何不通过编程来实现连续编号。

假设给我们的是一个留下需要输入编号的空白模板文档,在此基础上我们需要新建Excel,文件名自定义。

继续阅读

PHPWord解决中文乱码并导出生成Word2007(docx)格式文档

最近一个项目开发要用到PHP技术导出Word文档,比较了几种方案,首先是使用Microsoft Office自带的ActiveX/COM组件,比如Word.Application,这种方式的优点是格式兼容度高,可以生成纯doc的Word2003格式文档,缺点一是比较占资源(调用会启动一个WINWORD.EXE进程),不适合Web多用户访问使用;二是PHP这种Web开发技术大多数是跑在Linux服务器上,当然也就无法使用Windows下的技术了,平台可移植和兼容性不好。第二种生成Word的方案是生成Word兼容的网页格式,然后以Word方式打开,这种方案总体上感觉怪怪的,毕竟文件格式是HTML的,而且格式兼容度不好,不过这种方式的优点是节省服务器资源,能够快速生成;最后一种方案也就是今天的主角,采用PHPWord生成Word2007(docx)格式的文档,现在基本上微软Office Word 2003以后的版本均兼容这种格式了,对于2003版本来说,仅需要下载安装个兼容格式包(下载地址),也能正常打开这类文件,当然如果你使用的是最新版本的Office(包括但不限于Office 2007、Office 2010)则不需要安装此格式包。

继续阅读

VBA/VBScript批量搜索多个Word或者Excel指定的包含文字

假设我们有多个Word或者Excel文件,现在我们要从这些文件中搜索特定的关键字,比较笨的办法就是一个一个打开,然后“编辑 – 查找”,文件少还好办,如果文件比较多的话,那么打开这么多文件也累得我们够呛。

下面我讲解一个利用VBScript自动批量搜索特定文字的办法,首先还是上面的算法,只不过将人工一个一个打开换成计算机自动打开。实际上这里主要是枚举文件,然后在利用ActiveX控件调用Word.Application或者Excel.Application内部的查找方法来实现相关功能。

对于一份简单的Word文档,基本的查找VBA可以像下面这样实现:

Dim hasFound ' 定义是否找到
Selection.WholeStory
With Selection.Find
    .ClearFormatting
    .MatchWholeWord = False
    .MatchCase = False
    hasFound = .Execute("要查找的文字")
End With

转化为VBScript代码也很容易,多个创建Word.Application并打开Word文件的过程。

继续阅读

VBA/VBScript裁剪拆分Word文档为多个文件(分解为多个独立页面)

标题可能不是很恰当,准确的来说就是将一个有很多页面的Word文档按照指定的页数分解为多个独立的Word文档。本来想通过复制指定页内容然后再新建Word来实现的,后来发现这样做一是很麻烦,二是格式容易错。最后想到了一个比较笨的办法:复制一份原稿,然后除了要保留的页面外,其余的统统删去,然后下个页面再复制一份,以此反复,直到完成全部的拆分。

对于页面的删除,可以通过先选中这个页面内容,然后再执行Selection.Delete方法。这样删除不需要的页面后留下的就是我们需要保留的页面了,这份文档算是完成。

这里有个需要注意的地方,保留Word文档N页中第M页共P页,需要执行两步删除,第一步是删除M页之前的所有页面,第二步是删除M+P页之后的所有页面,然后得到的就是所要的。细节方面就是当执行第一步后,第M页会自动转为第1页(因为前面的都删除了),所以我们接下来执行第二步的时候需要从第1+P页开始,另外如果M=1,说明需要保留从第一页开始,那么第一步可以略去,如果M+P>=总页数,则说明需要保留的包含最后一页,那么第二步就可以略去。

下面提供一份VBScript Class msoWord_SplitPages,其中演示了上面的算法思路,供大家参考:

继续阅读

解决稿纸加载项Genko.msi导致Word无法启动的问题

相关操作仅供参考

首先症状1,Word启动时出现“无法访问您试图使用的功能所在的网络位置。单击‘确定’重试,或在下面的框中输入包含安装程序包‘Genko.msi’的文件夹的路径。”如下图所示:

无法访问您试图使用的功能所在的网络位置 - 稿纸加载项.jpg

症状2,无法卸载Microsoft Office Word 2003 稿纸加载项,可能出现的问题如症状1所示。

解决方案:

1.保留Microsoft Office Word 2003 稿纸加载项,登录微软的相关下载页面或者我的网盘。下载传说中的GenkoSetup_CHS.msi。对其右击选择“修复”:

继续阅读

解决Word遇到问题需要关闭和“安全模式”启动问题

本文仅在Windows XP和Office 2003环境下测试通过,本文所述方法仅供参考,操作前建议备份重要文件,若造成损失与本人无关。

今天单位某台机子的Microsoft Office Word在打开Word文档时先是出现下面的对话框:

Word遇到问题需要关闭.png

意思就是“Microsoft Office Word 遇到问题需要关闭。我们对此引起的不便表示抱歉,您正在处理的信息有可能丢失。Microsoft Office Word 可以尝试为您修复。”,我们勾选“恢复我的工作并重启 Microsoft Office Word”选项后,无论是发送错误报告还是不发送,接着又会出现下面这个对话框:

继续阅读

VBScript/VBA批量合并多个Word文件到一个文件

如果手头有一些比较零散的Office Word文件(*.DOC),但是实际需求确实要将这些Word文件合并成一个Word文件,假如说这些零散的文件比较多,那么手工一个一个添加必定会带来麻烦。这时我们就可以使用VBA的相关功能来帮助我们了。

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
Const wdPageBreak = 7 ' 分页符
 
Dim strFileName
strFileName = "要合并的文件.doc"
 
Dim strDestFileName
strDestFileName = "最终合并的文件.doc"
 
Dim wdApp, doc, Selection
Set wdApp = WSH.CreateObject("Word.Application")
wdApp.Visible = False
 
Set doc = wdApp.Documents.Add
 
Set Selection = wdApp.Selection
' 这里strFileName直接是要合并的文件路径
' Selection.InsertFile FileName:=strFileName
Selection.InsertFile strFileName
' 跳转到下一页(插入分页符)
' Selection.InsertBreak Type:=wdPageBreak
Selection.InsertBreak wdPageBreak
 
Set doc = Nothing
doc.SaveAs strDestFileName
doc.Close
 
Set doc = Nothing
wdApp.Visible = True
wdApp.Quit
Set wdApp = Nothing

上面的代码具体演示了如何插入一个文档,那么如何批量插入多个文档呢?你可以试试我前面一篇文章《采用插件机制的批量文件扫描及进程处理工具》所介绍的办法,或者像下面这样:

继续阅读

VBA对Word行、段落和光标位置的移动、选择和操作

Mr.Abao’S Blog上看到的,VBA编程时要参考,特地转一下,另外由于嵌入到VBScript脚本中编程,对一些常量我给出了声明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Const wdCharacter = 1
Const wdExtent = 1
Const wdExtend = 1
Const wdGoToBookmark = -1
Const wdLine = 5
Const wdCell = 12
Const wdTableFormatSimple2 = 2
Const wdAlignParagraphRight = 2
Const wdYellow = 7
Const wdToggle = 9999998
Const wdAlignParagraphCenter = 1
Const wdSentence = 3
Const wdParagraph = 4
Const wdStory = 6
Const wdMove = 0

下面我将Mr.Abao’S Blog的内容转帖(略作修改,主要是注释部分增加了VBScript的脚本写法):在WORD中用VBA宏语言选定一行、一段,删除一行、一段,移动光标至行首、行尾、段首、段尾等。

继续阅读

Word查找替换使用TypeText解决字符串参量过长的错误

在我的这篇《VBScript/VBA批量替换Word指定的内容》文章已经介绍了关于使用VBScript或者VBA查找替换Word的问题,但是在实际操作时,会发现查找和要替换的字符串不能超过一定的数量(大概是500个字符),否则会出现“字符串参量过长”的错误。

其实我们可以通过Selection.TypeText的办法避免这个问题,这个办法只适用于模板的替换,比如设置标记符{%TEMPLATE%},然后替换这个标记符为一段很长的文本。

具体的代码也很简单,我们就以之前那篇文章为例,做下改动,新代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
Const wdReplaceAll  = 2
 
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
 
Set objDoc = objWord.Documents.Open("C:\Scripts\Test.doc")
Set objSelection = objWord.Selection
objWord.Options.ReplaceSelection = True
objSelection.Find.Text = "{%TEMPLATE%}" ' 标记符
objSelection.Find.Forward = True
objSelection.Find.MatchWholeWord = True
objSelection.Find.Execute
objSelection.TypeText "要替换的长文本"

通过TypeText我们就有效的避免了替换长文本时的限制,但是如何查找长文本,目前我还在寻找较好的解决方案。不过解决了长文本的替换就给我们使用查找替换标记符式的Word模板扫清了障碍。