ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 83435|回复: 130

[原创] 守柔WORD-VBA讲座[2005-9-13日更新]

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2005-7-20 09:35 | 显示全部楼层 |阅读模式

由于图片与WORD文档在上传到网页过程有需要分离,我先试用PDF吧,如果不便,再作处理。


一:简介:


1          VBA:是Visual Basic For Applications的缩写,也就是捆绑在Applicatin(WORD)应用程序上的一个简单Visual Basic程序语言(此处简单地说就是面向WORD的VB编辑开发语言)。我们平时所称的VBA,即是以编程的方法来处理WORD中的各种对象。


2          VBE(Microsoft Visual Basic Editor),通常称为Visual Basic 编辑器,简称VB编辑器或者VBE,也就是我们设计\调试代码的编辑器,它是捆绑在Application(此处指WORD)应用程序中的一个程序.


3          进入VBE常用的几种方式:


l         ALT+F11


l         工具/宏/Visual Basic 编辑器命令


l         工具/宏/宏对话框,创建或者编辑命令,也可以进行Visual Basic 编辑器.


4          主窗口:


4.1         主窗口见图,它由标题栏、菜单栏和工具栏组成。


4.2         标题栏:


4.2.1        标题栏中的标题为"Microsoft Visual Basic - 文档 1 [正在运行] - [ThisDocument (代码)]",说明此时集成开发环境处于设计模式,在进入其他状态时,方括号中的文字将作相应的变化.


4.2.2        VBE(VB)有三种工作模式:设计(Design)模式、运行(Run)模式和中断(Break)模式.


l         设计模式:可进行用户界面的设计和代码的编制,以完成代码的开发.


l         运行模式:运行代码,这时不可编辑代码,也不可编辑界面.


l         中断模式:程序运行暂时中断,这里可以编辑代码,但不可编辑界面.按F5键或者单击"继续"按钮程序继续运行;单击"结束"按钮程序停止运行.在此模式会弹出"立即"窗口,在窗口内可输入简短的命令,并立即执行.


4.2.3        同WORD程序界面一样,标题栏的最左端是窗口控制菜单框;栏题栏的右羰是最大化\最小化和关闭按钮.


5          菜单栏:


菜单栏中包括11个下拉菜单,这是程序开发过程中所需要的命令.


5.1         文件(File):用于保存、打印、移除、导入、导出等文件的操作。


5.2         编辑(Edit):用于程序源代码的编辑。


5.3         视图(View):用于集成开发环境下程序源代码、控件的查看。


5.4         插入(Insert):用于插入类模块、标准模块和用户窗体的插入。


5.5         格式(Format):用于窗体控件的对齐等格式化操作。


5.6         调试(Debug):用于程序调试、查错等。


5.7         运行(Run):用于程序启动、中断和停止等。


5.8         工具(Tools):用于集成开发环境下工具的扩展,为工程保护加密和对VBE环境的一些设置等。


5.9         外接程序(Add-Ins):用于为工程增加或删除外接程序。


5.10     窗口(Windows):用于屏幕窗口的层叠、平铺等布局以及列出所有的已打开的文档窗口。


5.11     帮助(Help):帮助用户系统地学习和掌握VB的使用方法及程序设计。


标题栏

属性窗口

立即窗口

代码窗口

工程资源管理器


二:环境设置:


在VBE中,针对不同的程序设计者,提供了一些设置功能来调整最适合用的用户的程序开发环境。使用“工具”菜单下的“选项”命令,出现各个选项卡供用根据自己的需要进行设置。考虑到篇幅的原因,仅介绍一些常用的设置。


1          “编辑器”选项卡:


在“选项”对话框中选择“编辑器”选项卡,显示内容见图。该选项卡指定代码窗口和工程窗口设置值,现对其中几项主要功能说明如下:


1.1         自动语法检查:


当用户输入完一条命令后按回车键时,VBE系统自动会对此行代码进行语法检查。如该项功能选中,当出现语法错误时,就会弹出一个警告信息窗口,见图。当取消该复选框,仅不出现警告信息窗口,而对于错误代码行将以红色显示。


1.2         要求变量声明


对于一个有良好习惯的程序设计员来说,应选中该复选框。选择该复选框后,对于新建的程序在模块文件的顶部自动加入“Option Explicit”的声明。当程序中使用未经声明的变量,尤其对已声明的变量名,而以后使用时键入变量名错的情况,使用” Option Explicit“的声明后,程序运行时会报错。


1.3         自动列出成员


选择此功能当用户在程序中输入控件名(对象)和句点后,系统自动列出该控件(对象)在该运行模式下可用的属性和方法。如图:


用户只要在列表框选中所需的内容即可,按空格键或用鼠标双击均可。


1.4         自动显示快速信息


选中此功能后,当程序输入时要调用到函数或者过程名时,系统自动列出该函数或者过程的参数信息,以提示用户正确地使用。如下图:


