office aiexcel

搜索
猜你喜欢
查看: 3463|回复: 1

Word VBA 学习

[复制链接]
发表于 2014-7-22 00:13:30 | 显示全部楼层 |阅读模式
Range 对象赋给变量

有多种方法将现有的 Range 对象赋给变量。本主题对两种不同的方法进行了阐述。在下列示例中,将 Range 对象赋给变量 Range1 和 Range2。

例如,下列指令(通俗的话就是:下列语句)将活动文档中的第一个和第二个单词赋给变量 Range1和 Range2。

Set Range1 = ActiveDocument.Words(1)

Set Range2 = ActiveDocument.Words(2)

'注意:

1.    Words对象是Range对象,它不存在Word对象,你可以这样命名:dim word1 as range,,但是dim word1 as word是不行的,也是错的。

2.    Words直观的说就是单词,那么,什么是单词呢?中文中没有单词的概念啊!可以这样来理解,英文的单词是以空格分隔的,所以单词就是二个空格之间的字母加空格。(实验证明,确实是这样的)不过,这与我们的关系不大(因为我们大多处理的是中文)。那么中文的“Word”是怎么回事呢?是词组?还是每个汉字呢?其实我也不知道,我是这样来做的,在VBA中输入如下的程序:

Sub 中文Word()

Dim range1 As Range

    Set range1 = ActiveDocument.Words(1)

    range1.select

    MsgBox range1

End Sub

