分享

Word VBA 学习交流(二)

 shuaixinerwei 2012-02-24

Word VBA 学习交流(二)  

2008-01-08 20:58:55|  分类: Office办公软件 |字号 订阅

 

 

Word VBA 学习交流

一、通过录制宏生成代码

如果无法确定要使用的 Visual Basic 方法或属性,可打开宏录制器并进行手动操作。宏录制器会将操作译成 Visual Basic 代码。录制操作完成后,可根据需要修改代码。例如,如果无法确定实现段落缩进的属性或方法,可执行下列操作:

  1. 在“工具”菜单上,指向“宏”,然后单击“录制新宏”。
  2. 如果需要,可更改默认的宏名称,然后单击“确定”启动录制器。
  3. 在“格式”菜单上,选定“段落”。
  4. 更改段落左缩进的值,然后单击“确定”。
  5. 单击“停止录制”工具栏上的“停止录制”按钮。
  6. 在“工具”菜单上,指向“宏”,然后单击“宏”。
  7. 从步骤 2 中选择宏的名称,然后单击“编辑”按钮。

查看 Visual Basic 代码来确定对应于段落左缩进的属性(LeftIndent 属性)。将插入点置于 LeftIndent 之中,并按 F1 或单击“帮助”按钮。在帮助主题中,可以查看示例以及支持 LeftIndent 属性的对象(单击“应用于”)。

(从上面可以看出,录制宏是我们认识未知对象的很好方法之一,同时,也知道我为什么要大家装“金山词霸”的原因!如果你这个单词不认识,你怎么知道他是“左缩进”?当然,也有方法:就是把这个值设为一个比较特殊的值,再打特殊值所对应的属性)

说明

录制的宏使用 Selection 属性返回 Selection 对象。例如,下列指令将所选段落缩进 0.5 英寸。

Sub IndentParagraph()

    Selection.ParagraphFormat.LeftIndent = InchesToPoints(0.5)

End Sub

您也可以修改录制的宏并与 Range 对象一起使用。

(我们在日常的使用中经常注意到:在使用“本机上的模板”是的向导就大量使用了Selection对象,而不是Range对象!难道说微软有更新层次的考虑?我想可能是Selection对象更稳定,跨版本能力更强吧!)

二、修改录制的 Visual Basic 宏

宏录制器是查找所需的 Visual Basic 方法和属性的非常方便的工具。如果不知道使用何种属性或方法,可打开宏录制器,手动执行操作。宏录制器会将操作译为 Visual Basic 代码。但录制宏具有一些限制条件。您不能录制下列内容:

条件分支

变量指定

循环结构

自定义用户窗体

出错处理

用鼠标选定的文字(必须使用组合键)

若要增强宏的功能,可能需要修改录制到模块中的代码。

删除 Selection 属性

使用宏录制器创建的宏取决于所选内容。在大多数录制的宏指令的开头,可以看到“Selection”。录制的宏使用 Selection 属性返回 Selection 对象。

例如,下列示例将所选内容移动至 Temp 书签,并在书签之后插入文字。

Sub Macro1()

    Selection.Goto What:=wdGotoBookmark, Name:="Temp"

    Selection.MoveRight Unit:=wdCharacter, Count:=1

    '相当于选中后按一个键盘的右方向键

    Selection.TypeText Text:="New text"

End Sub

这个宏虽然可以完成任务,但是有一些缺点。首先,如果文档中没有一个名为 Temp 的书签,该宏将导致出错。其次,该宏可能不正确地移动所选内容。修改这个宏,使其不再使用 Selection 对象,就可解决上述两个问题。以下就是经修改后的宏:

Sub MyMacro()

If ActiveDocument.Bookmarks.Exists("Temp") = True Then

    endloc = ActiveDocument.Bookmarks("Temp").End

    ActiveDocument.Range(Start:=endloc, _

        End:=endloc).InsertAfter "New text"

'_ 就是续行的意思

End If

End Sub