2          “通用”选项卡


在“选项”对话框选择“通用”选项卡,如下图。该选项卡为当前的Visual Basic工程指定设置值、错误处理以及编译设置值,有关功能简单说明如下:


2.1         “窗体网格设置”


此选项决定窗体网格的外观。其中:


显示网格:决定是否在设计时显示网格。默认是显示网格,在设计模可看到网格点均匀分布在窗体上。


宽度和高:调整网格的间距。


对齐控件到网格:自动将控件的外部边缘定位在网格线上。


2.2         显示工具提示


为工具栏和工具箱各项显示工具提示。


2.3         错误捕获:


决定在Visual Basic开发环境中怎样处理错误,并为后面所有的Visual Basic实例设置缺省的错误捕获状态。


2.4         编译:


决定如何编绎工程,一般全选中两个选项。


下一讲,我们将偿试如何录制宏和修改宏,以及代码窗口中各个部件的意义。

EMgzQmKl.zip (213.56 KB, 下载次数: 1062)


[此贴子已经被Kevin于2006-8-9 17:17:02编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-20 09:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
第二课:录制宏、编辑宏与优化宏

上一课中,我们初步认识了VBA是什么,怎么进入VBE编辑器,以及VBE的环境设置等。本课中,我们来录制宏、编辑宏与优化宏。

录制宏有两种方式,一是双击状态栏中的"录制"命令,或者鼠标单击工具\宏\录制新宏命令,WORD将记录下您的操作并转换为VB语言.

在XP以下版本中,录制宏操作不支持鼠标操作,您可以使用键盘操作,请结合键盘加速键、键盘快捷键等进行操作,此处不再解释加速键和快捷键的含义。另外,在XP版本中,对部分右键菜单不支持的情况下,可以使用SHIFT+F10进行调用右键快捷菜单等。

OK,我们选择上述方法之一,来录个一个宏,我们的操作是这样的,对全文档中的字体设置为:华文细黑,粗体,12号,行距1.5,段前12磅,段后12磅,录制结束,千万别忘了停止录制宏哟,点“停止”而非关闭“停止录制宏”工具栏,否则,要绕些小圈子了。

如图:

在上图的录制宏对话框中,我们可以自定义宏名,将宏提定到工具栏或者键盘上,保存宏的位置(作用范围),如果是“所有文档(Normal.dot)”,则它是全局的宏,可以为所有文档所调用,是公共的宏;如果是本文档,则是私有的,仅作用于当前文档。同理,如果我们指定在工具栏或者键盘中,如果是“所有文档(Normal.dot)”,则该工具栏作用于所有WORD文档,反之则仅作用于当前文档,其它文档中将不会出现此宏、工具栏或者键盘快捷键。

好,我们进入VBE,你可以使用ALT+F8,在宏位置中为当前文档,找到该宏名,点右侧的“编辑”命令,或者直接ALT+F11,找到该文档的工程资源管理器,双击“NewMacros"模块,则在右侧的代码窗口中,会看到以下代码,守柔把它注释一下(如果在VBE代码窗口中,我们将光标位于代码中或者选定某个关键字,按下F1,会出现详细的VBA帮助),以使大家更快地明白它的意思:

Sub OurExample() '这部分说明来自录制宏对话框 ' OurExample Macro ' 宏在 2005-7-20 由 I Love You_Word! 录制 ' "&chr(10)&"WORD-VBA专题讲座之二 ' Selection.WholeStory'全选文档,CTRL+A With Selection.Font '对选定文字 .NameFarEast = "华文细黑" '东亚字体 .NameAscii = "Tahoma" '设置拉丁文(字符代码从 0(零)到 127 的字符)所用的字体 .NameOther = "Tahoma" '设置字符代码从 128 到 255 的字符的字体 .Name = "华文细黑" '字体名称 .Size = 12 '字号 .Bold = True '粗体 .Italic = False '非斜体 .Underline = wdUnderlineNone '无下划线 .UnderlineColor = wdColorAutomatic '下划线颜色自动 .StrikeThrough = False '无删除线格式 .DoubleStrikeThrough = False '无双删除线格式 .Outline = False '无镂空格式 .Emboss = False '无阳文格式 .Shadow = False '无阴影格式 .Hidden = False '不隐藏文字 .SmallCaps = False '不小型大写字母 .AllCaps = False '不全部字母大写 .Color = wdColorAutomatic '自动字体颜色 .Engrave = False '不阴文 .Superscript = False '不上标 .Subscript = False '不下标 .Spacing = 0 '字符间距 .Scaling = 100 '不缩放 .Position = 0 '正常位置 .Kerning = 1 '最小字号 .Animation = wdAnimationNone '无动态效果 .DisableCharacterSpaceGrid = False '不忽略选定文本每行中的字符数 .EmphasisMark = wdEmphasisMarkNone '不设置着重号 End With With Selection.ParagraphFormat'对于选定内容的段落格式 .LeftIndent = CentimetersToPoints(0)'左缩进为0,即无 .RightIndent = CentimetersToPoints(0)'右缩进为0,即无 .SpaceBefore = 12'段前12磅 .SpaceBeforeAuto = False'不自动设置指定段落的段前间距 .SpaceAfter = 12'段后为12磅 .SpaceAfterAuto = False'不自动设置指定段落的段后间距 .LineSpacingRule = wdLineSpace1pt5'行距为1.5倍 .Alignment = wdAlignParagraphJustify'段落对齐方式,常规,两端对齐 .WidowControl = False'重新分页时段中的首行或末行有可能单独位于上页的页尾或下页的页首。 .KeepWithNext = False'文档重新分页时,指定段落与下一段可能位于下一页 .KeepTogether = False'Word 对文档重新分页时同一段中的各行可能不位于同一页上。 .PageBreakBefore = False'指定段落前不插入分页符 .NoLineNumber = False'不设置行号 .Hyphenation = True'段落进行自动断字 .FirstLineIndent = CentimetersToPoints(0)'首行缩进为0,即无首行缩进 .OutlineLevel = wdOutlineLevelBodyText'大纲级别为正文文本 .CharacterUnitLeftIndent = 0'段落的左缩进为0字符 .CharacterUnitRightIndent = 0'段落的右缩进为0字符 .CharacterUnitFirstLineIndent = 0'段落的首行缩进为0字符 .LineUnitBefore = 0'设置指定段落的段前间距(以网格线为单位),0 .LineUnitAfter = 0'设置指定段落的段后间距(以网格线为单位),0 .AutoAdjustRightIndent = True'指定的每行字符数,自动调整所选段落的右缩进。 .DisableLineHeightGrid = False'段落中的字符与行网格不进行对齐。 .FarEastLineBreakControl = True'应用东亚语言文字的换行规则 .WordWrap = True'西文单词中间断字换行 .HangingPunctuation = True'允许标点溢出边界 .HalfWidthPunctuationOnTopOfLine = False'行首标点符号不改为半角字符 .AddSpaceBetweenFarEastAndAlpha = True'中文文字和拉丁文字之间自动添加空格 .AddSpaceBetweenFarEastAndDigit = True'中文文字和数字之间添加空格 .BaseLineAlignment = wdBaselineAlignAuto'自动调整活动文档中的基线字体对齐方式 End With End Sub '----------------------

哇,简单地几步操作,这么多的代码(70多行),别急,您对比一下以下我们的操作:字体对话框和段落对话框,您就明白了:

在上面的代码中,有代码,有注释注释是良好程序员的一个重要标志,一个程序,需要必要的注释,不但对使用者,阅读者有利,对编程人员今后的代码维修升级也是十分必要的.注释有两种方式,一种使用撇号('),也可以使用关键字"Rem",通常使用前者,可以直接写在代码旁或者另起一行.

[此贴子已经被作者于2005-7-20 10:00:11编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-20 09:44 | 显示全部楼层

好家伙,WORD的宏记录把所有对话框中的信息都录上去了,这样子,尽管我们可以方便地使用它,总是感觉不太"纤美",太"铺张"了.

我们来试试看这个宏是否能达到我们的要求:

运行宏的方法:(常规)

1. 把文档恢复到录制宏前的状态,按下ALT+F8,找到活动文档中的这个"OurExample"宏,点击运行。

2. 使用ALT+F11,直接在VBE代码窗口中运行,将光标定位于活动文档的工程资源管理的代码窗口中,注意,光标位置处于此过程(一个宏,我们术语称之为过程,即将光标置于当前过程中,其过程名(宏名)也就是本例中所指的"OurExample")

如图:

按下快捷键F5或者使用VBE标准工具栏中的"运行子过程/窗体"命令,也可以使用运行菜单下的"运行子过程/窗体"命令.

看到了吧,这就是我们宏的作用,它可以代替我们以后的手动操作,如果经常使用某个操作(或者某几个操作组合的话),我们可以使用宏.

另外,从录制的宏代码来看,它分了三个部分,一是全选操作,一个是字体部分,另一个是段落部分(两个With ……End With结构),也就是说,宏是命令的组合。

您如果觉得看得懂守柔的注释和我们录制宏时的目的,那么,我们一起来修改一下:

Sub RevOurExample()

Selection.WholeStory

With Selection.Font

.Name = "华文细黑"

.Size = 12

.Bold = True

End With

With Selection.ParagraphFormat

.SpaceBefore = 12

.SpaceAfter = 12

.LineSpacingRule = wdLineSpace1pt5

End With

End Sub

试着运行一下这个宏,大家看到这个仅仅13行代码的宏,正是我们想要的结果。

看了上述守柔的讲述,和您试运行了"RevOurExample"宏后,您是不是开始对WORD的宏有感觉了?

下面,我浅谈一下(在以后的讲座中将会深入),上面的"RevOurExample"宏中,代码还不是最好的,为什么,因为,它仍然使用了SELECTION对象,而非RANGE对象,这里,我们可以使用以下代码,能高效地达到我们初始目的:" 对全文档中的字体设置为:华文细黑,粗体,12号,行距1.5,段前12磅,段后12磅",OK,来看一下,优化后的代码是怎么样的:

Sub Example() With ActiveDocument.Content With .Font .Name = "华文细黑" .Size = 12 .Bold = True End With With .ParagraphFormat .SpaceBefore = 12 .SpaceAfter = 12 .LineSpacingRule = wdLineSpace1pt5 End With End With End Sub

显然,代码行数基本没有变动,变动的只是对象,前者"RevOurExample"使用了selection对象,并且进行了全选操作,而在这个" Example"中,直接对全文档(RANGE对象)的字体和段落格式进行了设置.

在这个" Example"中,我们使用了三个"With ……End With"语句,我们来看一下,这个语句结构的特点:

1. With 语句可以对某个对象执行一系列的语句,而不用重复指出对象的名称。例如,要改变一个对象的多个属性,可以在 With 控制结构中加上属性的赋值语句,这时候只是引用对象一次而不是在每个属性赋值时都要引用它。

2. 注意 当程序一旦进入 With 块,object 就不能改变。因此不能用一个 With 语句来设置多个不同的对象。

3. 可以将一个 With 块放在另一个之中,而产生嵌套的 With 语句。但是,由于外层 With 块成员会在内层的 With 块中被屏蔽住,所以必须在内层的 With 块中,使用完整的对象引用来指出在外层的 With 块中的对象成员。

4. 重点 一般来说,建议您不要跳入或跳出 With 块。如果在 With 块中的语句被执行,但是 With 或 End With 语句并没有执行,则一个包含对该对象引用的临时变量将保留在内存中,直到您退出该过程。

[此贴子已经被作者于2005-9-17 5:37:30编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-20 09:45 | 显示全部楼层
代码窗口:

可以使用代码窗口来编写、显示以及编辑 Visual Basic 代码。打开各模块的代码窗口后,可以查看不同窗体或模块中的代码,并且在它们之间做复制以及粘贴的动作。

可以按照下列所述的方式,来打开代码窗口:

在工程窗口中,可以选择一个窗体或模块,然后右击选择“查看代码”按钮或者双击该窗体或模块。

在 “用户窗体”窗口中,可以双击控件或窗体;也可以从“视图”菜单中选择“代码窗口”,或者按下 F7 键。

窗口部件

“对象”框 如图所示的(通用)部分

显示所选对象的名称。可以按下列表框中的右边箭头,来显示此窗体中的对象。

“过程/事件”框 如图所示的(声明)部分

将“窗体”或“对象”框所含控件中,可以列出所有 Visual Basic 的事件。当选择了一个事件,则与事件名称相关的事件过程,就会显示在代码窗口中。

如果在对象框中显示的是“通用”,则过程框会列出所有声明,以及为此窗体所创建的常规过程。如果正在编辑模块中的代码,则过程框会列出所有模块中的常规过程。在上述两实例中,在过程框中所选的过程都会显示在代码窗口中。

模块中的所有过程会出现在一个单一滚动条的列表中,它们是按名称的字母来排列的。可以从代码窗口上端的下拉式列表中选取一个过程,此时指针会移到所选过程的第一行代码上面。

我们再来看一下代码窗口图中的通用声明部分,本示例中,我们写了三个通用声明:

Option Explicit

Public MyNumber As Integer

Dim MyRange As Range

第一句代码Option Explicit

1. 是强制显式声明本模块中的所有变量, 如果使用,Option Explicit 语句必须写在模块的所有过程之前。

2. 如果模块中使用了 Option Explicit,则必须使用 Dim、Private、Public、ReDim 或 Static 语句来显式声明所有的变量。如果使用了未声明的变量名在编译时间会出现错误。

3. 如果没有使用 Option Explicit 语句,除非使用 Deftype 语句指定了缺省类型,否则所有未声明的变量都是 Variant 类型的。

4. 注意 使用 Option Explicit 可以避免在键入已有变量时出错,在变量的范围不是很清楚的代码中使用该语句可以避免混乱。

5. 如果您是初学者,不提倡写此句代码或者在VB环境设置中不要勾选显式声明变量选项,因为大家对变量的定义还不理解.

第二句代码Public MyNumber As Integer

1. 在模块级别中使用,用于声明公用变量和分配存储空间.

2. Public 语句声明的变量在所有应用程序的所有没有使用 Option Private Module 的模块的任何过程中都是可用的,简单地理解就是经public声明的变量,在当前工程中是公用的.

3. MyNumbe 变量名

4. Integer 变量类型

第三句代码:Dim MyRange As Range

1. 通常会使用 Dim 语句来声明变量。一个声明语句可以放到过程中以创建属于过程的级别的变量。或在声明部分可将它放到模块顶部,以创建属于模块级别的变量。

2. 当dim语句如本例中所示时,它将MyRange变量声明为本模块中公用;当dim 语句的变量声明位于如sub ……End Sub中时,仅为该过程所有,过程运行结束,变量即在内存中消失。

再看一下我们的sub ……end sub 过程

Sub Example()

……

End Sub

1. sub 语句:声明子过程的名称,参数,以及构成其主体的代码。无论你如何理解,简单一句话,只要你想编程,简单的,就使用sub ……end sub,过程名尽可能不要与WORD命令、函数、关键字一致就行了(如果与WORD命令一致,就是修改 WORD命令了)。

2. 如果没有使用 Public、Private 或 Friend 显式指定,Sub 过程按缺省情况就是公用的。

3. 如果是private sub Example()……end sub ,那么,这个"Example"过程,表示只有在包含其声明的模块中的其它过程可以访问该 Sub 过程

接着,我们进入WORD DOCUMNT对象的三个重要事件:

注意,DOCUMENT对象仅隶属于THISDOCUMENT类模块中,也就是当前工程下的"THISDOCUMENT"模块,它是一个类模块.而我们通常录制宏时,WORD会自动新建一个模块,它是标准模块.

'关闭文档时将会触发此事件

Private Sub Document_Close()

End Sub

'新建文档时,将会触发此事件(通常用于模板中)

Private Sub Document_New()

End Sub

'打开文档时,将发触此事件

Private Sub Document_Open()

End Sub

OK,我们可以试着在代码窗口中粘贴以下代码:

Private Sub Document_Close()

MsgBox "这是一个关闭文档事件!"

End Sub

Private Sub Document_Open()

MsgBox "这是一个打开文档的事件"

End Sub

保存文件,关闭和打开这个文件,你看到了什么?

好了,这一讲,守柔就先说到这儿,您有什么问题和疑问,请随时与我交流!

下一讲,我们将讨论对象,属性,方法.

o2ZTb5pJ.zip (400.8 KB, 下载次数: 747)
[此贴子已经被作者于2005-7-20 10:05:08编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-20 09:48 | 显示全部楼层
第三课:对象属性与方法

VBA是面向对象的一个编程语言,您也许刚开始还不一定完全能理解对象是什么,属性又是什么,方法又是什么?不要急,且听守柔慢慢分解。

1. 什么是对象

对象是 Visual Basic 的结构基础,在 Visual Basic 中进行的所有操作几乎都与修改对象有关。Microsoft Word 的任何元素,如文档、表格、段落、书签、域等,都可用 Visual Basic 中的对象来表示。

对象代表应用程序中的元素,比如,工作表、单元格、图表、窗体,或是一份报告。在 Visual Basic 的代码中,可在使用对象的任一方法或改变它的属性之一的值之前,必须去识别对象。

2. 什么是属性

属性是对象的一种特性或该对象行为的一个方面。例如,文档属性包含其名称、内容、保存状态以及是否启用修订。若要更改一个对象的特征,可以修改其属性值。

若要设置属性的值,可在对象的后面紧接一个句号、属性名称、一个等号及新的属性值。

属性是一个对象的属性,它定义了对象的特征,诸如大小、颜色或屏幕位置,或某一方面的行为,诸如对象是否有激活或可见的。可以通过修改对象的属性值来改变对象的特性。

若要设置属性值,则在对象的引用后面加上一个复合句,它是由属性名加上等号 (=) 以及新的属性值所组成的。

3. 什么是方法

方法是对象可以执行的动作。例如,只要文档可以打印,Document 对象就具有 PrintOut 方法。方法通常带有参数,以限定执行动作的方式。

如果对象共享共同的方法,则可以操作整个对象集合。

4. 什么是集合

对象代表一个 Word 元素,如文档、段落、书签或单独的字符。集合也是一个对象,该对象包含多个其他对象,通常这些对象属于相同的类型;例如,一个集合对象中可包含文档中的所有书签对象。通过使用属性和方法,可以修改单独的的对象,也可修改整个的对象集合。

5. 什么是事件

事件是一个对象可以辨认的动作,像单击鼠标或按下某键等,并且可以写某些代码针对此述动作来做响应。用户做动作或程序代码的结果可能导致事件的发生,或是由系统引发。

好了,我们有了大致的对象(对象集合)属性、方法和事件后,我们来实际看一下,WORD VBA中的一些主要对象举例:

WORD(APPLICATION)对象

我们看到WORD的标题栏,显示的是WORD-VBA专题讲座(尝试篇)-Microsoft Word,我们可以修改一下,把它改为该文档的全路径和标题栏名称不用Microsoft Word,改成Blaster(冲击波)试试,唬唬自己?

粘贴以下代码到VBE代码窗口中:

'* +++++++++++++++++++++++++++++ '* Created By I Love You_Word!@ExcelHome 2005-7-25 5:52:10 '仅测试于System: Windows NT Word: 10.0 Language: 2052 '^The Code CopyIn [ThisDocument-ThisDocument]^' '* -----------------------------

Option Explicit Dim OldCaption As String Sub ReWorkCaption() Dim CurrentPath As String, NewTitle As String With Application '针对WORD的APPLICATION对象 '获得(返回)原来的活动窗口名称(文件名/默认) OldCaption = .ActiveWindow.Caption '定义一个string变量,为活动文档的全路径 CurrentPath = ActiveDocument.FullName '定义一个string变量,其值为"Blaster" NewTitle = "Blaster" '将文档窗口名改为全路径显示 .ActiveWindow.Caption = CurrentPath '将APPLICATION对象的Caption属性修改为新的名称 .Caption = NewTitle '显示您的NORMAL.DOT模板文件位置 MsgBox "您的WORD Normal.dot文件位于:" & """" & .NormalTemplate.Path & "\""" & "文件夹下." End With End Sub '---------------------- Sub RestoreCaption() '恢复原来 Application.Caption = Empty Application.ActiveWindow.Caption = OldCaption 'Application.Caption = "" End Sub '----------------------

结合上面的代码,和运行以后你的体会,我们分析一下,在上面的代码中,我们用到的Application对象的Caption属性,Application.Activewindow对象的Caption属性,Activedocument对象的Fullname属性,其中,Activedocument和Activewindow对象均隶属于Application对象,其中Activedocument对象是Global对象(是全局的,唯一的),因此,我们在写代码时,可以忽略,即Application.Activedocument=Activedocument,怎么理解这个全局对象呢,也就是说,在Application程序中,可能打开了N个文档,只能存在且只能有一个活动文档,而每个文档都拥有几个文档窗口(窗口/拆分),但每个文档也只能有一个活动文档窗口,也就是说活动文档只有一个,活动文档有活动文档窗口,非活动文档也有活动文档窗口.可能比较凹口,您习惯了,就明白了.

再粘贴以下代码于VBE的代码窗口中:

'* +++++++++++++++++++++++++++++ '* Created By I Love You_Word!@ExcelHome 2005-7-25 6:06:12 '仅测试于System: Windows NT Word: 10.0 Language: 2052 '^The Code CopyIn [ThisDocument-ThisDocument]^' '* -----------------------------

Sub SaveDoc() '另存为"Test.doc"文件 ActiveDocument.SaveAs FileName:="Test", fileformat:=wdFormatDocument 'ActiveDocument.SaveAs "Test.doc" End Sub '---------------------- Sub SaveAll() '保存全部文档 Documents.Save '关闭所有文档 Documents.Close End Sub '----------------------

在上面的代码中,我们注意到,Activedocument是对象,Saveas是方法,即将活动文档另存为,方法必须是对象的方法,是对象可执行的方法,关键还是对象,我们不能Activewindow.Saveas,就错了!在Svaedoc过程中,第四行代码与第三行代码结果一样,可能第三行代码有参数(Filename:="TEST",Fileformat:=Wdformatdocument)对于初学者更易理解一些,注意,参数后面是用:=分隔开的,参数与参数之间是用,分隔的,请注意,不要与属性或者赋值语法混淆,那是没有:只用=的.

在 Saveall过程中,Save(Close)方法,作用于Documents(Document对象的集合,也就是说,Document是Documents集合中的一个元素)

常用的对象集合还有段落(Paragraphs),域(Fields),节(Sections)等,而句(Sentences),字(Characters),词(Words)的元素则是Range对象.

讲义附件如下:

MePCRyoA.rar (157.08 KB, 下载次数: 787)
[此贴子已经被作者于2005-7-25 6:17:58编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-20 09:49 | 显示全部楼层
第四课:WORD中的Range对象

在操纵Word VBA,绝大多数是针对Word中的各视图中的文本进行的,正确掌握、理解和应用Word Range是Word Vba的重要一课,初学者甚至熟悉Excel的编程人员,往往对Word 中的Range对象手足无措,原因是不了解Word中Range对象的本质和意义。

1. Range 对象的定义:

该对象代表文档中的一个连续范围。每一个 Range 对象由一起始和一终止字符位置定义。和文档中书签的使用方法类似,Visual Basic 使用 Range 对象识别文档的指定部分。但和书签不同,Range 对象只在定义该对象的过程正在运行时才存在。

Range 对象和所选内容相互独立。也就是说,可定义和复制一个范围而不需改变所选内容。还可在文档中定义多个范围,但每一个窗格中只能有一个所选内容。

透彻的理解,只要是以文本形式存在的区域,就有Range对象,无论是页眉页脚中,批注脚注中,还是图形的文本框中,无论是一个光标,一个字符、一个词、一个句子、一个段落、一节还是一个文档,都可以看成是一个Range对象。

2. 对比Range对象

如果同EXCEL中的Range对象对比,你也许会更容易理解一些。

Excel中,每个单元格,是一个Range对象,连续或者非连续的单元格,都可以组成一个Range对象,它由单元格地址组成的;在Word中,每个字符是一个“单元格”,它是由每个字符(无论是否可见,如段落标记等)构成了一个文档的Range对象,尽管它存活在运行时间中,也就是凡是由字符组成的具有起点和终点位置的连续文本,哪怕起点等于终点(光标)或者终点是起点位置的下一个字符,都是一个Range对象。

而Word中的Selection对象可以理解成EXCEL中的ActiveCell对象。

3. StoryRanges对象:

StoryRanges由 Range 对象组成的集合,该集合代表文档中的文字部分。可使用 StoryRanges(index) 返回单个部分(作为一个 Range 对象),其中 index 为一个 wdStoryType 常量。

Start、End和StoryType属性唯一地确定了一个Range对象。Start和End属性分别返回或者设置Range对象的起始和结束字符的位置。每个文档构成部分起始处的字符位置是0 (zero),而第一个字符之后的位置是1,依此类推。StoryType 属性的WdStoryType常量可以表示十一种不同的文档构成部分类型,如下:

wdCommentsStory

wdEndnotesStory

wdEvenPagesFooterStory

wdEvenPagesHeaderStory

wdFirstPageFooterStory

wdFirstPageHeaderStory

wdFootnotesStory

wdMainTextStory

wdPrimaryFooterStory

wdPrimaryHeaderStory

wdTextFrameStory

[此贴子已经被作者于2005-9-13 6:54:09编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-20 09:49 | 显示全部楼层
(3) 在句子中循环

以下示例罗列出所选文本中的句子数量和结尾的标点符号。

Sub Example()

Dim i As Range, SenCount As Integer, MyString As String, EndChar As String

With Selection

If .Type = wdSelectionIP Then Exit Sub

SenCount = .Sentences.Count '取得所选内容的句子数

For Each i In .Sentences '在句子中循环

'如果句子中的最后一个字符为段落标记则EndChar为段落标记的前一个字符

If i.Characters(i.Characters.Count) = Chr(13) Then

EndChar = i.Characters(i.Characters.Count - 1)

Else

EndChar = i.Characters(i.Characters.Count)

End If

'以英文分号为分隔符,将结束标点在变量中累加

MyString = MyString & ";" & EndChar

Next

'去除最后一个";"

MyString = Right(MyString, Len(MyString) - 1)

End With

MsgBox "所选内容的句子数:" & SenCount & vbCrLf & "它们的结束标点分别为:" & MyString

End Sub

(4) 在段落中循环

以下示例将本文档中的空白段落删除,并提示删除的空白段落数量。

Sub Example()

Dim Par As Paragraph, ParRange As Range, BlankCount As Integer

Application.ScreenUpdating = False

For Each Par In Me.Paragraphs

Set ParRange = Par.Range

If Len(ParRange) = 1 Then ParRange.Delete: BlankCount = BlankCount + 1

Next

Application.ScreenUpdating = True

MsgBox "Word共为您删除了" & BlankCount & "个空白段落!", vbInformation

End Sub

(5) 表格中的Range对象

以下示例将活动文档表格1中的空白单元格填充0值。

Sub Sample()

Dim myTable As Table, oCell As Cell

Set myTable = ActiveDocument.Tables(1)

For Each oCell In myTable.Range.Cells

If oCell.Range.End - oCell.Range.Start = 1 Then oCell.Range = 0

Next

End Sub

以下示例在表格的起始位置插入表格各单元格中的文本,然后删除表格。

Sub Sample()

Dim myTable As Table, myRange As Range, CellsString As String

With ActiveDocument

Set myTable = .Tables(1)

Set myRange = .Range(myTable.Range.Start, myTable.Range.Start)

CellsString = myTable.Range.Text

myTable.Delete

myRange.InsertAfter CellsString

End With

End Sub

(6) 节中的Range对象

以下示例中统计每节的字符数(含所有可见与不可见字符),以及显示本节的结束位置。

Dim i As Section, MyRange As Range

For Each i In ThisDocument.Sections

Set MyRange = ThisDocument.Range(i.Range.End - 1, i.Range.End - 1)

MsgBox "第" & i.Index & "字符总符为:" & MyRange.End & vbCrLf & "该节结束标记位于第" & MyRange.Information(wdActiveEndPageNumber) & "页中."

Next

(7) Find与Replacement中的Range 对象

以下示例在文档中向下搜索(向尾部)“狐狸”,并在其上方标注上标字体的编号。

Sub Sample()

Dim MyRange As Range, FindCount As Integer

Application.ScreenUpdating = False

'定义一个Range对象

GN: With ActiveDocument

If Not MyRange Is Nothing Then

Set MyRange = .Range(MyRange.End, .Content.End)

Else

Set MyRange = ActiveDocument.Content

End If

End With

With MyRange.Find '查找

.ClearFormatting '清除查找格式

.Forward = True '向下搜索

.Text = "狐狸" '搜索文本

Do While .Execute '如果能查找到

FindCount = FindCount + 1 '计数

MyRange.InsertAfter FindCount '在查找到的文本区域后插入数字

'将此数字变为上标格式

MyRange.Words(MyRange.Words.Count).Font.Superscript = True

GoTo GN'转到指定的行标签处

Loop

End With

Application.ScreenUpdating = True

End Sub

[此贴子已经被作者于2005-9-13 6:57:37编辑过]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-20 09:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
(8) 书签中的Range对象

以下示例将活动文档中的书签对应的文本区域设置字体格式

Dim oBmk As Bookmark

For Each oBmk In ActiveDocument.Bookmarks

With oBmk.Range.Font

.Bold = True

.Name = "宋体"

.Size = 14

.Color = wdColorRed

End With

Next

(9) 修订中的Range对象

以下示例显示活动文档中第一个修订对象的位置

Dim StartRange As Range, EndRange As Range, MyRange As Range

Set MyRange = ActiveDocument.Revisions(1).Range

With MyRange

If ActiveDocument.Revisions(1).Type = wdRevisionDelete Then

Set StartRange = ActiveDocument.Range(.Start, .Start)

Set EndRange = ActiveDocument.Range(.End + .Start - 2, .End + .Start - 2)

MsgBox "您第一个修订区域的起始页码为" & StartRange.Information(wdActiveEndPageNumber) & vbCrLf _

& "您第一个修订区域的起始行号为" & StartRange.Information(wdFirstCharacterLineNumber) & vbCrLf _

& "您第一个修订区域的起始列数为" & StartRange.Information(wdFirstCharacterColumnNumber) & vbCrLf _

& "您第一个修订区域的结束页码为" & EndRange.Information(wdActiveEndPageNumber) & vbCrLf _

& "您第一个修订区域的结束行号为" & EndRange.Information(wdFirstCharacterLineNumber) & vbCrLf _

& "您第一个修订区域的结束列数为" & EndRange.Information(wdFirstCharacterColumnNumber), vbInformation

End If

End With

(10) 页眉页脚中的Range对象

Sub Example()

Dim myRange As Range

'定义一个Range对象,为活动文档第一节的页脚

Set myRange = ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary).Range

With myRange

'它将覆盖原有文本内容

.Text = "Good Good Study ,Day Day Up!"

'居右

.ParagraphFormat.Alignment = wdAlignParagraphRight

.Font.Name = "Tahoma"

.Font.ColorIndex = wdBlue

End With

End Sub

(11) 自选图形中的Range对象

以下示例修改活动文档中第一个文本框中第三段落中的指定字符:

Dim MyRange As Range, TabPostion As Integer

'定义一个Range对象,注意这是一个文本框区域的Range对象,而非DOCUMENT下的正文文字部分的Range对象

Set MyRange = ActiveDocument.StoryRanges(wdTextFrameStory).Paragraphs(3).Range

'取得制表位的位置

TabPostion = VBA.InStr(MyRange, vbTab)

'重新定义该RANGE对象的起始位置和结束位置,由于要改写两个地方,因此,可以重后面先改写,这样TAB的位置不需重新计算

MyRange.SetRange MyRange.Start + TabPostion + 2, MyRange.End - 1

'改写文本内容

MyRange.Text = "001"

'再次定义MyRange对象(恢复)

Set MyRange = ActiveDocument.StoryRanges(wdTextFrameStory).Paragraphs(3).Range

'重新定义

MyRange.SetRange MyRange.Start + 4, MyRange.Start + TabPostion - 1

'改写文本内容

MyRange.Text = "Microsoft Word 10.0"

(12) Shapes中的Range方法

本示例逢单选定图形

Option Explicit

Option Base 1 '下标为1

Sub Example()

Dim i As Integer, ShapesCount As Integer, myArray() As Variant

With ActiveDocument

ShapesCount = .Shapes.Count '自选图形总数

'声明一个动态一维数组

ReDim myArray(Int((ShapesCount + 1) / 2))

For i = 1 To ShapesCount Step 2

myArray((i + 1) / 2) = i '分配数组

Next

.Shapes.Range(myArray()).Select '选定图形

End With

End Sub

[此贴子已经被作者于2005-9-13 6:58:37编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-20 09:50 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-20 09:51 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 07:50 , Processed in 0.047158 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表