再新建一个Word,输入这样的的汉字“[ a 彼岸赋好 彼岸变量”(不包括红色的双引号),按F8分别测试Words(1)、Words(2)、Words(3)、Words(4)、Words(5)、Words(6)等,发现什么没有。我发现了如下的规律:①标点符号在中文中算是一个Word单位;②字母或者单词后面的空格不算一个Word单位,再英文如果没有结标记则包括后面的空格(例如:"a the as.",则第一个是a ,(注意后面有空格),当然最后的.不包括在前一个as内。所以,以上总共有4个Words,你可以用这个来测试。ActiveDocument.Words(1).Select,ActiveDocument.Words.count);③除此以外,只有汉字与汉字之间的空格算一个Word单词;④有的Word是一个汉字,有的是二个汉字,可能有的还是三个汉字,这是为什么呢?我们打开微软的输入法,再用“彼岸”及“变量”的拼音输入,可以看到这是一个词组(如下图) 所以我想,有的一个是汉字,有的二个是汉字,他“可能”是根据微软的输入法中的词组定义相一致的。⑤当然,你也可以看看Words集合来看一下这个对象。当然,可能没我说的简单、易懂。当然words对象的不确定性,决定了他使用的频率。如果你看懂我的上面所说,对于words对象基本就OK了。

'注意range对象的赋值就是这样set a=b ,变量的赋值就是a=1,但对象就必须这样赋值!(包括任意的对象,Set是对对象赋值的标准语句)

将一个 Range 对象变量设置为等于另一个 Range 对象变量

下列指令(语句)将名为 Range2 的区域变量设为与 Range1 代表的位置相同。

Set Range2 = Range1   '译为:设置Range2对象与 Range1 代表的位置相同

现在两个变量代表同一区域。修改 Range2 的起点、终点或其中的文本将影响 Range1,反之亦然。

请注意,以下指令等价于 Range2.Text = Range1.Text。该指令指定 Range2 的默认属性(Text 属性)为 Range1 的默认属性。但该指令并不修改其实际引用的对象。

Range2 = Range1

Range2 和 Range1 区域具有相同的内容,但它们可能对应文档中的不同位置,甚至对应不同的文档。

'上面这句有点难懂,用程序来说明吧(以后大多是这样,因为我们是学习VBA,只有通过程序来说明内容)

Sub 测试Range1等于Range2()

Dim range1 As Range, range2 As Range

    Set range1 = ActiveDocument.Range(0, 1)   '文档的第一个区域(字)

    Set range2 = ActiveDocument.Range(1, 2)   '文档的第二个区域(字)

    MsgBox range1   '输出第一个字

    MsgBox range2   '输出第二个字

    range2 = range1  '把第一个(字)的区域的字赋值给第二个区域

    MsgBox range2  '输出第二个区域(字)

    '为什么我把字后面加括号,因为我们设置的是区域,就是范围小了点的区域,

    '就一个字的区域,所以,也是字,但区域更准确。

End Sub

当然,与第一例子类似,要新建一个文档,输入一定(只要二个)字来做测试,按F8一步一步来看,也行。

友情提醒:以后大多是这样:新建、输入、然后把代码复制到VBE中来测试。

使用 Duplicate(复制) 属性

下列指令创建一个Range对象的新副本 Range2,它与Range1有相同的起点、终点和文本。

Set Range2 = Range1.Duplicate

对 Range1 起点或终点的修改不影响 Range2,反之亦然。但是,由于这两个区域指向文档中的同一位置,对一个区域中文本的修改将影响另一个区域中的文本。

'我不知道为什么要使用这个Duplicate属性,上面都说是了Set range2=range1不是好用的很吗?不明白啊,或许以为你会发现的。

修改文档的某一部分(以后为细说对象时,说到这些,现在大致了解一些关键的东东)

Visual Basic 包含一些对象,可用这些对象修改下列文档元素:字符、单词、句子、段落和节。下表包含与这些文档元素相对应的属性和这些属性返回的对象。


表达式
返回的对象
Words(index)
Range (注意Words返回的是Range对象)
Characters(index)
Range (注意Characters返回的是Range对象)
Sentences(index)
Range (注意Sentences返回的是Range对象)
Paragraphs(index)
Paragraph
Sections(index)
Section    (这个是“节”,就是插入、分隔符中的“节”)

如果使用这些属性时不带索引序号,则返回一个具有相同名称的集合对象。例如,Paragraphs 属性返回 Paragraphs 集合对象。但是如果通过索引序号识别集合中的一项,则返回上表中第二列中的对象。例如,Words(1) 返回一个 Range 对象(注意不是Word对象噢)。有了一个 Range 对象之后,可以使用任何区域属性或方法修改该 Range 对象。例如,下列指令将所选内容的第一个单词复制到“剪贴板”。

Sub CopyWord()

    Selection.Words(1).Copy

End Sub

'仅供参考!

注释  ParagraphsSections 集合中的项是该集合的单个成员,而不是 Range 对象。但是(返回 Range 对象的)Range 属性对 ParagraphSection 对象都可用。例如,下列指令将活动文档的第一段复制到“剪贴板”。

Sub CopyParagraph()

    ActiveDocument.Paragraphs(1).Range.Copy

End Sub

上述表格中的所有文档元素属性对 DocumentSelectionRange 对象都可用。下列示例阐明了如何使用 DocumentSelectionRange 对象的这些属性。

下列示例设置活动文档中第一个单词的大小写。

Sub ChangeCase()

    ActiveDocument.Words(1).Case = wdUpperCase

End Sub

下列示例将当前节的下边距设为 0.5 英寸(前台是通过页边距来做)。

Sub ChangeSectionMargin()

    Selection.Sections(1).PageSetup.BottomMargin = InchesToPoints(0.5)

End Sub

下列示例将活动文档的字符间距设为两倍(Content 属性返回一个 Range 对象)。

Sub DoubleSpaceDocument()

    ActiveDocument.Content.ParagraphFormat.Space2  'Space2是2倍的缩写

End Sub

修改一组文档元素

若要修改由一组文档元素(字符、单词、句子、段落或节)组成的某区域的文字,需要创建一个Range 对象。Range 方法根据开始和结束位置可创建 Range 对象。例如,下列指令创建一个Range 对象,该对象引用活动文档的前十个字符。

Sub SetRangeForFirstTenCharacters()

    Dim rngTenCharacters As Range

    Set rngTenCharacters = ActiveDocument.Range(Start:=0, End:=10)

End Sub

'没记错的话,这个例子以前用过,以后有这种情况,就是一个例子反复使用,但角度不同。

使用 Range 对象的 StartEnd 属性可创建一个新的 Range 对象,该对象引用一组文档元素。例如,下列指令创建一个引用活动文档中前三个单词的 Range 对象 (myRange)。

Sub SetRangeForFirstThreeWords()

    Dim docActive As Document

    Dim rngThreeWords As Range

    Set docActive = ActiveDocument     '设置变量

    Set rngThreeWords = docActive.Range(Start:=docActive.Words(1).Start, _

        End:=docActive.Words(3).End)

End Sub

下列示例创建一个 Range 对象(aRange),该对象从第二段的开头开始,在第三段之后结束。

Sub SetParagraphRange()

    Dim docActive As Document

    Dim rngParagraphs As Range

    Set docActive = ActiveDocument

    Set rngParagraphs = docActive.Range(Start:=docActive.Paragraphs(2).Range.Start, _

        End:=docActive.Paragraphs(3).Range.End)

End Sub

引用活动文档元素

要引用活动的段落、表格、域或其他文档元素,可使用 Selection 属性返回一个 Selection 对象。通过 Selection 对象,可访问选定内容中的所有段落或第一段。下列示例将边框应用于选定内容的第一段。

Sub BorderAroundFirstParagraph()

    Selection.Paragraphs(1).Borders.Enable = True

End Sub

下列示例将边框应用于选定内容中的每一个段落。

Sub BorderAroundSelection()

    Selection.Paragraphs.Borders.Enable = True

End Sub

下列示例将底纹应用于选定内容中第一张表格的首行。

Sub ShadeTableRow()

    Selection.Tables(1).Rows(1).Shading.Texture = wdTexture10Percent

End Sub

如果选定的内容不包含表格,将导致出错。可使用 Count (计数)属性判定选定内容中是否包含表格。下列示例将底纹应用于选定内容中第一张表格的首行。

Sub ShadeTableRow()

    If Selection.Tables.Count >= 1 Then

        Selection.Tables(1).Rows(1).Shading.Texture = wdTexture25Percent

    Else

        MsgBox "Selection doesn't include a table"

    End If

End Sub

下列示例将底纹应用于选定内容中每张表格的首行。For Each...Next 循环用于在选定内容的每张表格中循环。

Sub ShadeAllFirstRowsInTables()

    Dim tblTable As Table

    If Selection.Tables.Count >= 1 Then   '判断选中区域是否存在表格

        For Each tblTable In Selection.Tables  '这是在选中表中循环的标准写法

            tblTable.Rows(1).Shading.Texture = wdTexture30Percent

        Next tblTable

    End If

End Sub

使用Word对象

(这一部分不需要了解太深,以后用到时,还会详细的解释这些。原因有二:第一,这个比较抽象,第二,使用的频率不高。PS: 我的《身份证号码自动提取信息》的原理就是这个知识,但遗憾的是大多人看不懂。)

使用 Application 对象事件

若要创建 Application 对象事件的事件处理器,需要完成下列三个步骤:

在类模块中声明对应于事件的对象变量。

编写特定事件过程。

从其他模块中初始化声明的对象。

一、声明对象变量

在为 Application 对象事件编写过程之前,必须创建新的类模块并声明一个包含事件的 Application 类型对象。例如,假定已创建新的类模块并命名为 EventClassModule。该类模块包含下列代码:

Public WithEvents App As Word.Application

编写事件过程

定义了包含事件的新对象后,它将出现在类模块的“对象”下拉列表框中,然后可为新对象编写事件过程。(在“对象”框中选定新对象后,用于该对象的有效事件将出现在“过程”下拉列表框中)从“过程”下拉列表框中选择一个事件,在类模块中会增加一空过程。

Private Sub App_DocumentChange()

End Sub

初始化已声明的对象

在运行过程之前,必须将类模块中已声明的对象(本例中为 App)连接到 Application 对象。您可在任何模块中使用下列代码:

Dim X As New EventClassModule

Sub Register_Event_Handler()

    Set X.App = Word.Application

End Sub

运行 Register_Event_Handler 过程。运行该过程后,类模块中的 App 对象指向 Microsoft Word Application 对象,当事件发生时,将运行类模块中的事件过程。

使用 Document 对象的事件

Document 对象支持多种事件,以响应文档状态。若要在名为“ThisDocument”的类模块中编写响应这些事件的过程。可用下列步骤创建事件过程。

在“工程资源管理器”窗口中的 Normal 工程或文档工程下,双击“ThisDocument”。(“ThisDocument”位于“文件夹”视图中的“Microsoft Word 对象”文件夹中)。

从“对象”下拉列表框中选择“Document”。

从“过程”下拉列表框中选择一个事件。

类模块中即增加了一个空子程序。

添加要在事件发生时运行的 Visual Basic 指令。

下例显示了 Normal 工程中的一个 New 事件过程,它在新建一个基于 Normal 模板的文档时运行。

Private Sub Document_New()

    MsgBox "New document was created"

End Sub

下例显示了文档工程中的 Close 事件过程,该过程只在该文档关闭时运行。

Private Sub Document_Close()

    MsgBox "Closing the document"

End Sub

与自动宏不同,Normal 模板中的事件过程没有全局区。例如,Normal 模板中的事件过程只有在附加模板为 Normal 模板时才发生。

如果文档及其附加模板中存在自动宏,则仅运行保存在文档中的自动宏。如果文档及其附加模板中都存在文档事件过程,则两个事件过程都会运行。

使用 ActiveX 控件事件

(这部分主要是VB窗体的使用,对VB熟练的就OK,否则有点吃力,我也吃力。但我想没关系,我虽做不出如花的界面,但功能上能完成,也就行了。)

Microsoft Word 文档可包含 ActiveX 控件。可用“控件工具箱”插入诸如命令按钮、复选框和列表框等 ActiveX 控件。可使用下列步骤添加具有 LostFocus 事件的 ActiveX 复选框控件:

在 Word 中用鼠标右键单击工具栏,然后单击“控件工具箱”。

单击“复选框”控件。

活动文档中即插入一个复选框控件。

用鼠标右键单击复选框,然后单击“查看代码”。

Word 会切换至“Visual Basic 编辑器”并显示 ThisDocument 类模块,并在“对象”下拉列表框中选定该复选框。

在“过程”下拉列表框中选定 LostFocus 事件。

在类模块中会添加一个空过程。

添加要在事件发生时运行的 Visual Basic 指令。

下列示例显示在焦点离开 CheckBox1 时运行的 LostFocus 事件过程。该宏用 Value 属性显示CheckBox1 的状态(True 为选定,False 为清除)。

Private Sub CheckBox1_LostFocus()

    MsgBox CheckBox1.Value

End Sub

若要查看事件过程的运行情况,可切换回包含该复选框的 Word 文档。单击“控件工具箱”上的“退出设计模式”按钮。选定或清除复选框,然后单击文档中的其他元素。此时复选框失去焦点,LostFocus 过程开始运行;Word 会显示一个消息框,内容为 True 或 False。

Word 在 Word 文档中为 ActiveX 控件应用了 LostFocus 和 GotFocus 事件。“过程”下拉列表框中列出的其他事件在“Microsoft 窗体帮助”中有文档说明。

使用控件和对话框

(这一部分介绍的大多是关于窗体有关的东东,他与VB的类似,如果是VB高手,不用看的。像我等低手,有些也看不明白,不过,我觉得无大碍。我们更注重的内涵,而不是华丽的外表)

在文档中使用 ActiveX 控件

如果需要为用户提供复杂的交互方式,使用户可与宏进行直接交互而不受对话框的干扰,类似于将ActiveX 控件添至自定义对话框,您可将控件直接添至文档。使用下列步骤可将 ActiveX 控件添至文档。有关在 Word 中使用 ActiveX 控件的特定信息,请参阅在文档中使用 ActiveX 控件。

将控件添至文档

若要向文档的图形层添加控件,请单击“控件工具箱”上的控件。若要向文档的文本层添加控件,请按住 Shift 并单击“控件工具箱”上的控件。

设置控件属性

在设计模式下用鼠标右键单击控件,并单击“属性”以显示“属性”窗口。

初始化控件

可在过程中初始化控件。

编写事件过程

所有控件都有一系列预定义的事件。例如,命令按钮有 Click 事件,当用户单击该命令按钮时,该事件发生。您可编写事件发生时运行的事件过程。

运行代码时使用控件的值

可在运行时设置某些属性

创建自定义对话框

通过下列步骤创建自定义对话框:

创建用户窗体

在“Visual Basic 编辑器”的“插入”菜单上,单击“用户窗体”。

将控件添至用户窗体

在“工具箱”中找到要添加的控件,并将控件拖至窗体上。

设置控件属性

在设计模式中用鼠标右键单击控件,并单击“属性”以显示“属性”窗口。

初始化控件

您可在显示窗体之前的过程中初始化控件,或为窗体的 Initialize 事件中添加代码。

编写事件过程

所有控件都有一系列预定义的事件。例如,命令按钮有 Click 事件,在用户单击命令按钮时,该事件发生。您可编写事件发生时运行的事件过程。

显示对话框

使用 Show 方法显示用户窗体。

运行代码时使用控件的值

有些属性可在运行时设置。用户在对话框中为控件设置的值将在对话框关闭时丢失。

显示内置 Word 对话框

(这个要掌握,这个是内置的对话框,与Word关系紧密。)

本主题包含下列信息和示例:

  • 显示内置对话框
  • 返回和更改对话框设置
  • 检查对话框的关闭方式

[url=]显示内置对话框[/url]

可以显示内置对话框以获取用户输入的信息或使用 Visual Basic for Applications 控制 Microsoft Word。Dialog 对象的 Show 方法可显示并执行 Word 内置对话框中的任何操作。若要访问特定的内置 Word 对话框,请指定具有 Dialogs 属性的 WdWordDialog 常量。例如,下列宏指令显示“打开”对话框 (wdDialogFileOpen)。

Sub ShowOpenDialog()

    Dialogs(wdDialogFileOpen).Show

End Sub

选定文件并单击“确定”按钮后,会将文件打开(执行操作)。下列示例显示“打印”对话框(wdDialogFilePrint)。

Sub ShowPrintDialog()

    Dialogs(wdDialogFilePrint).Show

End Sub

设置 DefaultTab 属性可以访问 Word 对话框中的特定选项卡。下列示例显示(“格式”菜单中)“边框和底纹”对话框中的“页面边框”选项卡。

Sub ShowBorderDialog()

    With Dialogs(wdDialogFormatBordersAndShading)

        .DefaultTab = wdDialogFormatBordersAndShadingTabPageBorder

        '这个偷长,我都晕了。

        .Show

    End With

End Sub

Display 方法显示对话框但不执行对话框的操作。如果使用内置对话框提示用户并返回设置,则该方法很有用。例如,下列宏指令显示(“工具”菜单中)“选项”对话框中的“用户信息”选项卡,然后返回并显示用户名称。

Sub DisplayUserInfoDialog()

    With Dialogs(wdDialogToolsOptionsUserInfo)

        .Display

        MsgBox .Name

    End With

End Sub

注释  您也可使用 Word 的 Visual Basic for Applications 属性显示用户信息而不显示对话框。下列示例使用 Application 对象的 UserName 属性显示应用程序的用户名称,而不显示“用户信息”对话框。

Sub DisplayUserInfo()

    MsgBox Application.UserName

End Sub

如果在上例中更改用户名称,对话框设置不会发生更改。使用 Execute 方法可以执行对话框中的设置而不显示该对话框。下列示例显示“用户信息”对话框,如果名称不是空字符串,则可使用Execute 方法设置对话框。

Sub ShowAndSetUserInfoDialogBox()

    With Dialogs(wdDialogToolsOptionsUserInfo)

        .Display

        If .Name <> "" Then .Execute

    End With

End Sub

注释  使用 Word 中的 VBA 属性和方法可设置用户信息而不显示对话框。下列代码示例通过Application 对象的 UserName 属性更改用户名称,然后显示“用户信息”对话框,显示已进行了更改。请注意,更改对话框值时,并非必须显示对话框。

Sub SetUserName()

    Application.UserName = "Jeff Smith"

    Dialogs(wdDialogToolsOptionsUserInfo).Display

End Sub

[url=]返回并更改对话框设置[/url]

如果可以使用属性或方法返回或更改对话框值,使用 Dialog 对象返回或更改该数值并非很有效。而且在大多数情况下,使用 VBA 代码代替访问 Dialog 对象时,代码更简单并更简短。因此,下列示例同时包含对应的使用相应 VBA 属性执行相同的任务的示例。

使用 Dialog 对象返回或更改对话框设置之前,需要识别单独的对话框。使用 WdWordDialog 常量的Dialogs 属性可完成该操作。识别 Dialog 对象后,可以返回或设置对话框中的选项。下列示例显示“段落”对话框的右缩进。

Sub ShowRightIndent()

    Dim dlgParagraph As Dialog

    Set dlgParagraph = Dialogs(wdDialogFormatParagraph)

    MsgBox "Right indent = " & dlgParagraph.RightIndent

End Sub

注释  可以使用 Word 的 VBA 属性和方法显示段落的右缩进设置。下列示例使用 ParagraphFormat对象的 RightIndent 属性显示插入点位置的段落右缩进。

Sub ShowRightIndexForSelectedParagraph()

    MsgBox Selection.ParagraphFormat.RightIndent

End Sub

类似于返回对话框值,您也可以设置对话框值。下列示例标记“段落”对话框中的“与下段同页”复选框。

Sub SetKeepWithNext()

    With Dialogs(wdDialogFormatParagraph)

        .KeepWithNext = 1

        .Execute

    End With

End Sub

注释  您也可以使用 VBA 属性和方法更改段落的右缩进。下列示例使用 ParagraphFormat 对象的KeepWithNext 属性将所选段落与其后的段落保持在同一页。

Sub SetKeepWithNextForSelectedParagraph()

    Selection.ParagraphFormat.KeepWithNext = True

End Sub

注释  使用 Update 方法可确保对话框的值反映当前值。如果预先在宏中定义了对话框变量,然后需要返回或更改当前设置,则可能必须使用 Update 方法。

[url=]检查对话框的关闭方式[/url]

ShowDisplay 方法返回的值标明关闭对话框时单击的按钮。下列示例显示“分隔符”对话框,如果单击“确定”按钮,则在状态栏中显示一条消息。

Sub DialogBoxButtons()

    If Dialogs(wdDialogInsertBreak).Show = -1 Then

        StatusBar = "Break inserted"

    End If

End Sub

下列表格说明与对话框中的按钮相关联的返回值。


返回值
说明
-2
“关闭”按钮。
-1
“确定”按钮。
0(零)
“取消”按钮。
> 0(零)
命令按钮:1 代表第一个按钮,2 代表第二个按钮,以此类推。

内置对话框参数列表

您可能需要对 Microsoft Word 中的许多内置对话框的选项进行设置。若要设置或返回与 Word 对话框相关的属性,可使用等效的 Visual Basic 属性和方法。

例如,如果需要打印文档,可使用 Word Visual Basic for Applications 的 PrintOut 方法。下列代码使用“打印”对话框中的默认设置打印当前文档。但是,如果不希望使用“打印”对话框中的默认设置,可以使用与 PrintOut 方法相关的参数。

Sub PrintCurrentDocument()

    ThisDocument.PrintOut

End Sub

虽然推荐您使用 VBA 关键字获取或设置对话框选项的值,但许多内置的 Word 对话框也具有可用于设置或获取对话框值的参数。详细信息,请参阅显示内置 Word 对话框。

WdWordDialog 常量 参数列表

wdDialogConnect       Drive、Path 和 Password

wdDialogConsistencyChecker (无)

wdDialogControlRun Application

。。。    。。。

提醒:以后为不定期的给出一个练习及答案,大家对照学习。

第一期练习题目1:

i see

我明白了

i quit

我不干了

let go

放手

me too

我也是

my god

天哪

no way

不行

come on

来吧

hold on

等一等

把以上文字复制到Word中,通过VBA,变换成以下的形式:

i see

i quit

let go

me too

my god

no way

come on

hold on

我明白了

我不干了

放手

我也是

天哪

不行

来吧

等一等

答案:

Sub 换化3()

Dim arange As Range

Dim array1, array2, array3

Dim i%

On Error Resume Next  '忽略错误

Application.ScreenUpdating = False '关闭屏幕更新

Set arange = Selection.Range   '设置区域

array1 = Split(arange.Text, Chr(13))

For i = 0 To UBound(array1)

    If i Mod 2 = 0 Then

       'MsgBox array1(i)

       array2 = array1(i) + Chr(13) + array2 '第一行、三行等奇数行

    Else

       array3 = array1(i) + Chr(13) + array3  '第二、四行等偶数行

     End If

Next

   Selection.Delete   '删除所选的内容

   Selection.InsertAfter array2

   Selection.InsertAfter array3

  

   Application.ScreenUpdating = False '开启屏幕更新

  

End Sub

'以上还有简单简懂的方法,在VBE中。

第一期练习题目2:

i see

i quit

let go

me too

my god

no way

come on

hold on

我明白了

我不干了

放手

我也是

天哪

不行

来吧

等一等

把以上文字复制到Word1中,通过VBA,变换成以下的形式:

i see

我明白了

i quit

我不干了

let go

放手

me too

我也是

my god

天哪

no way

不行

come on

来吧

hold on

等一等

答案:

Sub第二题答案()

Dim arange As Range

Dim array1, array2, array3

Dim i%

On Error Resume Next  '忽略错误

Application.ScreenUpdating = False '关闭屏幕更新

Set arange = Selection.Range   '设置区域

array1 = Split(arange.Text, Chr(13))

For i = UBound(array1) / 2 - 1 To 0 Step -1

       array2 = array1(i) + Chr(13) + array1(i + UBound(array1) / 2) + Chr(13) + array2 '

       '注意,他不能保存格式,但对于文字可能是最好的方法之一。

Next

   Selection.Delete   '删除所选的内容

   Selection.InsertAfter array2

   Application.ScreenUpdating = False '开启屏幕更新

  

End Sub

函数:Weekday 函数

返回一个 Variant (Integer),包含一个整数,代表某个日期是星期几。

语法:Weekday(date, [firstdayofweek])

Weekday 函数语法有下列的命名参数:


部分
描述
date
必要。能够表示日期的 Variant、数值表达式、字符串表达式或它们的组合。如果 date 包含 Null,则返回 Null。
Firstdayofweek
可选。指定一星期第一天的常数。如果未予指定,则以 vbSunday 为缺省值。

设置

firstdayofweek 参数有以下设定值:


常数
描述
vbUseSystem
0
使用 NLS API 设置。
VbSunday
1
星期日(缺省值)
vbMonday
2
星期一
vbTuesday
3
星期二
vbWednesday
4
星期三
vbThursday
5
星期四
vbFriday
6
星期五
vbSaturday
7
星期六

(以下知识是VBS知识,知道一点也不错!以后可经常摘录一些VBS的知识,但不作说明。因我也只是看得有一点点懂,写不出来的水平。)

Folders 集合

包含在一个 Folder 对象内的所有 Folder 对象的集合。

说明

下面的代码举例说明了如何获得一个 Folders 集合,以及如何用 For Each...Next 语句来访问该集合中的每个Folder:

Sub 文件夹()

    ShowFolderList ("c:\")

End Sub

Sub ShowFolderList(folderspec)

    Dim fs, f, f1, fc, s

    Set fs = CreateObject("Scripting.FileSystemObject")

    Set f = fs.GetFolder(folderspec)

    Set fc = f.SubFolders

    For Each f1 in fc

        s = s & f1.name

        s = s &  vbCrLf

    Next

    MsgBox s

End Sub


 楼主| 发表于 2014-7-22 00:14:59 | 显示全部楼层

一、通过录制宏生成代码

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

  • 在“工具”菜单上,指向“宏”,然后单击“录制新宏”。
  • 如果需要,可更改默认的宏名称,然后单击“确定”启动录制器。
  • 在“格式”菜单上,选定“段落”。
  • 更改段落左缩进的值,然后单击“确定”。
  • 单击“停止录制”工具栏上的“停止录制”按钮。
  • 在“工具”菜单上,指向“宏”,然后单击“宏”。
  • 从步骤 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 命令的步骤。

  • 在“工具”菜单上,指向“宏”,然后单击“宏”。
  • 在“宏的位置”框中,选择“Word 命令”。
  • 在“宏名”框中,选择“FileSave”。
  • 在“宏的位置”框中选择一个模板或文档以保存该宏。例如,选择 Normal.dot(全局模板)可生成一个共用宏(即修改所有文档的“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 命令。

五、将文本插入文档

使用 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.excelhome.net/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。如果要省略某些位置参数,则必须加入相应的逗号分界符。


使用 高级模式(可批量传图、插入视频等)
您需要登录后才可以回帖 登录 | 立即注册

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