Exists 方法用于检查是否存在名为 Temp 的书签。如果找到该书签,则用 End 属性返回该书签结束字符的位置。最后使用 Range 方法返回一个引用书签结束位置的 Range 对象,以使用 InsertAfter 方法插入文字。有关定义 Range 对象的详细信息,请参阅处理 Range 对象。

使用 With…End With

可使用 With…End With 结构简化引用相同对象的宏指令。例如,在文档顶部添加标题时,将录制下面的宏。

Sub Macro1()

    Selection.HomeKey Unit:=wdStory

    Selection.TypeText Text:="Title"

    Selection.ParagraphAlignment.Alignment = wdAlignParagraphCenter

End Sub

每个指令都使用 Selection 属性返回一个 Selection 对象。可以简化这个宏,这样只需使用一次 Selection 属性。

Sub MyMacro()

    With Selection

        .HomeKey Unit:=wdStory

        .TypeText Text:="Title"

        '.ParagraphAlignment.Alignment = wdAlignParagraphCenter

        '上面那句是原帮助中的,但肯定是笔误!微软没看出?!

        .ParagraphFormat.Alignment = wdAlignParagraphCenter

    End With

End Sub

不使用 Selection 对象也可以完成相同的任务。下面的宏在活动文档的开头使用 Range 对象来完成相同的任务。

Sub MyMacro()

    With ActiveDocument.Range(Start:=0, End:=0)

        .InsertAfter "Title"

       '.ParagraphAlignment.Alignment = wdAlignParagraphCenter

       '上面那句是原帮助中的,但肯定是笔误!微软没看出?!

        .ParagraphFormat.Alignment = wdAlignParagraphCenter

    End With

End Sub

删除不必要的属性

如果录制了一个关于在对话框中选择选项的宏,即使只更改一个或两个选项,宏录制器也会记录该对话框中的所有选项的设置。如果不希望更改所有的选项,可从录制的宏中删除不必要的属性。下面录制的宏包含“段落”对话框的一些选项(单击“格式”菜单可显示该对话框的所有信息)。

Sub Macro1()

    With Selection.ParagraphFormat

        .LeftIndent = InchesToPoints(0)   '左缩进0英寸

        .RightIndent = InchesToPoints(0)  '右缩进0英寸

        .SpaceBefore = 6  '段前距6磅

        .SpaceAfter = 6  '段后距6磅,下面不写了!

        .LineSpacingRule = 0

        .Alignment = wdAlignParagraphLeft

        .WidowControl = True

        .KeepWithNext = False

        .KeepTogether = False

        .PageBreakBefore = False

        .NoLineNumber = False

        .Hyphenation = True

        .FirstLineIndent = InchesToPoints(0)

        .OutlineLevel = 10

    End With

End Sub

但是,如果只需更改段前和段后间距,可将宏更改为:

Sub MyMacro()

    With Selection.ParagraphFormat

        .SpaceBefore = 6

        .SpaceAfter = 6

    End With

End Sub

因为只设置了较少的属性,所以简化后的宏运行得更快。运行结果只更改选定段落的段前和段后的间距,所有其他设置都没有改变。(注意:如果你是一个喜欢乱动的人,还是要上面吧,但他的速度肯定没有下面的快,但他的适合环境更大.更所谓"忠""孝"难两全啊^-^)

删除不必要的参数

当宏录制器记录一个方法时,会包含所有参数的值。打开名为 Test.doc 的文档时,录制了下面的宏。所得到的宏包含 Open 方法的所有参数。

Sub Macro1()

    Documents.Open FileName:="C:\My Documents\Test.doc", _

        ConfirmConversions:= False, ReadOnly:=False, _

        AddToRecentFiles:=False, PasswordDocument:="", _

        PasswordTemplate:="", Revert:=False, _

        WritePasswordDocument:="", _

        WritePasswordTemplate:="", Format:=wdOpenFormatAuto

End Sub

可以从录制的宏中删除不需要的参数。例如,可以删除所有设置为空字符串的参数(如 WritePasswordDocument:=""),如下所示。

Sub MyMacro()

    Documents.Open FileName:="C:\My Documents\Test.doc", _

        ConfirmConversions:= False, _

        ReadOnly:=False, AddToRecentFiles:=False, _

        Revert:=False, Format:=wdOpenFormatAuto

