打开天窗说亮话:领教窗口“宏”

Author: 魏炜 Date: 1999年 第47期 34版


    不论是新建、打开还是删除、修改,Word中的对话窗口时时伴随在你我身边。你是否知道,Word中的窗口从何而来?而我们是否也能开一扇属于自己的“窗口”,望一望那一片别样的天空?
    事实上,Word的对话窗口尽可让你一手掌握,这个已不是秘密的秘密当然属于——Word窗口“宏”。众所周知,Visual Basic是一种强有力的编程语言,利用VB编写出来的Word“宏”不但可以完成一系列复杂的界面操作,而且能够完成更复杂的窗口操作,而创建大量有效的对话框就是它的基本功之一。
    下面,我们就通过几个简单的实例来领教领教这个开放式编程系统的巨大威力。 
    1. 编程热身:给Word加信息
    首先我们认识一个必备的概念:“变量”。如果你曾系统学习过一门高级语言,那么你对编程中的“变量”就一定不会感到陌生。所谓变量就是在程序运行过程中其值可以变化的量。在VB中用得最多的是字符变量,它常被用来代表一段文字。如果我们在变量名后加上$符号,那么字符变量就变为字符串变量了,如Word$ 。在VB中还规定,变量的说明方式有两种:一是在使用的变量名称后加类型定义符:%、&、$、|、#等;二是在变量前用DIM、Static、ReDIM或Global等关键字说明。
    好了,有了以上这些枯燥但却十分有用的知识后,我们现在就可编个程序热热身了。在日常使用中你一定发现:每当我们用Word进行操作时,窗口底部的状态栏也会作出相应的信息说明,而这时我们就可对当前的工作有个清醒地认识。那么,我们能不能编写属于自己状态栏语句,让自己告诉自己呢?No problem!
    一般来说,要在Word的状态栏中显示信息,使用WordBasic.Print StatusBar陈述语句是再合适不过的了。WordBasic.Print StatusBar陈述语句的格式为:
    WordBasic.Print StatusBar变量名$或“字符串”
    例如,我们要在状态栏中显示“华中理工大学”这几个字,就只须编写:
    Sub Macro1()
     WordBasic.Print StatusBar“华中理工大学”
    End Sub
    完了?完了。不要用睁大的眼睛来看我,事情就是这么简单。当然,我们也可以综合运用字符串和字符串变量一起来显示信息,其中字符之间要用&隔开。例如要显示“她今年20岁”这样一条信息,就完全可以这样写:
    Sub Macro1()
     Text1$ =“她今年”
     WordBasic.Print StatusBar Text1$ &“20岁”
    End Sub
    如^473401a^1所示,你是否觉得Word离我们越来越近了呢?其实未必,VB的强大功能和复杂编程远远超过我们的想象。以上的编写只是刚刚上手,下面我们再来看如何定制窗口。 
    2. 初显锋芒“消息框”
    消息框是Word中人机对话的重要桥梁,也是Windows系统中最常见的窗口之一。要编写一个消息框首先想好三个问题:
    1) “信息”,即我用这个消息框到底要给使用者传达一个什么消息;
    2) “标题”,即用来标记消息框的名字;
    3) “类型”,即设置按钮、图标或缺省按钮的一种代码
    ●消息框中按钮代码为:
    0“是”按钮(缺省值)           3“是”、“否”、“取消”按钮
    1“是”和“取消”按钮           4“是”、“否”按钮
    2“放弃”、“重试”、“忽略”按钮 6“重试”、“取消”按钮
    ●消息框中图标代码为:
    0“否定”图标        48“注意”图标
    16 “停止”图标       64“信息”图标
    32 “提示”图标
    ●消息框中缺省代码为:
    0 第1个按钮        512第3个按钮
    256 第2个按钮
    这样,在对上述三个问题都有了一个比较成熟的考虑后,我们就可着手编制消息框了。例如,要创建一个标题为“请回答”、主信息为“你认为是这样吗?”、并有着“是”、“否”、“取消”三个按钮和一个“注意”图标的消息框,就要做如下分析:
    1) 要创建三个按钮,“是”、“否”和“取消”的代码为3;
    2) 要创建一个注意图标,代码为48;
    3) 要将第1个按钮“是”设为系统默认值,缺省代码为0;
    4) 以上三个参数相加和为51。
    因此,我们应该这样写“宏”:
    Sub Macro1()
     Dim DgDef As Integer
     Dim Response
     Dim Title
     MsgBox$ =“你认为是这样吗?”
     DgDef = 51
     Title =“请回答”
     Response = MsgBox(MsgBox$,DgDef,Title)
    End Sub
    OK,现在我们就运行这个“宏”吧(如^473401b^2所示)!一个熟悉但又完全崭新的窗口跳入我们的眼帘——我们成功了! 
    3. 各个击破学“开窗”
    在实现了以上两种比较直观的“宏”后,你是否会觉得这窗口“宏”也太简单了呢?其实VB虽然“可视”,但也毕竟是一种编辑程序,在大多数情况下它也是冷冰冰、死沉沉、让人头疼不已的。比如,你要创建一个能够输入数据的对话框,那么就要根据输入数据的性质不同而编写多套不同的程序,并且如果一旦你在一个窗口中输入了不同类型的数据,纵然它是对话框,也会对你不闻不问的。这样,我们只有抓住重点,各个击破了。
    1) 创建输入正文对话框
    要创建一个能输入正文的对话框,所要使用的语句为InputBox$ ,其格式为:
    InputBox(“要求”,“标题”,“缺省”)
    具体说来,它们的含义是:
    a) “要求”是指该对话框提示用户输入什么样的正文信息的语句;
    b) “标题”是指该对话框的名称;
    c) “缺省”是指在用户未键入任何正文之前,系统就默认好的正文字样。
    例如,我们要创建一个名为“输入姓名”、提示语句为“请您在这里输入姓名”及默认字样为“魏炜”的对话框,就应该这样编写“宏”:
    Sub Macro1()
     Dim Answer,DefVal,Msg,Title
     Msg =“请您在这里输入姓名”
     Title =“输入姓名”
     DefVal =“魏炜”
     Answer = InputBox(Msg,Title,DefVal)
     MsgBox“输入了”&Answer
    End Sub
    运行这个“宏”,结果如^473401c^3所示。怎么样,是不是太有成就感了!
    2) 创建输入数字对话框
    如上所述,用InputBox语句返回的是字符串值而不是数字,因此必须将它转化为一个数字值才能进行计算。这一点利用Val语句就可实现,另外还可利用Str$语句将一个数值转化为字符串。
    比如下面这个“宏”,它就可以让用户在输入了数字值后将该值转化为一个字符串:
    Sub Macro1()
     Dim Answer1,Answer2,Ddfal,Msg,Title
     Dim Num1,Num2
     Msg =“请输入一个能被10整除的数”
     Title =“输入数字”
     DefVal =“10”
     Answer1 = InputBox(Msg,Title,DefVal)
     Num1 = Val(Answer1)
     Num2 = Num1*10
     Answer2 = Str$(Num2)
     MsgBox“输入了”&Answer2
    End Sub
    我们看到在这个“宏”中,前面两句与上面介绍的没什么区别。但到了第8句就有点奥妙了:它是将Answer1转化为一个数值,并将它赋给数字变量Num1;而第9句则是将Num1乘以10后再赋给数字变量Num2;到了第10句就变为将Num2转换为一个字符串赋给字符串变量Answer2了。
    我们运行这个“宏”,就可看到如^473401d^4所示的对话框,并在按下“确定”后出现我们所要的结果——一个能被10整除的数。 
    好了,说了这么多,关键还在于你实际运用中灵活掌握。当你能够如同书写汉字一样编写Word“宏”时,那你就没事偷着乐吧!