打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
在程序中利用VBA编写控制Word域的功能

在程序中利用VBA编写控制Word域的功能

域是Word最具有实用价值的功能之一。本文作者利用VBA编写的一通用的处理Word域的程序。

 域是Word最具有实用价值的功能之一,它表示文档中可能发生变化的数据或邮件合并文档中套用信函、标签中的占位符。Microsoft Word 可以在您使用一些特定命令时插入域,如“插入”菜单上的“日期和时间”命令。您也可使用“插入”菜单上的“域”命令手动插入域。

事实上,我们在日常工作中常会脱离Microsoft Word的操作环境。一般,用户是先建立好一些Word文件模板,然后利用所提供的应用程序功能向Word文件模板中插入域,然后用该域对应的值取代域值,这样就达到了向Microsoft Word文件中插入数据的作用。我们常把数据放入数据库中,数据库的内容不断地变化,我们的域值也跟着不断地变化,取到灵活自动更新的作用,要达到这方面的功能,就应该把数据库与Word域结合起来。

首先要解决这一问题,我们必须先了解Word域有关的知识:Word域代码位于花括号或大括号 ( { } )中,域类似于 Microsoft Excel 中的公式:域代码类似于公式,域结果(域结果:当 Microsoft Word 执行域指令时,在文档中插入的文字或图形。在打印文档或隐藏域代码时,将以域结果替换域代码。)类似于公式产生的值。可在文档中切换显示域代码及其结果。正好,数据库的字段名对应域代码,字段值对应域结果。

下面是本人利用VBA编写的一通用的处理Word域的程序:

主要功能:通用VB6编写通用的类,给用户提供可视化的编辑界面,用于用户在Word文件中插入域标志。针对Word文件或Excel表格文件,扫描整个文件,将其中的域标志(如Set aaa”)取出来,然后通过从数据库中取出”aaa”字段所对应的值,将值填写到文件中域对应的位置。若对应位置已有值,则判断该值与要填写的值是否相同,若不同则替换。插入值分为:

1.单纯的值,直接使用一个值替换域。

2.表格中的单元格。若该表格填写不下,是否增加表格单元?以及与该单元关联的域等。

开发方法:启动VB6,新建一ActiveX Dll工程,把工程名更改为VbaWord,把类名Class1更改为CSetDocField,向工程中增加一窗体Form1, 窗体标题为处理Word文档,在Form1上加入2CommandButton,用于打开文件和保存文件用的命令按钮;2ComboBox,用于所插入的字段名;2 Label;2CommonDialog,用于执行打开文件和保存文件。界面如下:

按工程--引用--Microsoft Word 10.0 Object Library引用Word(OFFICE 2000Microsoft Word 9.0 Object Library)

List1Form1的代码窗中定义的变量。List2是在Form1的代码窗中定义定义打开Word文件的过程。建立Word应该对象及文档对象,并打开文件。

在文档中插入域(KeyWord:域的关键字)。我们利用Word文档对象的域对象的Add方法向Word文件中插入域。域的Data属性代表该域的名称。插入域时应该选取得插入点(Selection),既用户光标处位置。如果该位置是单元格且已插入域应该提示是否覆盖。list3

我们可以通过选择点的表格数判断插入点的性质。表格数为0,则选择点不位于单元格中,反则不位于单元格中。List4

打开Word文件.并使处理界面位于Word最顶端,适当调整Word位置,关闭Word其它功能并保存Word文件。List5

用户选择所插入域的域名,并在光标处插入域。

PrivateSub Combo1_Click()

    Dim KeyWord AsString

    KeyWord = Combo1.Text

    InsertField(KeyWord)

EndSub

域所对应多值时,域只能插入表格中。且要与单值域区分,标记为多值插入。List6

关闭时的部分代码List7

下一部分我们继续介绍CSetDocField类的内容编写。

下面我们继续编写CSetDocField类的内容。

CSetDocField类应该提供单值域和多值的域名,所以我们把它们定义为CSetDocField类的属性,并提供一运行上面窗口的方法。这里我们要利用一些技巧,在定义类并向类属性赋性值后,事实赋性值是保存在所定义的实类中,该实类一旦消失,值也随着消失。如何不通过该实类取得类的属性?这是困扰许多开发人员的问题。我的解决方法是申请与类属性对应的全局变量。向类属性的同时,把值保存在对应的全局变量中,取值时取出对应的全局变量的值就可。

这里我们选增加一Module,Code如下:

Public gSavePath AsString

Public gFieldColl As Collection

Public gTableColl As Collection

Sub Main()

    Form1.Show(1)

EndSub

下面我利用全局变量当作类属性使用的技巧:

CSetDocField类的Code:List1

这里,我们把插入域的类编写好了,只要在VB6的文件菜单中执行生成该类的文件就可生成DLL文件。

下面编写将值填写到文件中域对应的位置的类

VbaWord工程中增加新类CWriteDataToDocument

CWriteDataToDocument由调用者提供所处理的文件模板,所以它应该有一文档属性DocumentName,打开DocumentName文件,向DocumentName文件中插入单值和多值。插入多值时要判断是否增加单元格。如果对应的值多于所提供的表格行数,则要增加行。下面是它的完整Code:

list2

技巧:先扫描整个文档,逐一分析每个域,该域是通过上面方法所插入的域,既域类型为81则用值取代.如果该域在单元格中,该域并且已经有了值,用户重新填充值时,应该覆盖原值。怎样才能覆盖原值呢?解决的方法是该域的位置作为选择点,选择整个单元格,清除单元格的内容,并重新插入域后,再用值取代。

List3

编写好了所有类,把它生成DLL文件就可。

下面对它进行测试:

重新生成一工程,向工程中增加一ModuleModuleCode如下:

list4

运行时的界面如下:

打开一Word文件运行后的界面如下:

修改Main的内容,测试填充数据的类:

Sub Main()

    Dim bb AsNew CWriteDataToDocument()

    bb.DocumentName = "e:将数据库中的信息据填写到文件.doc"

    bb.FillData()

EndSub

运行之可达到所要求的所有功能。

总结:上面方法介绍了Word域的利用,利用VBA编写Word域的方法。Word域所对应的数据库的字段的单值和多值的关系,极有普遍性,很有实用价值。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Word域与数据库的结合编程(1)
VBA批量修改Word中表格的单元格内容
禁止Excel工作薄文件被拷贝复制的方法
WORD设置打印域代码而非域值
Excel VBA:按模板批量生成word文件
【VBA研究】用VBA取得EXCEL随意列有效行数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服