在“宏名”一栏中,选中要修改的word命令(例如,filesave)。
在“宏的位置”一栏中,选择要保存宏的模板或文档的位置。例如,单击normal.dot(共用模板)来创建一个共用宏(filesave命令将会自动地对所有文档进行修改)。
单击“创建”。
visual basic编辑器被打开,其中显示出一个模块,该模块包含有一个与刚才被选中的命令同名的新过程。如果选中了filesave命令,那么就出现filesave宏,如以下示例所示。
sub filesave()
filesave macro
saves the active document or template
保存活动文档或模板
activedocument.save
end sub
用户可以添加附加的命令或删除已有的activedocument. save命令。filesave命令每次运行时,filesave宏都将word命令来执行。要恢复原来的filesave命令,需要更改filesave宏的名字或删除它。
注释 用户还可以通过创建与word命令(例如,filesave)同名的代码模块来用一个名为“main”的子例程替换一条word命令。
运用事件
一个事件既可以是一个被对象识别的操作(比如,打开一个文档或者从应用程序退出),也可以是一个能够编写代码来响应的操作。一个用户的操作或一段程序代码都可以导致事件的发生,事件也可以由系统引起。word所支持的事件均列在下表中,该表还列出了activex控件事件,它们将在第十二章“activex控件和对话框”中进行讨论。
要了解关于运用word事件的信息,请参阅下列“帮助”主题:“使用document对象的事件”、“使用activex控件的事件”以及“使用application对象的事件”。
document事件
当用户打开或关闭一个已经存在的文档时,或者用户在新建一个文档时,就发生了文档事件,如以下示例所示。
事件描述
当关闭一个文档时发生close事件。
当创建一个基于模板的新文档时发生new事件。
当打开一个文档时发生open事件。
一个文档事件过程的范围取决于它保存的位置。如果在一个文档中保存open或close事件过程,那么该过程仅当用户关闭或打开该文档时才发生;如果在一个模板中保存open或close事件,那么当打开或关闭基于该模板的文档或该模板本身时,该过程才发生。一个新事件过程必须保存在模板中;一个保存在文档中新事件过程决不会运行,因为文档只能基于模板来创建。
以下的示例在打开文档时将word应用程序的窗口扩至最大状态。
private sub document_open()
application. windowstate = wdwindowstatemaximize
end sub
activex控件事件
word为word文档中的activex控件执行lostfocus 和 gotfocus事件。
事件描述
在焦点移开嵌入式 activex 控制时发生lostfocus事件。
当焦点移至内嵌式 activex 控制时发生gotfocus事件。
以下的示例保持commandbutton1处于禁用状态,直到用户在textbox1中键入一个值。
private sub textbox1_lostfocus()
if textbox1. value = "" then
commandbutton1. enabled = false
else
commandbutton1. enabled = true
end if
end sub
其他activex控件事件的文档在“microsoft 窗体帮助”中。有关在自定义对话框和文档中使用activex控件的内容,请参阅第十二章“activex控件和对话框”。
application事件
当用户退出应用程序或焦点移至另一个文档时发生application事件。但是,与document和activex控件事件不同,application事件默认事件处于禁用状态。在用户随同application对象使用事件之前,必须新建一个类模块并声明一个包含事件的 application 类型对象。用户可以在visual basic编辑器中使用类模块命令(插入菜单)的形式来新建一个类模块。
启用application对象的事件,最好向类模块中添加以下声明。
public withevents app as application
定义了包含事件的新对象后,它将出现在类模块的“对象”下拉列表框中,然后可为新对象编写事件过程。(在“对象”框中选定新对象后,其有效事件将出现在“过程”下拉列表框中。)
但是在过程运行之前,必须将类模块中的已声名对象和 application 对象相连接。要完成上述任务,可以在任何模块中使用下列声明(在这里“eventclass”是用户创建的用来启用事件的类模块的名字)。
public x as new eventclass
当用户已经创建了x对象变量后(eventclass类的一个实例),可以设置enventclass类的app对象于word application对象等价。
sub initializeapp()
set x. app = application
end sub
在用户运行initializeapp过程之后,eventclass类模块中的app对象指向了word application对象,而且只要事件发生,类模块中的事件过程也将会运行。
在用户禁用application对象的事件之后,可以为下表中的事件创建事件过程。
事件描述
当新建一个文档、打开一个已有文档或使另一个文档成为活动文档时documentchange事件发生。
当用户退出word时quit事件发生。
以下的实例确保了在用户退出word之前,“常用”工具栏和“格式”工具栏均为可见。结果,当重新启动word时,这些工具栏将不会出现。
private sub app_quit()
commandbars ("standard"). visible = true
commandbars ("formatting"). visible = true
end sub
使用自动宏
通过给一个宏赋予一个特殊的名字,用户可以在执行诸如启动word或打开一个文档这样的操作时自动运行它。word将下列名称识别为自动宏,或者“自动”宏。
宏 名
运 行 时 刻
autoexec
每次启动word或装载一个全局模板时
autonew
每次新建一个文档时
autoopen
每次打开一个已有文档时
autoclose
每次关闭一个文档时
autoexit
每次退出word或卸载一个全局模板时
关于使用自动宏的详细信息,请参阅“帮助”中的“自动宏”。
使用自动化
在运用word数据之外,用户还可能想让自己的应用程序同其他的应用程序,比如microsoft excel, microsoft powerpoint, 或microsoft access交换数据。用户可以通过使用自动化(以前的ole自动化)来同其他应用程序进行通信。
从另一个应用程序中对word进行自动化
自动化运行用户通过引用另一个应用程序的对象、属性和方法来返回、编辑和输出数据。用户能够在另一个应用程序中进行引用的application对象称为自动化对象。使word能够被另一个应用程序所使用的第一步,就是创建对word类型库的一个引用。要创建对word类型库的引用,可以在“visual basic编辑器”里,单击 “工具”菜单中的“引用”,然后在“microsoft word 8.0 object library”旁边的复选框内打上钩。
下一步,声明一个引用word application对象的对象变量,如下例所示。
dim appwd as word. application. 8
使用带有word ole程序标识符的visual basic createobject函数或getobject函数,如下例所示。如果想看到word时段,设置visible属性为true(真)。
dim appwd as word. application. 8
set appwd = createobject ("word. application.8")
appwd. visible = true
createobject函数返回一个word application对象,并且将它赋给appwd。通过使用word application对象的对象、属性和方法,用户可以用该变量对word进行控制。以下的实例新建一个word文档。
appwd. documents. add
createobject函数启动一个word时段,当引用application对象的对象变量失效时,该时段内的自动化不会关闭。设置该对象引用nothing关键字也不会关闭word。而是使用quit方法来关闭word。以下的microsoft excel示例把“工作表1”中a1:b10单元格里的数据插入到一个word新文档中,然后调整表格中的数据。如果使用了createobject函数,则该示例使用quit方法来关闭word的新实例。如果getobject函数返回错误429,那么该示例使用createobject来启动一个word新实例。
dim appwd as word. application
err.number = 0
on error goto notloaded
set appwd = getobject (, "word. application.8")
notloaded:
if err. number = 429 then
set appwd = createobject ("word. application.8")
theerror = err. number
end if
appwd. visible = true
with appwd
set mydoc = .documents. add
with .selection
for each c in worksheets ("sheet1"). range ("a1:b10")
.insertafter text :=c.value