End Sub

三、自动运行的宏

通过为一个宏赋予某个特殊的名称,就可在执行某项操作(例如启动 Word 或打开文档)时自动运行宏。Word 将下列名称识别为自动宏,或称“auto”宏。

宏名

运行条件

AutoExec

启动 Word 或加载全局模板时

AutoNew

每次新建文档时

AutoOpen

每次打开已有文档时

AutoClose

每次关闭文档时

AutoExit

退出 Word 或卸载全局模板时

当以下条件之一为真时,将识别代码模块中的自动宏。

  • 模块在自动宏(如 AutoExec)之后命名,并且包含一个名为“Main”的过程。
  • 任何模块中的过程在自动宏之后命名。

与其他宏一样,自动宏也可以保存于 Normal 模板、其他模板或文档中。要让自动宏运行,它必须位于活动文档的 Normal 模板中,或活动文档选用的模板中。

唯一例外的是 AutoExec 宏,它只有存储于以下位置时才可自动运行:Normal 模板、通过“模板和加载项”对话框全局加载的模板、或由“Startup”文件夹指定的文件夹中的全局模板。

在命名冲突的情况下(多个自动宏名相同),Word 将运行上下文中最近的自动宏。例如,如果同时在文档及其附加的模板中创建了 AutoClose 宏,则仅执行文档中的自动宏。如果在 Normal 模板中创建了 AutoNew 宏,只有当文档或其附加模板中没有名为 AutoNew 的宏时,该自动宏才能运行。(笔者注:简称"就近原则"!)

注释  按住 Shift 可以终止自动宏的运行。例如,基于包含 AutoNew 宏的模板新建文档时,按住 Shift 可终止 AutoNew 宏的运行。方法是:按住 Shift,单击(“文件”菜单)“新建”对话框中的“确定”按钮,并在显示新文档前持续按住 Shift。如果运行一个宏时有可能触发自动宏,(这种情况,我没遇过!)可用下列指令终止自动宏的运行:

WordBasic.DisableAutoMacros

四、修改 Word 命令

大多数 Word 命令都可通过转换为宏的方式对其进行修改。例如,可修改“文件”菜单上的“打开”命令,使其不再显示 Word 文档文件列表(扩展名为 .doc 的文件),而显示当前文件夹中的所有文件。

若要在“宏”对话框中显示内置 Word 命令列表,可在“宏的位置”框中选定“Word 命令”。显示的命令列表中包含所有的菜单命令、工具栏命令或快捷键命令。菜单命令名称以相关的菜单名称开头。例如,“文件”菜单中的“保存”命令显示为“FileSave”。

方法是工具/宏/宏

通过将一个宏命名为与 Word 命令相同的名称,就可用宏替代 Word 命令。例如,如果创建一个名为“FileSave”的宏,当选择“文件”菜单上的“保存”命令、单击“保存”工具栏按钮,或按“保存文件”快捷键时,Word 将运行该宏。

本示例介绍了修改 FileSave 命令的步骤。

  1. 在“工具”菜单上,指向“宏”,然后单击“宏”。
  2. 在“宏的位置”框中,选择“Word 命令”。
  3. 在“宏名”框中,选择“FileSave”。
  4. 在“宏的位置”框中选择一个模板或文档以保存该宏。例如,选择 Normal.dot(全局模板)可生成一个共用宏(即修改所有文档的“FileSave”命令)。
  5. 单击“创建”按钮。

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 命令。

五、将文本插入文档

使用 InsertAfter 或 InsertBefore 方法在 Selection 或 Range 对象之前或之后插入文字。下列示例在活动文档的末尾插入文字。

Sub InsertTextAtEndOfDocument()

    ActiveDocument.Content.InsertAfter Text:=" The end."

End Sub

下列示例在所选内容之前插入文字。

Sub AddTextBeforeSelection()

    Selection.InsertBefore Text:="new text "

End Sub

