2.3.3. Word vba学习记录

  1. 获得所选range的文字

    尝试了一下,发现两种都可以:

    Selection.Text
    Selection.Range.Text
                    
  2. 不等于符号

    VBA里面的不等于号,用"<>"表示,而不是其他C等语言里面的"!="

    <>,即大于号和小于号的组合,意思也很明确,既不大于也不小于,所以就是不等于了。

  3. 如何选中一行并获得对应的文字 和 wdMove和wdExtend的区别

    前提,光标(或叫插入点)已经移动到该行了,但是想要选中该行,并想要获得对应所选Range的文字

    此时可以用如下代码:

    Selection.MoveDown Unit:=wdLine1, Count:=1, Extend:=wdExtend2
                        

    1

    wdLine是单位(Unit)

    类似的Unit还有:wdParagraph,wdWindow,wdScreen。

    2

    和WdExtend对应的还有wdMode

    对此,VBA教程的解释是:如果是 wdMove,则所选内容折叠到结束位置,并向下移动。如果是 wdExtend,则所选内容向下扩展。默认值为 wdMove。

    没完全理解,但是经过测试得知,如果是mdMove,那就是光标移动到对应位置了,但是没有选择这(光标移动的)起点到终点,此处为整个这一行,的内容,如果是wdExtend,那就是不仅移动光标了,并且同时选中了起点到终点的内容。

  4. 如何跳转到某一标题 和 如何移动光标/插入点
    Selection.GoTo1 What:=wdGoToHeading2, Which:=wdGoToAbsolute3, Count:=5
                        

    1

    这里主要是利用Goto语句

    2

    wdGoToHeading说明掉转的单位是heading标题

    3

    wdGoToAbsolute表示是绝对位置的跳转

    于此相对应的还有wdGoToFirst, wdGoToLast, wdGoToNext, wdGoToPrevious, wdGoToRelative。

    更多详细内容,请参考[3]

    另外,对于移动光标/插入点,可以借鉴如下做法:

    本示例将所选内容移至当前文字部分的开头。如果所选内容位于文档正文部分,则本示例将所选内容移至文档的开头

    Selection.HomeKey Unit:=wdStory1, Extend:=wdMove
                            

    1

    wdStory属于wdUnits

    其他类似的还有wdColumn,wdLine,wdRow等

  5. 如何获得选中的标题的序号

    前提,已经选择某一标题了,想要获得该标题前面的序号

    比如对这个标题:

    2.1 PAPRBY / RubyVerifoneDefaults

    想要获得标题的序号,即2.1

    可通过下列代码获得当前标题的序号,即2.1

    Selection.Bookmarks("\headinglevel1").Range.ListFormat.ListString
                        

    1

    \headinglevel是VBA里面的预定义标签

    关于此内容的详细解释,请参考:[5]

  6. 如何返回函数的返回值

    关于这点,网上找,没几个说的很清楚的,最后还是通过VBA的Help才搞懂如何返回函数返回值的。

    此处,简单解释如下:

    一个Function函数的语法为:

    [Public | Private | Friend] [Static] Function name1 [(arglist)] [As type]
    [statements]
    [name = expression2]
    [Exit Function] 
    [statements]
    [name = expression]3
    End Function
                        

    1

    name即为函数名

    2

    expression是表达式,当然也可以是某个变量,常量等,其就代表了返回值。

    更具体的解释和例子,摘录如下,很容易看懂的:

    要从函数返回一个值,只需将该值赋给函数名。在过程的任意位置都可以出现这种赋值。

    如果没有对 name 赋值,则过程将返回一个缺省值:数值函数返回 0,字符串函数返回一个零长度字符串 (""),Variant 函数则返回 Empty。

    如果在返回对象引用的 Function 过程中没有将对象引用赋给 name (通过 Set),则函数返回 Nothing。

    下面的示例说明如何给一个名为 BinarySearch 的函数赋返回值。

    在这个示例中,将 False 赋给了该函数名,表示没有找到某个值。

    Function BinarySearch(......) As Boolean
    ......
        '值未找到,返回一个 False 值。
        If lower > upper Then
            BinarySearch = False
            Exit Function
        End If
    ......
    End Function
                                    

    看懂后,多说一句,有问题,还是先找VBA的Help系统,比百度,google等,有时候更准确,方便,易懂。

    3

    函数内部任何地方都可以出现[name = expression]

  7. 字符串处理函数

    关于VBA中的字符串相关的函数,刚发现,office 2010 中的 VBA的help文件里面,有已经总结好的了:

    作用关键字
    比较两个字符串StrComp
    变换字符串StrConv
    大小写变换Format, LCase, UCase
    建立重复字符的字符串Space, String
    计算字符串长度Len
    设置字符串格式Format
    重排字符串LSet, RSet
    处理字符串InStr, Left, LTrim, Mid, Right, RTrim, Trim
    设置字符串比较规则Option Compare
    运用 ASCII 与 ANSI 值Asc, Chr

    上述字符串处理相关的函数,多数都是见名知意,容易看懂和使用, 但是也有些不太容易搞懂,或者和普通C语言等里面的字符串处理函数不同的,需要额外说明的,解释如下:

    1. Space, String

      其中Space很方便,比如想要输出10个空格,当然你可以通过自己手动的写成" ",但是有了space,用其更方便,直接写成

      Space(10)

      即代表了10个空格。同理

      String(number,characterToRepeate)

      用于输出多个某一字符,而对于前面的空格来说,也可以用string表示,即

      Space(10)=String(10, 32)

      其中32=0x20,是space的ASCII值。而String的优点在于,也可以输出其他字符,包括0x0~0x1F之类不可见字符。

    2. InStr, InStrRev

      这个InStr,其实就是C语言的strstr

      语法为:

      InStr([start, ]string1, string2[, compare])

      意思为:"返回 Variant (Long),指定一字符串在另一字符串中最先出现的位置。"

      而InStrRev意思和InStr类似,只不过是"从字符串的末尾算起"。

      举例说明:

      posOfPoint = InStr("abc.def", ".") ’ 查找"abc.def"中的".",返回值为4
    3. Asc, Chr

      Asc是将字符转换为ASCII数值,Chr是将数值转换为ASCII字符。

      举例为:

      MyNumber = Asc("A")    ' 返回 65。
      MyChar = Chr(97)    ' 返回 a。
                              
    4. 如何创建文件和输出信息到文件里面

      在VBA中创建(log)文件的两种方法. 

      1. 方法1:
        Function createFileTest()
        ' the name of the file to be output, including full path
        Dim FileName As String
        FileName = "D:\create_file.txt"
        ' open the file ouput text stream output, overwritng is necessary
        Dim fs As Object
        Set fs = CreateObject("Scripting.FileSystemObject")
        Dim file As Object
        Set file = fs.CreateTextFile(FileName, True)
        file.WriteLine "test string..."
        file.Close
        End Function
                                            
      2. 方法2:
        Public gFileNum As Integer
        Function createOutputFile()
        Dim outputFileNameWithPath As String
        Dim gDestFile As String
        Dim outputFileNameWithPath As String
        Dim openFileOK As Boolean
        openFileOK = True
        ' 1. create an XML file
        outputFileNameWithPath = "D:\test_output.txt"
        gDestFile = outputFileNameWithPath
        ' Obtain next free file handle number.
        gFileNum = FreeFile()
        ' Turn error checking off.
        On Error Resume Next
        ' Attempt to open destination file for output.
        Open gDestFile For Output As #gFileNum
        ' If an error occurs report it and end.
        If Err <> 0 Then
            openFileOK = False
            MsgBox "Cannot create file: " & gDestFile
        End If
        ' Turn error checking on.
        On Error GoTo 0
        createOutputFile = openFileOK
        End Function
        Sub createFileTest()
        Print #gFileNum, "Test output string to this file..."
        Print #gFileNum, "Test done."
        Close #gFileNum
        End Sub
                                            
    5. 如何获得当前文件的文件名 和 当前文件所在路径
      1. 获得当前文件所在的路径:ActiveDocument.Path。

        注意:所得结果,最后没有那个路径分隔符"\"

      2. 获得当前文件的文件名:ActiveDocument.Name
      3. 获得当前文件的路径和文件名,即全名:ActiveDocument.FullName
    6. VB里面的一些常量

      office 2010的help文件里面已有总结:

      Visual Basic 常数

      Visual Basic for Applications 定义了一些常数,使程序设计变得更为简单。下列常数可在程序代码中的任何地方代替实际值:

      • Calendar 常数
      • CallType 常数
      • Color 常数
      • Compiler 常数
      • Date 常数
      • Dir、GetAttr 和 SetAttr 常数
      • IMEStatus 常数
      • Instr、StrComp 常数
      • Keycode 常数
      • Miscellaneous 常数
      • MsgBox 常数
      • QueryClose 常数
      • QueryClose 常数
      • Shell 常数
      • StrConv 常数
      • 系统颜色常数
      • VarType 常数
      • Visual Basic 常数

      其中,此处打算把一些我所常用到的一些常数列出来,以供参考

      Miscellaneous 常数

      下列常数由 Visual Basic for Applications 中的类型库定义,可用来在代码中的任何地方代替实际值

      常数等于描述
      vbCrLfChr(13) + Chr(10)回车符与换行符结合
      vbCrChr(13)回车符
      vbLfChr(10)换行符
      vbNewLineChr(13) + Chr(10) or, on the Macintosh, Chr(13)平台指定的新行字符;适用于当前平台
      vbNullCharChr(0)值为 0 的字符
      vbNullString值为 0 的字符串用来调用外部过程;与长度为零的字符串 ("") 不同
      vbObjectError-2147221504用户定义的错误号应当大于该值,例如:Err.Raise Number = vbObjectError + 1000
      vbTabChr(9)Tab 字。
      vbBackChr(8)退格字符
      vbFormFeedChr(12)在 Microsoft Windows or on the Macintosh 中没有作用
      vbVerticalTabChr(11)在 Microsoft or on the Macintosh Windows 中没有作用