Range 对象或 Selection 对象在使用了 InsertBefore 或 InsertAfter 方法之后,会扩展并包含新的文本。使用 Collapse 方法可以将 Selection 或 Range 折叠到开始或结束位置。

六、选定文档中的文本

可使用 Select 方法选定文档中的对象。Select 方法可用于多种对象,例如 Bookmark、Field、Range 和 Table 对象。下列示例选定活动文档中的第一个表格。

Sub SelectTable()

    ActiveDocument.Tables(1).Select

End Sub

下列示例选定活动文档中的第一个域。

Sub SelectField()

    ActiveDocument.Fields(1).Select

End Sub

下列示例选定活动文档中的前四个段落。Range 方法用于创建一个引用前四个段落的 Range 对象,然后将 Select 方法应用于 Range 对象。

Sub SelectRange()

    Dim rngParagraphs As Range

    Set rngParagraphs = ActiveDocument.Range( _

        Start:=ActiveDocument.Paragraphs(1).Range.Start, _

        End:=ActiveDocument.Paragraphs(4).Range.End)

    rngParagraphs.Select

End Sub

'

选定文档中的文本:我觉得用处不大,原因就是为什么要选中呢?能操作就直接操作,不能的话,就选中吧(他可以说是没办法的办法).

七、编辑文字

本主题包含与下列任务相关的 Visual Basic 示例:

  • 确定文本是否被选定
  • 折叠选定内容或区域
  • 扩展选定内容或区域
  • 重新定义 Range 对象
  • 更改文本

有关其他编辑任务的信息和示例,请参阅下列主题:

从文档返回文本

选定文档中的文本

将文本插入文档

修改文档的某一部分

http://club./dispbbs.asp?boardID=23&ID=153805&page=1

摘题目:

怎样用宏统计word文件中某一个汉字,例如“的”字出现的数量?

(可以这样:新建一个文档,输入“=rand(50,50)”,再按回车(不包括双引号“”),则产生了虚拟文本,在此虚拟文本中试验)

方法有三:

Sub getfoundcount1()

    Dim a As Range, i%

    Dim c, d

   

    c = Timer   '设C为运行前的时间

    For Each a In ActiveDocument.Characters   '在字符间循环

        If a Like "的" Then    '如果是“的”

             i = i + 1   '则加上,i的初始值是0,不用设的,默认

         End If

    Next

    d = Timer – c   '用现在的时间减去运行前的时间等于用时

   

    MsgBox "Word 找到" & i & "个与此条件相匹配的项!", vbInformation, d

End Sub

'上面此法利用循环比较字符是否是的是“的”字,来判断!用时下面的图形的标题栏

图表 1

Sub GetFoundCount2()

    Dim FoundCount As Integer, myFindText As String

    Dim a, b

    a = Timer

    myFindText = "的"

    With ActiveDocument.Content.Find

        .Text = myFindText   '要查找的字符

        .MatchWildcards = False    '通配符为不勾选

        .Wrap = wdFindStop   '当查找到后停止,就是每次缩小范围

        Do While .Execute    '当查找时则累加

            FoundCount = FoundCount + 1

        Loop

    End With

    b = Timer - a

    Debug.Print b

    Debug.Print FoundCount

    MsgBox "Word 找到" & FoundCount & "个与此条件相匹配的项!", vbInformation, b

End Sub

'上面是标准的用查找来判断累加,(也是老大的代码)

图表 2

Sub getfoundcount3()

Dim a, b, c, d, e, f

    d = Timer

    a = ActiveDocument.Range.Text

    f = VBA.Asc("的")  '取得“的”的Ascii码

    b = Split(a, Chr(f))   '用此Ascii码来分裂

    c = UBound(b)   '取得上限

    e = Timer – d   '取得时间

    Debug.Print e   '这个是输出到调试区的

    Debug.Print c   '这个也是

    MsgBox "Word 找到" & c & "个与此条件相匹配的项!", vbInformation, e

End Sub

'上面是利用数组,把“的”看成是用于split数组的字符,通过是判断数组的上限来判断是几位数组,即是几个“的”。

图表 3

Sub GetFoundCount4()

    Dim strText As String, myText As String

    Dim lngOld As Long, lngNew As Long

    Dim Times As Single

    Times = VBA.Timer

    strText = ActiveDocument.Content.Text

    myText = "的"

    lngOld = Len(strText)  '包括“的”的长度

    lngNew = Len(Replace(strText, myText, ""))  '替换“的”后的长度

    MsgBox "Word 找到" & lngOld - lngNew & "个与此条件相匹配的项!", vbInformation, VBA.Timer - Times

End Sub

图表 4

       (上面是老大又写了一个,老大随后的代码的运行速度更是十分惊人)

 

两种方法运行最高。

一个是0.1秒与一个是6秒,效率是可想而知!大家试试!

十、从文档返回文本

使用 Text 属性可以返回 Range 或 Selection 对象中的文本。下列示例选定下一个格式设为“标题 1”样式的段落。然后通过 MsgBox 函数显示 Text 属性的内容。

Sub FindHeadingStyle()

    With Selection.Find

        .ClearFormatting

        .Style = wdStyleHeading1

        .Execute FindText:="", Format:=True, _

            Forward:=True, Wrap:=wdFindStop

        If .Found = True Then MsgBox Selection.Text

    End With

End Sub

下列指令返回并显示选定的文本。

Sub ShowSelection()

    Dim strText As String

    strText = Selection.Text

    MsgBox strText

End Sub

下列示例返回活动文档中的第一个单词。Words 集合中的每一项是代表一个单词的 Range 对象。

Sub ShowFirstWord()

    Dim strFirstWord As String

    strFirstWord = ActiveDocument.Words(1).Text

    MsgBox strFirstWord

End Sub

下列示例返回与活动文档中第一个书签相关联的文本。

Sub ShowFirstBookmark()

    Dim strBookmark As String

    If ActiveDocument.Bookmarks.Count > 0 Then

        strBookmark = ActiveDocument.Bookmarks(1).Range.Text

        MsgBox strBookmark

    End If

End Sub

 

InputBox 函数

在一对话框来中显示提示,等待用户输入正文或按下按钮,并返回包含文本框内容的 String。

语法

InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])

InputBox 函数的语法具有以下几个命名参数:

部分

描述

Prompt

必需的。作为对话框消息出现的字符串表达式。prompt 的最大长度大约是 1024 个字符,由所用字符的宽度决定。如果 prompt 包含多个行,则可在各行之间用回车符 (Chr(13))、换行符 (Chr(10)) 或回车换行符的组合 (Chr(13) & Chr(10)) 来分隔。

Title

可选的。显示对话框标题栏中的字符串表达式。如果省略 title,则把应用程序名放入标题栏中。

Default

可选的。显示文本框中的字符串表达式,在没有其它输入时作为缺省值。如果省略 default则文本框为空。

Xpos

可选的。数值表达式,成对出现,指定对话框的左边与屏幕左边的水平距离。如果省略 xpos,则对话框会在水平方向居中。

Ypos

可选的。数值表达式,成对出现,指定对话框的上边与屏幕上边的距离。如果省略 ypos,则对话框被放置在屏幕垂直方向距下边大约三分之一的位置。

Helpfile

可选的。字符串表达式,识别帮助文件,用该文件为对话框提供上下文相关的帮助。如果已提供 helpfile,则也必须提供 context

Context

可选的。数值表达式,由帮助文件的作者指定给某个帮助主题的帮助上下文编号。如果已提供 context,则也必须要提供 helpfile

 

说明:如果同时提供了 helpfilecontext,用户可以按 F1 (Windows) or HELP (Macintosh) 来查看与 context 相应的帮助主题。某些主应用程序,例如,Microsoft Excel,会在对话框中自动添加一个 Help 按钮。如果用户单击 OK 或按下ENTER ,则 InputBox 函数返回文本框中的内容。如果用户单击 Cancel,则此函数返回一个长度为零的字符串 ("")。

注意 如果还要指定第一个命名参数以外的参数,则必须在表达式中使用 InputBox。如果要省略某些位置参数,则必须加入相应的逗号分界符。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多