精华内容
下载资源
问答
  • word——VBA编程

    万次阅读 2019-08-23 14:03:54
    一个一个手动操作真的太low了,所以研究了一下word的宏,VBA编写代码,批量操作。 Sub 批量操作WORD() Dim path As String Dim FileName As String Dim worddoc As Document Dim MyDir As String MyDir = "...

    最近需要批量操作一些word文件,大约四十几个文件把。一个一个手动操作真的太low了,所以研究了一下word的宏,VBA编写代码,批量操作。
    操作就是全选Word内容,给整体加一个书签PO_table。
    选中文档中检测二字,加书签PO_jc。
    选中 年 月 日,删除该选中内容。

    Sub 批量操作WORD()
    
    Dim path          As String
    Dim FileName  As String
    Dim worddoc   As Document
    Dim MyDir       As String
    MyDir = "C:\Users\CSY\Documents\Tencent Files\409023706\FileRecv\平台需要的\平台需要的"  '文件夹路径根据需要自己修改,需要处理的文件都放该文件夹内
    FileName = Dir(MyDir & "\*.docx*", vbNormal)
    Do Until FileName = ""
    If FileName <> ThisDocument.Name Then
            Set worddoc = Documents.Open(MyDir & "\" & FileName)
            worddoc.Activate
            Call my  '调用宏,换成你自己宏的名字
            worddoc.Close True
            FileName = Dir()
        End If
    Loop
    Set worddoc = Nothing
    End Sub
    
    
    Sub my()
    
        Selection.WholeStory '全选
        Options.DefaultHighlightColorIndex = wdNoHighlight
        Selection.Range.HighlightColorIndex = wdNoHighlight '背景色设无
        Selection.Font.Color = vbBlack '字体颜色设黑
        
        Dim strBookmark As String '声明
        strBookmark = "PO_table" '赋值
        ActiveDocument.Bookmarks.Add Name:=strBookmark, Range:=Selection.Range '给选中区域设置书签
        
        With Selection.Find
            .Text = "检测:"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = True
            .MatchWholeWord = False
            .MatchByte = False
            .MatchAllWordForms = False
            .MatchSoundsLike = False
            .MatchWildcards = False
            .MatchFuzzy = True
        End With '选中文档中文字'检测:'
        Selection.Find.Execute '选中执行
        Selection.MoveRight Unit:=wdCharacter, Count:=1 '移动光标一格
    
        strBookmark = "PO_jc"
        ActiveDocument.Bookmarks.Add Name:=strBookmark, Range:=Selection.Range
        
        With Selection.Find
            .Text = "     年   月   日 "
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = True
            .MatchWholeWord = False
            .MatchByte = False
            .MatchAllWordForms = False
            .MatchSoundsLike = False
            .MatchWildcards = False
            .MatchFuzzy = True
        End With '找到     年   月   日
        Selection.Find.Execute
        Selection.Delete'删除选中内容
    
    End Sub
    
    展开全文
  • 守柔(SHOUROU)WORD 编程代码集 书中可能涉及的对象,主要有:节(Sections)的循环,段落中(Paragraphs)的循环, 句子(Sentences)的循环,词组中(Words)的循环,字(Characters)的循环,表格(Tables) 的循环,单元格...
  • 介绍VBA操作word的书籍
  • Excel VBA编程

    万次阅读 多人点赞 2019-04-11 16:45:51
    文章目录如何创建VBAVBA语法规则声明变量给变量赋值让变量存储的数据参与运算关于声明变量的其他知识变量的作用域特殊的变量——数组声明多维数组声明动态数组其他创建数组的方法数组函数利用UBound求数组的最大索引...

    文章目录

    如何创建VBA

    1. 进入开发工具窗口

    2.选择插入模块,然后插入过程,选择子程序


    VBA语法规则

    在Excel中,数据只有文本,数值,日期值,逻辑值和错误值五种类型。但是在VBA中,数据类型跟Excel不完全相同。根据数据的特点,VBA将数据分为布尔型(boolean),字节型(byte),整数型(integer),单精度浮点型(single),双精度浮点型(double),货币型(currency),小数型(decimal),字符串型(string),日期型(date),对象型等等

    声明变量

    声明变量,其实就是指定该变量的名称及其可存储的数据类型,要在VBA中声明一个变量,有以下几种方法:

    1. Dim 变量名 as 数据类型
    2. Private 变量名 as 数据类型,用private声明变量,该变量将会变成私有变量
    3. Public 变量名 as 数据类型,用public变量定义的变量是公有变量
    4. static 变量名 as 数据类型,如果使用static声明变量,这个变量将会变成静态变量,当程序结束后,静态变量会保持其原值不变。

    给变量赋值

    1. 给数据类型的变量赋值,应该要使用这个语句:let 变量名称 = 要存储的数据
    2. 给对象类型的变量赋值,应该使用下面的语句:“set 变量名称 = 要存储的对象名称

    让变量存储的数据参与运算

    1. 数据型变量参与运算


    2. 对象型变量参与运算

    关于声明变量的其他知识

    1. 如果要声明多个变量可以将代码写成下面形式:


    2. 可以使用变量类型声明符定义变量类型

    数据类型类型声明字符
    Integer%
    Long&
    Single
    Double#
    currency@
    string$
    1. 声明变量可以不指定变量类型:在VBA中声明变量是,如果不确定会将类型的数据存储在变量中,可以在声明变量时,只定义变量的名字,而不是变量的类型。如果声明变量时,只指定变量的名称而不指定变量的数据类型,VBA默认将该变量定义为Variant类型,如果一个变量被声明为variant类型,俺么它能够存储任何数据类型
    2. 强制声明所有变量:如果担心自己忘记在程序中忘记声明变量,可以在模块开头,输入“Option Explicit

    变量的作用域

    按作用域划分,VBA中的变量可以划分为本地变量,模块变量和公共变量。

    作用域描述
    单个过程在一个过程中使用dim或者static语句声明的变量,作用域为本过程,即只有声明变量的语句所在的过程能够使用它,这样的变量,称为本地变量
    单个模块在模块的第一个过程之前使用dim或者private语句声明的变量,作用域为声明变量的语句所在模块中的所有过程,即该模块中所有的过程都可以使用它,这样的边框称为模块级变量
    所有模块在一个模块的第一个过程之前使用public语句声明的变量,作用域为所有模块,即所有模块中的过程都可以使用它,这样的变量称为公共变量

    特殊的变量——数组

    1. 数组就是同种类型的多个变量的集合
    2. 数组中的元素可以通过索引值取出
    3. 声明数组时应该声明数组的大小
      public dim 数组名称 (a to b)as 数据类型
    4. 给数组赋值就是给数组的每个元素分别赋值

    声明多维数组

    Dim arr(a,b) as Integer
    

    这里是声明一个叫arr数组,其形状为a行b列

    声明动态数组

    当声明数组时,不知道要在这个数组中填入多少个数据时,可以使用动态数组。将数组声明为动态数组时,不能直接使用变量,需要之后使用redim 重新制定数组大小

    Sub test()
        a = Application.WorksheetFunction.CountA(rang("A:A"))
        Dim arr() As String
        ReDim arr(1 To a)
    End Sub
    
    

    其他创建数组的方法

    1. 使用array函数声明数组
    Sub arraytest()
        Dim arr As Variant
        arr = Array(1, 2, 3, 4)
        MsgBox "arr数组的第2个元素为:" & arr(1)
       
    End Sub
    
    


    2. 使用是split函数声明数组

    Sub arraytest()
        Dim arr As Variant
        arr = Split("叶枫,空空,小月,老祝", ",")
        MsgBox "arr数组的第2个元素为:" & arr(1)
       
    End Sub
    
    

    1. 通过单元格区域直接创建数组
    Sub arraytest()
        Dim arr As Variant
        Range("A1:C3").Value = 5
        arr = Range("A1:C1").Value
        Range("e1:G1").Value = arr
       
    End Sub
    

    数组函数

    利用UBound求数组的最大索引号

    Sub arraytest()
        Dim arr As Variant
        Range("A1:C3").Value = 5
        arr = Range("A1:C1").Value
        MsgBox "数组的最大索引号是:" & UBound(arr)
       
    End Sub
    

    利用LBound函数求最小索引号

    Sub arraytest()
        Dim arr As Variant
        Range("A1:C3").Value = 5
        arr = Range("A1:C1").Value
        MsgBox "数组的最小索引号是:" & LBound(arr)
       
    End Sub
    

    求多维数组的最大和最小索引号

    Sub arraytest()
       Dim arr(10, 100) As Integer
       Dim a As Integer, b As Integer
       a = UBound(arr, 1)
       b = UBound(arr, 2)
       MsgBox "第一维的最大索引是:" & a & Chr(13) & "第二维的最大索引是:" & b
       
    End Sub
    

    用join函数将一维数组合并成字符串

    Sub arraytest()
        Dim arr As Variant
        arr = Array(1, 2, 3, 4)
        Text = Join(arr)
        MsgBox Text
       
    End Sub
    

    将数组内容写入工作表中

    Sub arraytest()
        Dim arr As Variant
        arr = Array(1, 2, 3, 4, 5, 6, 7)
        Range("A4:A11").Value = Application.WorksheetFunction.Transpose(arr)
        
    End Sub
    

    其中transpose是对数组进行列转换。数组内容如果不够填充单元格长度,超出的数据会以NA值填充。若需要填充的单元格数目不够数组长度,那么会按照顺序依次填充。

    数组的存取

    当将Excel表中的数据传递给数组时,默认建立的是一个二维数组,因此在取数组的值时,需要传递两个数值进去,如果只传入一个数组,会出现下标越界的警告。数组的第一个数指定行,第二个数指定列

    arr = range("B1:C1").value
    msgbox arr(1,2)
    
    

    特殊数据的专用容器——常量

    常量常常用来存储一些固定不变的数据,如利率,税率和圆周率等。**声明常量时,英同时定义常量的名称,可存储的数据类型以及存储在其中的数据。语句为:

    const 常量名称 as 数据类型 = 存储在常量中的数据
    

    同定义变量一样,在过程内部使用const语句定义的常量称为本地常量,只可以在声明常量的过程中使用;

    如果在模块的第一个过程之前使用const语句声明常量,该常量被称为模块级常量,该模块中的所有过程都可以使用它;

    如果想让声明的常量在所有模块中都可以使用它,那么应该在模块的第一个过程之前使用public语句将它声明为公共常量

    对象,集合及对象的属性和方法

    对象就是东西,使用VBA代码操作和控制的东西,属于名词。在VBA中,Excel的工作簿,工作表,单元格等都是对象,图表,透视表,图片等也都是对象,甚至于单元格的边框线,插入的批注都是对象…

    集合也是对象,它是对多个相同类型对象的统称。

    每个对象都有属性,对象的属性可以理解为这个对象包含的内容或者具有的特征。对象和属性是相对而言的。单元格相对于字体来说的对象,但是单元格相对于工作表而言是属性

    方法是在对象上执行的某个动作或者操作,每个对象都有其对应的一个或者多个方法。方法和属性的区别是属性返回对象包含的内容或者具有的特点,如子对象、颜色、大小等;方法是对对象的一种操作,如选中,激活等

    VBA中的运算符

    算数运算符

    运算符作用示例
    +求两个数的和5+9=14
    -求两个数的差,或者求一个数的相反数8-3=5
    *求两个数的积
    /求两个数的商
    \求连个数相处后所得的商的整数5\2=2
    ^求某个数的次方
    Mod求两个数相除后的余数12 mod 9 =3

    比较运算符

    运算符作用语法返回结果
    =比较两个数据是否相等expression1=expression2相等返回TRUE,不相等返回false
    <>不等于expression1<> expression2与上相反
    >比较两个数的大小expression1> expression2
    >=比较两个数的大小expression1>= expression2
    <比较两个数的大小expression1<expression2
    <=比较两个数的大小expression1<=expression2
    is比较两个对象的引用变量对象1 is 对象2当对象1和对象2 引用相同的对象时返回TRUE,否则返回false
    like比较两个字符串是否匹配字符串1 like 字符串2当字符串1与字符串2匹配时返回TRUE,否则返回false

    通配符

    通配符作用代码举例
    *代替任意多个字符“李家俊” like “李*”
    ?代替任意单个字符“李家俊” like “李??”
    #代替任意单个数字“商品5” like “商品#”
    [charlist]代替位于charlist中的任意一个字符“I” like “[A-Z]”
    [!charlist]代替不位于charlist中的任意一个字符“I” like “[!A-Z]”

    逻辑运算符

    运算符作用语句形式计算规则
    and执行逻辑“与”运算表达式1 and 表达式2当表示式1和表达式2的值都为TRUE时,返回TRUE,否则返回false
    or执行逻辑 “或”运算表达式1 or 表达式2二者之一为真返回TRUE,同时为false,返回false
    not执行逻辑“非”运算not 表示取反运算
    xor执行逻辑“异或”运算表达式1 xor 表达式2当表达式1和表达式2返回的值不相同时返回TRUE,否则返回false
    eqv执行逻辑“等价”运算表达式1 eqv 表达式2当表达式1和表达式2返回的值相同时返回TRUE,反之false
    Imp执行逻辑“蕴含”运算表达式1 imp 表达式2当表示1的值为TRUE,表达式2的值为false时返回false,否则返回TRUE

    VBA内置函数

    函数虽然很多,但是我们不需要很精确的记住它们。**如果记得某个函数大致拼写,在编写代码时只要在【代码窗口】中输入“VBA.”,就可以在系统显示的函数列表中选择需要使用的函数。

    执行程序执行的基本语句结构

    if语句

    在VBA中,if语句的规则如下:

    if 条件 then 语句 else 条件
    

    select case语句

    尽管使用if语句可以解决“多选一”的问题,但当判断的选择条件过多时,使用多个elseif语句或多个if语句,就像一句话里用了太多的如果,会为理解代码逻辑带来困难。通常,当需要在三种或以上的策略中做出选择时,我们会选择使用select case 语句来解决问题

    Sub test()
        Select Case Range("B2").Value
            Case Is >= 90
                Range("C2").Value = "优秀"
            Case Is >= 80
                Range("C2").Value = "良好"
            Case Is >= 60
                Range("C2").Value = "及格"
            Case Is < 60
                Range("c1").Value = "不及格"
        End Select
        
    End Sub
    

    for 循环

    在VBA中定义for循环的语法规则如下:

    for 循环变量=初值 to 终值 step 步长值
        循环体
    next 循环变量名
    

    for循环都要以next结尾

    Sub test()
        Dim irow As Byte
        Dim i As Byte
        For i = 1 To 10 Step 1
            Select Case Range("B" & i).Value
                Case Is > 100
                    Range("C" & i).Value = "信息错误"
                Case Is >= 90
                    Range("C" & i).Value = "优秀"
                Case Is >= 80
                    Range("C" & i).Value = "良好"
                Case Is >= 60
                    Range("C" & i).Value = "及格"
                Case Is < 60
                    Range("C" & i).Value = "不及格"
            End Select
        Next i
    End Sub
    

    for each…next语句循环处理集合或数组中的成员

    当需要循环处理一个数组的每个元素或者集合中的每个成员时,使用for each……next语句

    Sub test()
       Dim i As Byte
      j = 1
        For Each sht In Worksheets
            Range("D" & j).Value = sht.Name
            j = j + 1
        Next sht
       
    End Sub
    

    do while循环

    do while语句可以分为两种,按照设置循环条件的位置区分,可以分为开头判断式和截尾判断式。其语句结构如下:

    1. 开头判断式
    do [while 循环条件]
        循环体
        exit do
        循环体
    loop
    
    1. 截尾判断式
    do 
        循环体
        exit do
        循环体
    loop [while 循环条件]
    

    每个do语句都必须以loop结尾,当循环进行到loop处时,会重新回到do语句判断条件是否成立

    Sub test()
       Dim i As Byte
       i = 1
       Do
            Worksheets.Add
            i = i + 1
        Loop While i < 5
    End Sub
    

    使用Goto语句,让程序转到另一条语句去执行

    要让goto语句清楚的知道要转向的目标语句,可在目标语句之前加上一个带冒号的文本字符创,或者不带带冒号的数字标签,然后在goto的后面写上标签名

    Sub test()
       Dim i As Integer
       Dim sum As Long
       i = 1
    x:    mysum = mysum + i
        i = i + 1
        If i <= 100 Then GoTo x
        MsgBox "1到100的和为:" & mysum
    End Sub
    

    with语句,简写代码

    当需要对相同的对象进行多次操作时,往往会编写一些重复的代码。如果不想重复多次的录入相同的语句,可以用with语句简化

    Sub fontest()
        With Worksheets("Sheet1").Range("A1").Font
            .Name = "仿宋"
            .ColorIndex = 3
            .Bold = True
            .Size = 12
        End With
    End Sub
    

    sub过程,基本的程序单元

    sub过程的基本结构

    [private|public|static] sub 过程名([参数列表])
        语句块
    [exit sub]
        语句块
    end sub
    

    private或public用来声明过程的作用域,同时只能使用一个,可以省略,如果省略,默认使用public。如果选用static,过程执行结束后,会继续保存过程中变量的值

    在过程中调用过程

    1. 直接使用过程名调用过程,过程名与参数之间用英文逗号隔开
    subname,arg1,arg2
    
    sub runsub()
        subadd
    end sub
    
    1. 使用call关键字调用过程,参数写在过程小括号中,不同参数之间用逗号隔开
    call 过程名(args,arg2)
    sub runsub()
        call subadd
    end sub
    
    1. 使用application对象的run方法调用过程
    application.run "subname,arg1,arg2"
    sub runsub()
        application.run "subadd"
    

    sub过程中的参数传递

    在VBA中,过程的参数传递主要有两种形式:按引用传递和按传递。默认情况下,过程是按照引用的方式传递参数的。如果程序通过引用的方式传递参数,只会传递保存数据的内存地址,在过程中对参数的任何修改都会影响原始的数据。

    Sub shtadd(shtcount As Integer)
        Worksheets.Add Count:=shtcount
        shtcount = 8
        MsgBox "shtcount的值:" & shtcount
    End Sub
    
    Sub test()
        Dim c As Integer
        c = 2
        Call shtadd(c)
        MsgBox "参数过程中的值为:" & c
    End Sub
    

    自定义函数,function过程

    声明一个自定义函数

    public function 函数名([参数])
        函数体
        函数名= 结果
    end function
    

    无论function过程包含多少代码,要执行多少计算,都应该将最后的计算结果保存在过程名称中,这相当于其他语言中的函数return内容

    使用自己定义的函数

    1. 在Excel中使用:
      如果定义的函数没有被定义为私有过程,那么我们可以通过【插入函数】在Excel中使用我们自定义的函数。
    
    Public Function fun()
        fun = Int(Rnd() * 10) + 1
    End Function
    
    

    1. 在VBA过程中使用
    Sub test()
        MsgBox fun()
    End Sub
    
    

    function example

    Public Function count_color(arr As Range, c As Range)
        Dim rng As Range
        For Each rng In arr
            If rng.Interior.Color = c.Interior.Color Then
                count_color = 1 + count_color
            End If
        Next rng
        
    End Function
    
    

    设置函数为易失性函数,让自定义函数也能重复计算

    有时,当工作表重新计算后,自定义函数并不会重新计算。如果想让工作表重新计算后,自定义的函数也能随之重新计算,就应该讲自定义函数定义为易失性函数。要将一个自定义函数定义为易失性函数,只需要在function过程开始时添加下面一行代码

    application.voliatile true
    

    example

    
    Public Function fun()
        application.voliatile true
        fun = Int(Rnd() * 10) + 1
    End Function
    
    

    操作对象

    VBA中常用的对象

    对象对象说明
    Application代表Excel应用程序(如果在word中使用VBA,就代表word应用程序)
    Workbook代表Excel工作簿,一个workbook对象代表一个工作簿文件
    worksheet代表Excel的工作表,一个worksheet对象代表工作簿中的一个普通工作表
    range代表Excel中的单元格,可以是单个单元格,也可以是单元格区域

    application对象操作

    使用ScreenUpdating属性设置更新屏幕

    application对象的ScreenUpdating属性是控制屏幕更新的开关。如果设置其为false,那么屏幕将不会更新,我们将不会看到每一步的执行结果

    Sub test()
        Application.ScreenUpdating = False
        Range("A1:A10").Value = 10
        MsgBox "刚才输入的结果是10,你看到了吗?"
        Range("A1:A10").Value = 100
        MsgBox "刚才的输入是100,你看到了吗"
        Application.ScreenUpdating = True
        
    End Sub
    

    设置DisplayAlerts属性禁止显示警告对话框

    当我们在Excel中执行某些操作时,Excel会显示一个警告框,让我们确定是否执行这些操作。由于很多原因,我们都希望Excel在程序执行中不显示类似的警告对话框,这样可以通过设置application对象的displayalerts属性为false来实现

    Sub sheettest()
        Worksheets.Add Count:=5
        Application.DisplayAlerts = False
        Dim sht As Worksheet
        For Each sht In Worksheets
            If sht.Name <> ActiveSheet.Name Then
                sht.Delete
            End If
        Next sht
        Application.DisplayAlerts = True
        
    End Sub
    

    借助worksheetfunction属性使用工作表函数

    VBA中有许多的内置函数,合理使用函数可有效减少工作中的许多难题,减少编写代码的工作量。但是VBA中没有Excel的内置函数,使用worksheetfunction可以调用Excel中的内置函数。

    Sub cunt()
        Dim mycount As Integer
        Range("A1:B10").Value = 101
        mycount = Application.WorksheetFunction.CountIf(Range("A1:B10"), ">100")
        MsgBox "这片区域大于100的单元格是:" & mycount
    End Sub
    

    如果VBA中已经有了相同功能的函数,就不能再通过worksheetfunction属性引用工作表中的函数。并且并不是所有的工作表函数都可以通过worksheetfunction属性来调用

    设置属性,更改Excel的工作界面

    设置application对象的属性来修改Excel的界面

    在【立即窗口】执行的代码修改的区域
    application.caption = “我的Excel”标题栏
    application.caption “miscrosoft excel”标题栏
    application.displayformulabar = false编辑栏
    application.displaystatusbar = false状态栏
    application.statusbar = “正在编辑。。。。”状态栏
    application.statusbar = false状态栏
    activewindow.displayheadings = false行标和列标

    application的子对象

    application对象的常用属性

    属性返回的对象
    ActiveCell当前活动单元格
    ActiveChart当前活动工作簿中的活动图表
    Activesheet当前活动工作簿中的活动工作表
    ActiveWindow当前活动窗口
    ActiveWorkbook当前活动工作簿
    Charts当前活动工作簿中的所有的图表工作表
    selection当前活动工作簿中所有选中的对象
    sheets当前活动工作簿中的所有sheet对象,包括普通工作表,图表工作表,Excel4.0宏工作表和5.0对话框工作表
    worksheets当前活动工作簿的所有worksheet对象(普通工作表)
    workbooks当前所有打开的工作簿

    workbook对象

    引用workbook对象

    1. 通过文件索引引用
    2. 通过文件名引用
    sub test()
        workbooks(3)
        workbooks("sheet1")
    end sub
    

    访问workbook对象属性

    Sub info()
        Range("c1") = ThisWorkbook.Name
        Range("C2") = ThisWorkbook.Path
        Range("C3") = ThisWorkbook.FullName
    End Sub
    

    创建工作簿——add

    1. 创建空白工作簿:如果直接调用workbook对象的add方法,而不设置任何参数,excel将创建一个只含普通工作表的新工作簿
    2. 指定用来创建工作簿的模板: 如果想将某个工作簿文件作为新建工作簿的模板,可以使用add方法的template参数指定该文件的名称及其所在的所在目录
    3. 指定新建工作簿包含的工作簿类型
    workbooks.add 
    workbooks.add template:="D:\file\template.xlsm"
    workbooks.add template := xlWBATChart '让新建的工作簿包含图表工作表
    

    用add方法的参数指定新建的工作簿包含的工作表类型

    参数值工作簿包含的工作表类型
    xlWBATWorksheet普通工作表
    xlWBATChart图表工作表
    xlWBATExcel4Macrosheet4.0宏工作表
    xlWBATExcel4IntlMacrosheet5.0对话框工作表

    用open方法打开工作簿

    workbooks.open filename := "path"
    

    activate激活工作簿

    workbooks("workbooks_name").activate
    

    保存工作簿

    1. save方法保存已存在的文件
    2. saveas方法将工作簿另存为新文件
    3. 另存为新文件后不关闭原文件
    thisworkbooks.save 
    thisworkbooks.saveas filename:="path"
    thisworkbooks.savecopyas filename :="path"
    
    

    close——关闭工作簿

    workbooks.close  '关闭当前打开的所有工作簿
    workbooks("workbooks_name").close '关闭指定名称的工作簿
    workbooks.close savechanges := true '关闭并保存对工作簿的修改
    

    worksheet对象

    add方法新建工作表

    1. 在活动工作表前插入一张工作表
    2. 用before|after参数指定要插入工作表的位置
    3. 用count 参数指定要插入的工作表数量
    worksheets.add
    worksheets.add before|after := worksheet_name
    worksheets.add count:=number
    

    设置name属性,更改工作表的标签名称

    worksheets("worksheet_name").name = name
    

    用delete方法删除工作表

    worksheets('worksheet_Name').delete
    

    激活工作表的两种方法

    worksheets("worksheet_name").avtivate
    worksheets("worksheet_name").select
    

    用copy方法复制工作表

    1. 将工作表复制到指定位置
    2. 将工作表复制到新工作簿中
    worksheets('worksheet_name').copy before|after :=worksheet_name
    worksheets("worksheet_name").copy
    

    使用move移动工作表

    1. 将工作表移动到指定位置
    2. 将工作表移动到新工作簿中
    worksheets('worksheet_name').move before|after :=worksheet_name
    worksheets("worksheet_name").move
    

    设置visible属性,隐藏或者显示工作表

    worksheets("worksheet_name").visible =False or True
    

    访问count属性,获得工作簿中工作表的数目

    worksheets.count
    

    range对象

    用range属性引用单元格

    1. 引用单个固定的单元格区域:这种方法实际上就是通过单元格地址来引用单元格
    2. 引用多个不连续的单元格:将range属性的参数设置为一个用逗号分成多个单元格地址组成的字符串
    3. 引用多个区域的公共区域:将range属性设置成为一个用空格分割的多个单元格地址组成的字符串
    4. 引用两个区域围成的矩形区域
    range("A1:C1")
    range("A1:A10,E6,E7:C12").select
    range("B1:B10 A4:D6").value
    range("B6:B10","D2:D8")
    

    用cell属性引用单元格

    1. 引用工作表中指定行列交叉的单元格
    2. 引用单元格区域中的某个单元格
    3. 将cells属性的返回结果设置为range属性的参数
    4. 使用索引号引用单元格
    activesheet.cells(3,4) ‘选中第三行和第四列的交叉单元格D3’
    
    range("B3:F9").cells(2,3)=10 '在B3:F9区域的第2行与第3列交接处输入100'
    
    range(cells(1,1),cells(5,14)).select '指定A1:D5区域'
    
    activesheet.cells(2).value=200 '指定工作表的第二个单元格为200'
    

    引用整行单元格

    在VBA中,rows表示工作表或某个区域中所有行组成的集合,要引用工作表汇总指定的行,可以使用行号或者索引号两种方式

    activesheet.rows("3:3").select '选中活动工作表中的第三行'
    activesheet.rows("3:5").select '选中活动工作表的3-5行'
    activesheet.rows(3) '选中活动工作表的第三行'
    

    引用整列单元格

    在VBA中,columns表示工作表或某个区域中所有行组成的集合,要引用工作表汇总指定的行,可以使用行号或者索引号两种方式

    activesheet.columns("F:G").select '选中活动工作表中的第F-G列'
    
    activesheet.columns(3) '选中活动工作表的第6列'
    

    使用union方法合并多个单元格区域

    application对象的union方法返回参数指定的多个单元格区域的合并区域,使用该方法可以将多个range对象组合在一起,进行批量操作。

    application.union(range("A1:A10"),range("D1:D5")).select '同时选中两个区域'
    

    range对象的offset属性

    使用offset属性,可以获得相对于指定单元格区域一定偏移量位置上的单元格区域。offset有两个参数,分别用来设置该属性的父对象在上下或者左右方向上偏移的行列数

    range("B2:C3").offset(5,3).value=200 '将B2:C3区域右移3个单元格,下移5个单元格'
    

    range对象的resize属性

    使用range对象的resize属性可以将指定的单元格区域有目的地扩大或者缩小,得到一个新的单元格区域。

    range("B2").resize(4,5) '将B2区域扩大成了一个4行5列的区域'
    
    range("B2:E6").resize(2,1) '将原区域缩小为一个两行一列的区域'
    
    

    worksheet对象的usedrange属性

    worksheet对象的usedrange属性返回工作表中已经使用的单元格围城的矩形区域.usedrange属性返回的总是一个矩形区域,无论这些区域是否存在空行,空列或者空单元格

    activesheet.usedrange.select '选中活动工作表中已经使用的单元格区域'
    

    range对象的currentregion属性

    range对象的currentregion属性返回包含指定单元格在内的一个连续的矩形区域,空行及下面的区域以及空列及右面的区域不包含在currentregion区域内

    range("B5").currentregion.select
    

    range对象的end属性

    range对象的end属性返回包含指定单元格的区域最尾端的单元格,返回结果等同于在单元格中按【enter+方向键】得到的单元格

    range("C5").end(xlUP).address
    

    end参数及说明

    可设置的参数参数说明
    xlToLeft等同于在单元格中按【end+左方向键】
    xlToRight等同于在单元格中按【end+右方向键】
    xlUp等同于在单元格中按【end+上方向键】
    xlDown等同于在单元格中按【end+下方向键】

    value属性——单元格中的内容

    range("A1:B2").value="abc"
    

    count属性,获得区域中包含的单元格个数

    range("B4:F10").count
    range("B4:F10").rows.count
    range("B4:F10").columns.count
    

    通过address属性获取单元格地址

    msgbox "当前选中单元格的地址为"&selection.address
    

    用activate和select方法选中单元格

    activesheet.range("A1:F5").activate
    activesheet.range("A1:F5").select
    

    copy方法复制单元格区域

    无论复制多少单元格,destination参数只需要指定左上角单元格坐标就好

    range('region').copy destination:=range("other_region")
    

    cut方法剪切单元格区域

    无论剪切多少单元格,destination参数只需要指定左上角单元格坐标就好

    range('region').cut destination:=range("other_region")
    

    用delete方法删除指定的单元格

    调用range对象的delete方法可以删除指定的单元格,但与手动删除单元格不同,通过VBA代码删除单元格,excel不会显示【删除】对话框。想让excel在删除指定的单元格后,按自己的意愿处理其他单元格,我们需要编写VBA代码将自己的意图告诉excel。如想删除B3所在的整行单元格,应将代码写为:

    range("B3").entirerow.delete
    

    操作对象的一些例子

    根据需求创建工作簿

    利用VBA创建一个符合自己需求的工作簿,并将其保存到指定的目录中

    Sub wbadd()
        Dim wb As Workbook
        Dim sht As Worksheet
        Set wb = Workbooks.Add
        Set sht = wb.Worksheets(1)
        With sht
            .Name = "员工花名册"
        End With
        wb.SaveAs ThisWorkbook.Path & "员工花名册.xlsx"
        ActiveWorkbook.Close
        
        
    End Sub
    

    判断某个工作簿是否已经打开

    Sub isopen()
        Dim i As Integer
        For i = 1 To Workbooks.Count
            If Workbooks(i).Name = "成绩表.xlsx" Then
                MsgBox "成绩表文件已打开"
                Exit Sub
            End If
        Next
        MsgBox "文件未打开"
    End Sub
    

    判断文件夹中是否存在指定名称的工作簿文件

    Sub isexist()
        Dim fil As String
        fil = ThisWorkbook.Path & "\员工花名册.xlsx"
        If Len(Dir(fil)) > 0 Then
            MsgBox "文件存在"
        Else
            MsgBox "文件不存在"
        End If
        
    End Sub
    

    向未打开的工作簿中输入数据

    Sub wbinput()
        Dim wb As String, xrow As Integer, arr
        wb = ThisWorkbook.Path & "\员工花名册.xlsx"
        Workbooks.Open (wb)
        With ActiveWorkbook.Worksheets(1)
            xrow = .Range("A1").CurrentRegion.Rows.Count + 1
            arr = Array(xrow - 1, "马军", "男", #7/8/1987#, #9/1/2010#, "10年新招")
            .Cells(xrow, 1).Resize(1, 6) = arr
        End With
        ActiveWorkbook.Close savechanges:=True
        
        
    End Sub
    

    隐藏活动工作表外的所有工作表

    Sub shtvisible()
        Dim sht As Worksheet
        For Each sht In Worksheets
            If sht.Name <> ActiveSheet.Name Then
                sht.Visible = xlSheetVeryHidden
            End If
        Next
    End Sub
    

    批量新建指定名称的工作表

    Sub shtadd()
        Dim i As Integer
        Dim sht As Worksheet
        i = 1
        Set sht = Worksheets("Sheet11")
        Do While sht.Cells(i, "E") <> ""
           Worksheets.Add after:=Worksheets(Worksheets.Count)
           ActiveSheet.Name = sht.Cells(i, "E").Value
           i = i + 1
        Loop
        
    End Sub
    

    批量对数据进行分离,并保存到不同的工作表中

    Sub fenlie()
        Dim i As Long, bj As String, rng As Range
        i = 1
        bj = Worksheets("Sheet11").Cells(i, "C").Value
        Do While bj <> ""
            Set rng = Worksheets(bj).Range("A1048576").End(xlUp).Offset(1, 0)
            Worksheets("Sheet11").Cells(i, "A").Resize(1, 7).Copy rng
            i = i + 1
            bj = Worksheets("Sheet11").Cells(i, "C").Value
        Loop
    
    End Sub
    

    将多张工作表中的数据合并到一张工作表中

    Sub hebing()
        Dim sht As Worksheet
        Set sht = Worksheets("Sheet11")
        sht.Rows.Clear
        Dim wt As Worksheet, xrow As Integer, rng As Range
        For Each wt In Worksheets
            If wt.Name <> "Sheet11" Then
                Set rng = sht.Range("A1048576").End(xlUp)
                xrow = wt.Range("A1").CurrentRegion.Rows.Count
                wt.Range("A1").Resize(xrow, 7).Copy rng
            End If
        Next
    End Sub
    

    将工作簿中的每张工作表都保存为单独的工作簿文件

    Sub savetofile()
        Application.ScreenUpdating = False
        Dim folder As String
        folder = ThisWorkbook.Path & "\班级成绩表"
        If Len(Dir(folder, vbDirectory)) = 0 Then
            MkDir folder
        End If
        
        Dim sht As Worksheet
        For Each sht In Worksheets
            If sht.Name <> "Sheet11" Then
                sht.Copy
                ActiveWorkbook.SaveAs folder & "\" & sht.Name & ".xlsx"
                ActiveWorkbook.Close
            End If
        Next
        Application.ScreenUpdating = True
        
    End Sub
    

    将多个工作簿中的数据合并到同一张工作表中

    Sub hzwb()
        Dim bt As Range, r As Long, c As Long
        r = 1
        c = 7
        Dim wt As Worksheet
        Set wt = ThisWorkbook.Worksheets(1)
        wt.Rows(r & ":1045876").ClearContents
        Application.ScreenUpdating = False
        Dim filename As String, sht As Worksheet, wb As Workbook
        Dim erow As Long, fn As String, arr As Variant
        filename = Dir(ThisWorkbook.Path & "\*.xlsx")
        Do While filename <> ""
            If filename <> ThisWorkbook.Name Then
                erow = wt.Range("A1").CurrentRegion.Rows.Count
                fn = ThisWorkbook.Path & "\" & filename
                Set wb = GetObject(fn)
                Set sht = wb.Worksheets(1)
                arr = sht.Range(sht.Cells(r, "A"), sht.Cells(1048576, "B").End(xlUp).Offset(0, 5))
                wt.Cells(erow, "A").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
                wb.Close savechanges:=True
            End If
            filename = Dir
        Loop
        Application.ScreenUpdating = True
        
    End Sub
    

    为同一工作簿中的工作表建一个带链接的目录

    Sub mulu()
        Dim wt As Worksheet
        Set wt = Worksheets("Sheet11")
        wt.Rows("1:1048576").ClearContents
        Dim sht As Worksheet, irow As Integer
        irow = 1
        For Each sht In Worksheets
            If sht.Name <> "Sheet11" Then
                wt.Cells(irow - 1, "A").Value = irow - 1
                wt.Hyperlinks.Add anchor:=wt.Cells(irow - 1, "B"), Address:="", SubAddress:="'" & sht.Name & "'!A1", TextToDisplay:=sht.Name
            End If
            irow = 1 + irow
        Next
    End Sub
    

    其中参数anchor指定建立超链接的位置,address指定超链接的地址,subaddress指定超链接的子地址,TexttoDisplay指定用于显示超链接的文字

    执行程序的自动开关——对象的事件

    让excel自动相应我们的操作

    1. 打开thisworkbook的代码窗口
    2. 选择workbook对象,在声明中选择open
    3. 编写子程序

    当某个事件放生后自动运行的过程,称为事件过程,事件过程也是sub过程 。与sub过程不同的是,时间过程的作用域,过程名称及参数都不需要我们设置,也不能随意设置。时间过程的过程名称总是由对象名称及时间名称组成的,对象在前,事件在后,二者之间用下划线连接。

    使用工作表事件

    工作表事件就是发生在worksheet对象中的事件,一个工作簿中可能包含多个worksheet对象,而worksheet事件过程必须写在相应的worksheet中,只有过程所在的worksheet对象中的操作才能触发相应的事件。

    worksheet对象的change事件

    worksheet对象的change事件告诉VBA:当过程所在工作表中的单元格被更改时自动运行程序。

    编写事件过程,通常我们都采用这种方式:依次在【代码窗口】的【对象】列表框和【事件】列表框中选择相应的对象及事件名称,让VBA自动替我们设置事件过程的作用域、过程名称以及参数信息

    1. 更改单元格时自动执行
    Private Sub Worksheet_Change(ByVal Target As Range)
        MsgBox Target.Address & "被更改为" & Target.Value
        
    End Sub
    
    1. 更改部分单元格时自动执行
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Column <> 1 Then
            Exit Sub
        End If
        
        MsgBox Target.Address & "被更改为" & Target.Value
        
    End Sub
    

    禁用事件,让事件过程不再自动执行

    禁用事件就是执行操作后不让事件发生。在VBA中,可以设置application对象的EnableEvents属性为false来禁用事件

    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        Target.Offset(0, 1).Value = "测试一下"
        Application.EnableEvents = True
    End Sub
    

    selectionchange事件:当选中的单元格改变时发生

    worksheet对象的selectionchange时间告诉VBA:当更改工作表中选中的单元格区域时自动执行该事件的事件过程。

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        MsgBox "你当前所选中的单元格是:" & Target.Address
        
    End Sub
    
    

    高亮选择区域的相同值

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
       Range("A3:I66").Interior.ColorIndex = xlNone
       If Application.Intersect(Target, Range("A3:I66")) Is Nothing Then
            Exit Sub
        End If
        
       If Target.Count > 1 Then
        Set Target = Target.Cells(1)
       End If
       Dim rng As Range
       For Each rng In Range("A3:I66")
        If rng.Value = Target.Value Then
            rng.Interior.ColorIndex = 6
        End If
        Next
    End Sub
    

    用批注记录单元格中数据的修改情况

    Dim rngvalue As String
    
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Cells.Count > 1 Then
            Exit Sub
        End If
        Dim cvalue As String
        
        If Target.Formula = "" Then
            cvalue = "空"
        Else
            cvalue = Target.Text
        End If
        
        If rngvalue = cvalue Then
            Exit Sub
        
        End If
        Dim rngcom As Comment
        Dim comstr As String
        Set rngcom = Target.Comment
        If rngcom Is Nothing Then Target.AddComment
        comstr = Target.Comment.Text
        Target.Comment.Text Text:=comstr & Chr(10) & Format(Now(), "yyyy-mm-ddhh:mm") & _
            "原内容:" & rngvalue & "修改为:" & cvalue
        Target.Comment.Shape.TextFrame.AutoSize = True
        
    End Sub
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        If Target.Cells.Count > 1 Then
            Exit Sub
        End If
        If Target.Formula = "" Then
            rngvalue = "空"
        Else
            rngvalue = Target.Text
        End If
        
    End Sub
    
    

    常用的worksheet事件

    worksheet对象一共有17个时间,可以在【代码窗口】的【事件】列表框或VBA帮助中查看这些事件
    常用的worksheet事件

    事件名称时间说明
    activate激活工作表时发生
    beforeDelete在删除工作表之前发生
    beforeDoubleClick双击工作表之后,默认的双击操作之前发生
    beforeRightClick右击工作表之后,默认的右击操作发生之前
    calculate重新计算工作表之后发生
    change工作表中的单元格发生更改时发生
    deactivate工作表由活动工作表变为不活动工作表时发生
    followHyperlink单击工作表中的任意超链接时发生
    PivotTableUpdate在工作表中更新数据透视表后发生
    selectionchange工作表中所选内容发生更改时发生

    使用工作簿事件

    工作簿事件是发生在workbook对象中的事件,一个workbook对象代表一个工作簿,workbook对象的事件过程必须写在ThisWorkbook模块中,可以在【工程资源管理器】中找到这个模块

    open事件:当打开工作簿时发生

    open事件是最常用的workbook事件之一,同国外吗会使用该事件对excel进行初始化设置,如设置想打开工作簿看到的excel窗口或工作界面,显示我们自定义的用户窗体等

    beforeclose事件: 在关闭工作簿之前发生

    private sub workbook_beforeclose(cancel as boolean)
        if msgbox("你确定要关闭工作簿吗?",vbyesno) =vbno then
            cancel =true
        end if
    end sub
    

    sheetchange事件:更改任意工作表中的单元格时发生

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
        MsgBox "你正在更改的是:" & Sh.Name & "工作表中的" & Target.Address & "单元格"
    End Sub
    

    常用的workbook事件

    事件名称事件说明
    activate当激活工作簿时发生
    AddinInstall当工作簿作为加载宏安装时发生
    AddinUninstall当工作簿作为加载宏卸载时发生
    AfterSave当保存工作簿之后发生
    BeforeClose当关闭工作簿之前发生
    BeforePrint在打印指定工作簿之前发生
    beforesave在保存工作簿之前发生
    Deavtivate在工作簿状态作为非活动状态时发生
    NewChart在工作簿新建一个图表时发生
    Newsheet在工作簿新建一个工作表时发生
    open打开工作簿时发生
    sheetavtivate激活任意工作表时发生
    sheetBeforeDoubleClick在双击任意工作表之前发生
    sheetBeforeRightClick在右击任意工作表之前发生
    sheetCalculate在重新计算工作表之后发生
    SheetChange当更改了任意工作表的单元格之后发生
    sheetDeactivate当任意工作表转为非活动状态时发生
    sheetFollowHyperLink当单击工作簿中的任意超链接时发生
    SheetPivotTableUpdate当更新任意数据透视表时发生
    sheetSelectionchange当任意工作表中的选定区域发生更改时发生
    WindowActivate在激活任意工作簿窗口时发生
    windowdeactivate当任意窗口变为不活动窗口时发生
    windowresize在调整任意工作簿窗口大小时发生

    不是事件的事件

    application对象的onkey方法

    OnKey方法告诉excel,当按下键盘上指定的键或者组合键时,自动执行指定的程序

    Sub test()
        Application.OnKey "+e", "Hello"
    End Sub
    
    Sub Hello()
        MsgBox "我在学习onkey方法"
    End Sub
    

    在onkey中可以设置的按键及其对应代码

    要使用的键应设置的代码
    Backspace{backspace} or {BS}
    Break{Break}
    Caps Lock{CAPSLOCK}
    Delete or Del{DELETE} OR {DEL}
    向下箭头{DOWN}
    End{END}
    Enter(数字小键盘){ENTER}
    ENTER~
    Esc{ESCAPE} OR {ESC}
    Home{HOME}
    Ins{INSERT}
    向左箭头{LEFT}
    Num Lock{NUMLOCK}
    PageDown{PGDN}
    PageUp{PGUP}
    向右箭头{RIGHT}
    Scroll Lock{SCROLLLOCK}
    Tab{TAB}
    向上箭头{UP}
    F1到F15{F1}到{F15}
    Shift+
    Crtl^
    Alt%

    Application对象的OnTime方法

    Ontime方法告诉VBA,在指定的时间自动执行指定的过程

    Sub test()
        Application.OnTime TimeValue("14:07:00"), "Hello"
    End Sub
    
    Sub Hello()
        MsgBox "我在学习ontime方法"
    End Sub
    

    Ontime的DateSerial参数可以设置指定的年月日;Scheduled的值如果为TRUE,会新设置一个Ontime过程,如果为False,就会清除之前设置的过程,默认值为TRUE

    让文件自动保存

    Sub test()
        Application.OnTime Now() + TimeValue("00:05:00"), "AutoSave"
    End Sub
    
    Sub AutoSave()
        ThisWorkbook.Save
        Call test
    End Sub
    

    设置自定义的操作界面

    控件,搭建操作界面必不可少的零件

    excel中有两种类型的控件:表单控件和ActiveX控件。可以在excel的【功能区】中找到它们

    1. 表单控件
    控件名称控件说明
    按钮用于执行宏命令
    组合框提供可选择的多个选项,用户可以选择其中一个项目
    复选框用于选择的控件,可以多项选择
    数值调节按钮通过单击控件的箭头来选择数值
    列表框显示多个选项的列表,用户可以从中选择一个选项
    选项按钮用于选择的控件,通常几个选项按钮用组合框组合在一起使用,在一组中只能同时选择一个选项按钮
    分组框用于组合其他多个控件
    标签用于输入和显示静态文本
    滚动条包括水平滚动条和垂直滚动条
    1. ActiveX控件:excel中有11中可用的ActiveX控件,但是工作表总使用的ActiveX控件不止这些,可以单击其中的【其他控件】按钮,在弹出的对话框中选择其他控件

    在工作表中使用控件

    1. 添加表单控件


    2. 绘制表单控件


    3. 设置相应区域

    在工作表中使用ActiveX控件

    1. 添加ActiveX控件


    2. 设置属性

    1. 编写控件代码
    Private Sub xb2_Click()
          If xb2.Value = True Then
            Range("D2").Value = "女"
            xbl.Value = False
        End If
    End Sub
    
    Private Sub xbl_Click()
        If xbl.Value = True Then
            Range("D2").Value = "男"
            xb2.Value = False
        End If
           
    End Sub
    
    1. 显示内容

    不需设置,使用现成的对话框

    用InputBox函数创建一个可输入数据的对话框

    Input函数共有5个参数:

    1. prompt参数用于设置在对话框中显示的提示消息
    2. title用于设置对话框的标题
    3. default用于设置默认的输入值
    4. xpos用于设置对话框与左端与屏幕左端的距离
    5. ypos用于设置对话框的顶端与屏幕顶端的距离
    Sub inbox()
        Dim c As Variant
        c = InputBox("你要在A1单元格输入什么数据?", Title:="提示", Default:="叶飞", xpos:=200, ypos:=250)
        Range("A1").Value = c
        
    End Sub
    

    用input方法创建交互对话框

    用application对象的inputbox方法也可以创建于程序互动的对话框,但要注意与Inputbox函数相比,Input方法的参数有些许不同

    application.inputbox(prompt:="内容",title:= “标题”
        default := "默认值", left := "与屏幕左端距离"
        top := “与屏幕右端距离”, type := "输入数据的类型")
    

    type参数的可设置项及说明

    可设置的参数值方法返回结果的类型
    0公式
    1数字
    2文本(字符串)
    4逻辑值(true or false)
    8单元格引用(range对象)
    16错误值
    64数值数组
    Sub rngpinput()
        Dim rng As Variant
        On Error GoTo cancel
        Set rng = Application.InputBox("请选择需要输入数值的单元格", Type:=8)
        rng.Value = 100
    cancel:
        
    End Sub
    

    使用msgbox函数创建输出对话框

    Sub msg()
        MsgBox "你正在编辑的是:" & ThisWorkbook.Name, Buttons:=vbOKOnly + vbInformation, Title:="提示"
       
    End Sub
    

    设置在对话框中显示的按钮样式

    常数说明
    vbOkonly0只显示【确定】按钮
    vbOkcancel1只显示【确定】和【取消】按钮
    vbAbortRetryIgnore2显示【终止】,【重试】,【忽略】三个按钮
    vbYesNoCancel3显示是,否,取消三个按钮
    vbYesNo4显示是,否两个按钮
    vbRetryCancel5显示重试,取消两个按钮

    不同图标的参数设置

    常数说明
    vbCritical16显示【关键信息】图标
    vbQuestion32显示【警告询问】图标
    vbExclamation48显示【警告消息】图标
    vbInformation64显示【通知消息】图标

    设置对话框中的默认按钮
    常数|值|说明
    vbDefaultButton1 | 0 | 第一个按钮为默认值
    vbDefaultButton2 | 256 | 第二个按钮为默认值
    vbDefaultButton3 | 512 | 第三个按钮为默认值
    vbDefaultButton4 | 768 | 第四个按钮为默认值

    指定对话框的类型

    常数说明
    vbApplicationModel0应用程序强制返回;应用程序暂停执行,直到用户消息框做出响应才继续
    vbSystemModel4096系统强制返回;全部应用程序都暂停执行,直到用户对消息框做出响应才继续工作

    buttons参数的其他设置

    常数说明
    vbMsgBoxHelpButton16384在对话框中添加帮助按钮
    vbMsgBoxForeground65536设置显示的对话框窗口为前景窗口
    vbMsgBoxRight524288设置对话框中显示的文本为右对齐
    vbMsgBoxRtlReading1048576指定文本英在希伯来文和Alibaba系统中显示为从右到左阅读

    MsgBox函数的返回值

    常数说明
    vbOk1单击【确定】按钮时
    vbCancel2单击【取消】按钮时
    vbAbort3单击【终止】按钮时
    vbRetry4单击【重试】按钮时
    vbIgnore5单击【忽略】按钮时
    vbYes6单击【是】按钮时
    vbNo7单击【否】按钮时
    Sub msgbut()
        Dim yn As Integer
        yn = MsgBox("你确定要在A1单元格输入今天的日期吗?", vbYesNo + vbQuestion)
        If yn = vbYes Then
            Range("A1").Value = Now()
        End If
        
    End Sub
    

    使用FindFile方法显示【打开】对话框

    使用application对象的FindFile方法可以显示【打开】对话框,在对话框中选择并打开某个文件

    Sub openfile()
        If Application.FindFile = True Then
            MsgBox "the file you chosed has benn open"
        Else
            MsgBox "你单击了【取消按钮】,操作未完成"
        End If
            
    End Sub
    

    用GetOpenFileName方法显示【打开】对话框

    与findfile方法不同,使用GetOpenFileName方法是获得在对话框中选中的文件的文件名称(包含路径),而findfile是打开在对话框中选中的文件

    1. 选择任意文件
    Sub getopen()
        Dim fil
        fil = Application.GetOpenFilename
        If fil = False Then
            MsgBox "没有任何文件"
            Exit Sub
        Else
            Range("E6").Value = fil
        End If
    End Sub
    
    1. 只在对话框中显示某种类型的文件
    Sub getopen()
        Dim fil
        fil = Application.GetOpenFilename(filefilter:="图片文件,*.jpg")
        If fil = False Then
            MsgBox "没有任何文件"
            Exit Sub
        Else
            Range("E6").Value = fil
        End If
    End Sub
    
    1. 让对话框同时显示多种扩展名文件
    Sub getopen()
        Dim fil
        fil = Application.GetOpenFilename(filefilter:="图片文件,*.jpg;*png")
        If fil = False Then
            MsgBox "没有任何文件"
            Exit Sub
        Else
            Range("E6").Value = fil
        End If
    End Sub
    
    1. 让对话框能选择显示多种类型的文件
    Sub getopen()
        Dim fil
        fil = Application.GetOpenFilename(filefilter:="图片文件,*.jpg;*png,Excel工作簿文件,*xls;*xlsx")
        If fil = False Then
            MsgBox "没有任何文件"
            Exit Sub
        Else
            Range("E6").Value = fil
        End If
    End Sub
    
    1. 通过FilterIndex参数设置默认显示的文件类型
      如果在【文件类型】下拉列表中设置了多种可选择的文件类型,就可以通过GetOpenFileName方法的FiterIndex参数,设置对话框中默认显示的文件类型
    Sub getopen()
        Dim fil
        fil = Application.GetOpenFilename(filefilter:="图片文件,*.jpg;*png, Excel工作簿文件, *xls;*xlsx", FilterIndex:=2)
        If fil = False Then
            MsgBox "没有任何文件"
            Exit Sub
        Else
            Range("E6").Value = fil
        End If
    End Sub
    
    1. 设置允许同时选择多个文件
      默认情况下,在通过GetOpenFileName方法显示的【打开】对话框中,只能同时选中一个文件,如果希望同时选中多个文件,可以将MultiSelect参数设置为TRUE
    Sub getopen()
        Dim fil
        fil = Application.GetOpenFilename(filefilter:="图片文件,*.jpg;*png, Excel工作簿文件,*xls;*xlsx", FilterIndex:=2, MultiSelect:=True)
         Range("E6").Value = fil
    End Sub
    
    1. 修改对话框标题
    Sub getopen()
        Dim fil
        fil = Application.GetOpenFilename(filefilter:="图片文件,*.jpg;*png, Excel工作簿文件,*xls;*xlsx", FilterIndex:=2, MultiSelect:=True, Title:="请选择你要获取名称的文件")
         Range("E6").Value = fil
    End Sub
    

    用GetSaveAsFilename方法显示【另存为】对话框

    要想获得选中的文件名称,还可以调用application对象的GetSaveAsFilename方法打开【另存为】对话框,在对话框文中选择文件,获得该文件包含路径信息的文件名称

    Sub getsaveas()
        Dim fil As String, filename As String, filter As String, tile As String
        filename = "例子"
        filter = "Excel工作簿,*xls;*xlsx,Word文档,*.doc;*.docx"
        Title = "请选择要获取信息的文件"
        fil = Application.GetSaveAsFilename(InitialFileName:=filename, fileFilter:=filter, Title:=Title, FilterIndex:=2)
        Range("A10") = fil
    End Sub
    

    使用application对象的FileDialog属性获取目录名称

    如果想要获得的不是文件名,而是指定目录的路径及名称,可以使用application对象的FileDialog属性。

    Sub getfolder()
        With Application.FileDialog(filedialogtype:=msoFileDialogFilePicker)
            .InitialFileName = "D:\"
            .Title = "请选择一个目录"
            .Show
            If .SelectedItems.Count > 0 Then
                Range("A1").Value = .SelectedItems(1)
            End If
        End With
    End Sub
    
    

    msoFileDialogType参数可以设置的常量

    常量说明
    msoFileDialogFilePicker允许选择一个文件
    msoFileDialogFolderPicker允许选择一个文件夹
    msoFileDialogOpen允许打开一个文件
    msoFileDialogSaveAs允许保存一个文件

    使用窗体对象设置交互界面

    很多时候,我们都希望自己能够设计一个交互界面,定义其中的控件及控件的功能,这就需要用到VBA中的另一类常用对象——Userform对象。一个用户窗体就是一个Userform对象,也就是大家常说的窗体对象。当在工程中添加一个窗体后,就可以在窗体上自由的添加ActiveX控件,只要通过编写VBA代码为这些控件指定功能,就能利用这些控件与excel互动

    1. 在工程中添加一个用户窗体

    1. 设置属性,改变窗体的外观

    1. 在窗体中添加和设置控件的功能

    用代码操作自己设计的窗体

    显示窗体

    1. 手动显示窗体

    在VBE窗口中选中窗体,依次执行【运行】——>【运行子过程/窗体】命令,即可显示选中的窗体

    1. 在程序中用代码显示窗体
    sub showform()
        load inputform
        inputform.show
    end sub
    

    将窗体显示为无模式窗体

    1. 模式窗体不能操作窗体之外的对象

    要将窗体显示为模式窗体,可以使用代码

    InputForm.show
    

    或者省略show方法的参数,或者将参数设置为vModal,VBA都会讲窗口见识为模式窗体
    2. 无模式窗体允许进行窗体外的其他操作

    要将窗体显示为无模式窗体,必须通过show方法制定参数

    Inputform.show vmodeless
    

    如果将窗体显示为无模式窗体,当窗体显示后,系统会继续执行程序余下的代码,也允许我们操作窗体之外的其他对象

    关闭或隐藏已显示的窗体

    1. 用unload命令关闭窗体
    unload Inputform
    
    1. 使用Hide方法隐藏窗体
    inputform.hide
    

    用户窗体的事件应用

    借助Initialize事件初始化窗体

    Initialize事件发生在显示窗体之前,当我们在程序中使用load语句加载窗体,或者使用show显示窗体时,都会引发该时间

    Private Sub UserForm_Initialize()
        性别.List = Array("男", "女")
    End Sub
    

    借助QueryClose事件让窗体自带的【关闭】按钮失效

    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        If CloseMode <> vbFormCode Then Cancel = True
    End Sub
    

    queryclose事件过程是一个带两个参数的sub过程,其中的cancel参数确定是否响应我们关闭窗体的操作。当值为TRUE时,程序将不响应我们关闭窗体的操作。如果cancel的值为false,程序将关闭窗体。其中CloseMode参数是我们关闭窗体的方式,不同的关闭方式返回的值也不相同

    CloseMode参数的返回值说明

    常数说明
    vbFormControlMenu0在窗体中单击【关闭】按钮关闭窗体
    vbFormCode1通过unload语句关闭窗体
    vbAppWindows2正在结束当前Windows操作环境的过程
    vbAppTaskManagee3windows的【任务管理器】正在关闭整个应用

    为窗体的控件设置功能

    为【确定】按钮添加事件过程

    Private Sub cmd_OK_Click()
        Dim xrow As Long
        xrow = Range("A1").CurrentRegion.Rows.Count + 1
        Cells(xrow, "A").Value = 姓名.Value
        
        Cells(xrow, "B").Value = 性别.Value
        Cells(xrow, "C").Value = birth.Value
        姓名.Value = ""
        性别.Value = ""
        birth.Value = ""
    End Sub
    

    给控件设置快捷键

    给按钮设置了快捷键后,显示窗体时,当按下对应的快捷键就等于在窗体中用鼠标单击了该按钮。

    Private Sub UserForm_Initialize()
        性别.List = Array("男", "女")
        cmd_OK.Accelerator = "N"
    End Sub
    

    更改控件的Tab键顺序

    只有对象被激活时,才能几首键盘输入。控件的Tab键顺序决定用户按下【Tab】或【Shift+Tab】组合键后控件激活的顺序。在设计窗体时,系统会按照添加控件的先后顺序确定控件的Tab顺序。但是这个顺序是可以更改的。在VBE中选中窗体,依次执行【视图】——>【Tab键顺序】命令。调出Tab键顺序对话框,即可在其中调整控件的Tab键顺序

    用窗体设计一个简易的登陆窗体

    1. 设计窗体显示


    2. 添加代码,为控件指定功能

    
    
    Private Sub cmd_cacel_Click()
        Unload 用户登录
        ThisWorkbook.Close savechanges:=False
    End Sub
    
    Private Sub cmd_ok_Click()
        Application.ScreenUpdating = False
        Static i As Integer
        If CStr(username.Value) = Right(Names("username").RefersTo, Len(Names(username).RefersTo) - 1) And CStr(pwd.Value) = Right(Names("userword").RefersTo, Len(Names("userword").RefersTo) - 1) Then
            Unload 用户登录
        Else
            i = i + 1
            If i = 3 Then
                MsgBox "你无权打开工作簿"
                ThisWorkbook.Close savechanges:=False
            Else
                msg "输入错误,你还有" & (3 - i) & "次机会输入"
                username.Value = ""
                pwd.Value = ""
            End If
        End If
        Application.ScreenUpdating = True
        
    End Sub
    
    Private Sub pwd_set_Click()
         Dim old As String, new1 As String, new2 As String
        old = InputBox("请输入密码:", "提示")
        If old <> Right(Names("userword").RefersTo, Len(Names("userword").referto) - 1) Then
            MsgBox "原密码输入错误,不能修改", vbCritical, "错误"
            Exit Sub
        End If
        new1 = InputBox("请输入新密码:", "提示")
        If new1 = "" Then
            MsgBox "新密码不能为空,修改没有完成", vbCritical, "错误"
            Exit Sub
        End If
        new2 = InputBox("请再次输入新密码:", "提示")
        If new1 = new2 Then
            Names("userword").RefersTo = "=" & new1
            ThisWorkbook.Save
            MsgBox "密码修改完成"
        Else
            MsgBox "两次密码输入不一致,修改未完成", vbCritical, "错误"
        End If
        
    End Sub
    
    Private Sub user_set_Click()
        Dim old As String, new1 As String, new2 As String
        old = InputBox("请输入用户名:", "提示")
        If old <> Right(Names("username").RefersTo, Len(Names("username").referto) - 1) Then
            MsgBox "原用户名输入错误,不能修改", vbCritical, "错误"
            Exit Sub
        End If
        new1 = InputBox("请输入新用户名:", "提示")
        If new1 = "" Then
            MsgBox "新用户名不能为空,修改没有完成", vbCritical, "错误"
            Exit Sub
        End If
        new2 = InputBox("请再次输入新用户名:", "提示")
        If new1 = new2 Then
            Names("username").RefersTo = "=" & new1
            ThisWorkbook.Save
            MsgBox "用户名修改完成"
        Else
            MsgBox "两次用户名不一致,修改未完成", vbCritical, "错误"
        End If
        
    End Sub
    

    调试与优化编写的代码

    On Error GoTo标签

    On Error GoTo 标签实际就是在“on error”的后面加了一个GoTo语句,其中的“标签”就是替goto语句设置的标签,是一个数字或者带冒号的文本。标签告诉VBA,当程序运行过程中晕倒运行时错误时,跳转到标签所在行的代码继续执行程序,实际上就是让程序跳过出错的代码,从另一个地方重新开始执行程序。

    Sub test()
        On Error GoTo a
        Worksheets("abc").Select
       Exit Sub
    a: MsgBox "没有要选择的工作表"
    
    End Sub
    

    on error resume next

    Resume Next告诉VBA,如果程序发生错误,则忽略存在错误的代码,接着执行错误行之后的代码。如果程序一开始加入On Error Resume Next语句,运行程序时,及时程序中存在运行时错误,VBA也不会中断程序,而是忽略所有存在错误的语句,继续执行出错语句后的代码

    Sub test()
        On Error Resume Next
        Worksheets("abc").Select
        Exit Sub
        MsgBox "没有要选择的工作表"
    
    End Sub
    

    On Error GoTo 0

    使用On Error GoTo 0语句后,将关闭对程序中运行时错误的捕捉,如果程序在On Error GoTo 0语句后出现运行错误,将不会被捕捉到

    Sub test()
        On Error GoTo 0
        Worksheets("abc").Select
       Exit Sub
        MsgBox "没有要选择的工作表"
    
    End Sub
    
    展开全文
  • ppt_VBA编程初步

    2018-07-11 18:44:07
    VBA是Visual Basic for Application的意思,可以侠义的理解为PPT(或者EXCEL、WORD)里面的VB程序,在这些工具里面都可以使用ALT+F11打开VBE(VB编辑器),在VBE里面就可以输入、修改、调试VBA程序
  • EXCEL VBA编程进阶

    万人学习 2016-02-06 11:14:19
    数组:为了提高VBA的运算速度,特别讲解了数组。以及他的相关应用 图形:这是精彩的部分。讲了图形的各种批量插入方式。通过坐标自动绘制图形。批量制作员工卡等实例。很多实例在工作上都能用到。
  • 摘 要:微软Office中的VBA编程功能可以将办公操作自动化。...本文首先介绍了VBA编程在翻译中应用的可能性及VBA编程的一些特点,然后通过一些实例来证明VBA编程在原文和译文等译前和译后文档编辑活动...

    摘  要:微软Office中的VBA编程功能可以将办公操作自动化。由于现代翻译中绝大多数原文和译文都用办公软件呈现,而且现代翻译中译前和译后的编辑工作基本上都可以在office软件中完成,因此VBA编程可以将翻译实践中的许多操作自动化,从而提高翻译效率。本文首先介绍了VBA编程在翻译中应用的可能性及VBA编程的一些特点,然后通过一些实例来证明VBA编程在原文和译文等译前和译后文档编辑活动中有重要的作用,希望能够促进VBA编程在翻译中的应用研究。

    关键词:VBA;编程;翻译;

    一、        引言

    VBA是微软公司开发的面向办公软件的一种编程语言。这种编程语言可以将许多微软办公软件中的操作自动化,从而节省用户大量的时间和精力(Mansfield,2010:xxvii,3;2008:xxvii,3)。利用VBA可以将一些简单重复性的工作编写为程序代码,从而通过运行代码自动完成办公任务,提高文字处理、数字统计和信息管理等办公效率。现代翻译大多数以办公软件特别是Word的形式呈现,因此利用VBA编程可以提高翻译效率并保证翻译质量,特别是译前和译后的原文与译文编辑、修订的效率和质量。本文以翻译中的几个实例说明VBA编程在翻译中的应用,希望今后有更多人参与到相关研究中。

    二、        VBA编程在翻译应用研究

    由于VBA编程在办公自动化过程中有重要的作用,对其在各个领域的应用研究也非常广泛。根据知网上面以“VBA的应用”为检索词所得到的结果,VBA编程在其他各个领域应用的研究非常普遍,但是在翻译方面的应用却搜不到任何文献。造成这种现象的主要原因是国内大多数翻译实践和翻译理论研究者出身于外语专业,而以外语这种文科专业为背景的学者多少都有一点“技术恐惧症”:对技术性的问题不敢尝试。而大多数计算机基础类的课程又很少涉及办公软件中的高级用法,造成大多数翻译实践人员对微软办公中的许多高级应用知识知之甚少。正如有学者指出的,“80%的Word用户,其实只知道它20%的功能”(徐彬,2017)。许多人甚至根本不知道微软办公软件还有编程功能。

    文字处理是翻译实践中最重要的工作内容,在现代翻译中,绝大多数的原文和译文都是以办公软件特别是微软Word的形式呈现。VBA可以扩充办公软件的功能,使文字处理等办公操作自动化,因此在翻译原文和译文的编辑、修订过程中也应该有重要作用。虽然上文说在知网上搜不到VBA编程与翻译之间关系的文献,但这并不是说没有人知道VBA编程在翻译中的重要作用。例如,徐彬就多次提到了录制宏(其实就是VBA编程最基本的部分)在处理译文标点符号(2007:80)、术语收集整理(2010:47;2017:97)、隐藏奇数段落以获得原文与译文逐段对照的格式(2017:97)中的作用,以及在其他方面的应用(2014:108)。王华树也在其主编的翻译技术教材中将“宏编程基础与文本处理”作为翻译技术课程体系构建中计算机基础部分的一项内容。此外,王华树(2013)也多次在其研究中提到了Java和Python等计算机语言在翻译中的作用。因此,计算机编程应该成为计算机辅助翻译能力的一部分,而并不是可有可无的技术。

    作为办公软件的一部分,VBA编程与办公软件操作密切相关,比其他独立编程语言更容易学习和掌握。翻译实践人员可以在学会VBA编程的基础上将自己反复使用的操作进行编程,从而实现操作的自动化,节省时间和精力,而将更多的时间投入到翻译过程中译文理解和语言转换等创造性的工作上。

    必须指出,虽然上文提到录制宏也可以完成一些重复性的操作,但是录制宏的功能非常有限。翻译实践人员想要通过VBA编程解决翻译中的实际问题,最好还是要学会自己编写VBA代码。原因主要有以下四点。

    第一,不是所有的办公软件都有宏录制功能。在微软系列办公软件中,只有Word、Excel和PowerPoint提供了录制宏的功能,而其他office软件并没有这个功能。特别是Access这个数据库软件在开发基于数据的程序方面具有非常重要的作用,但是却无法通过录制宏生成宏程序代码,自动完成各种操作。

    第二,宏录制不能将两种以上软件结合起来使用。微软的各个办公软件都有自己的优势,如Word利于编辑处理文字,Excel利于处理表格和数字信息,PowerPoint利于演示,Access利于各种数据处理。一般来说,用户在办公时很少能够同时使用两个以上办公软件。即使需要使用也需要另外打开一种程序文件,如译者可以查找存储在Excel中的英汉术语表并且将相关术语插入到Word文件中,就需要同时打开Word和Excel文件,通过在两个不同类型的文档之间复制粘贴来完成任务。然而在VBA编程中,各个不同软件之间可以相互调用。这样就可以用一种办公软件同时操作两个以上的软件,从而将各个不同软件之间的功能结合起来使用。

    第三,并不是所有的办公操作都能通过录制宏来完成。宏录制只是将用户的某些操作通过VBA代码记录了下来,而这些代码通常会受到录制宏时所处理的文件对象本身的限制。例如,如果一个文档只有六个段落,而用户通过录制宏将这六个段落依次复制到了另一个文件中,以后启动录制的程序代码就只能复制六个段落,如果一个文档段落超过了六个,后面的段落就无法复制。

    第四,即使有些操作可以用宏录制,而且以后启动后完全可以满足用户的操作要求,也会产生冗余代码。例如,以下两个代码块的执行都可以将所选文字设置为隐藏字体,由于第一个是通过录制宏产生的代码块,而第二个是编写的代码块,结果代码长度差别很大。因为在第一个代码块中除了两个语句是有效语句以外,其他语句代码都是冗余代码。这样的代码如果不删除虽然并不会影响自动完成操作任务,但是代码过长却会拖慢程序运行速度,从而影响操作效率,而且代码过长也会影响以后对程序的维护和修改。

    WithSelection.Font

        .Hidden = True  '有效语句

        .SmallCaps = False

        .AllCaps = False

        .Color = wdColorBlue  '有效语句

        .Engrave = False

        .Superscript = False

        .Subscript = False

        .Spacing = 0

        .Scaling = 100

        .Position = 0

        .Kerning = 1

        .Animation = wdAnimationNone

        .DisableCharacterSpaceGrid = False

        .EmphasisMark = wdEmphasisMarkNone

        .Ligatures = wdLigaturesNone

        .NumberSpacing = wdNumberSpacingDefault

        .NumberForm = wdNumberFormDefault

        .StylisticSet = wdStylisticSetDefault

        .ContextualAlternates = 0

    End With

    录制宏产生的代码

    WithSelection.Font

        .Hidden = True

        .Color = wdColorBlue

    End With

    编写的代码

    三、        VBA编程与计算机辅助翻译软件的共同设计原则

    计算机辅助翻译技术“利用计算机模拟人脑记忆功能的机制,把翻译过程中简单、重复性的记忆活动交给计算机来做,将译者从机械性的工作中解放出来,全力关注翻译活动本身”(王华树,2017)。目前所有的计算机辅助软件的设计都是基于这条原则。VBA编程也是基于相似的原则,它可以让用户将办公过程中一些常见的重复性工作通过VBA代码编写为程序,然后通过运行程序而自动完成同样的操作。由于VBA和计算机辅助翻译软件有相似的设计原则,并且VBA编程主要处理的是各种办公操作,所以VBA应该成为现代翻译技术的一个组成部分,用来处理翻译过程中的各种文档操作。例如,在汉英翻译中,译文单词之间可能有一些多余的空格,通常可以用Word的查找和替换功能并结合Word通配符来将多个空格替换为一个空格。具体做法是使用查找和替换对话框中的“使用通配符”,在查找框中输入一个空格和{2,},在替换框中输入一个空格,然后点“全部替换”就可以清除全部的多余空格。在一般人看来,这个操作已经非常方便快捷。实际上这个操作因为反复使用可以编写为程序,以后就可以通过运行程序来自动完成,而不必每次都调用查找和替换对话框,并且在查找和替换框中输入查找和替换项。而且还可以将这个程序通过命令按钮加载到常用工具栏中并且为程序设置一个快捷键,以后需要时直接点击这个命令按钮或按快捷键就可以直接完成操作。

    四、        VBA编程的特点

    利用各种编程语言将日常生活和工作中的操作自动化已经非常普遍。为了满足各种不同编程的需要,现在也出现了各种不同的编程语言,如Perl、Python等。由于VBA与办公软件相结合,而翻译实践主要用的是各种办公软件,所以对于翻译实践中的各种操作而言,VBA有以下的特点和优势。

    (一)操作便捷

       微软VBA所编写的程序可以指定为常用工具栏的命令按钮,或指定快捷组合键,或通过给文件中添加命令按钮来运行,甚至还可以指定程序自动运行,因此使用起来非常方便快捷。对于一些个人常用的程序,可以存为文件模板,并且用命令按钮的形式加载在常用工具栏中,以后使用时像点击其他命令按钮一样来完成相应的操作。图1中最右侧的三列三行命令按钮就是将一些常用操作编写为VBA小程序,并以命令按钮的形式加载到了Word工具栏中。这样就可以点击Word命令按钮一样就可以完成所需要的操作。

    42b31853-091c-eb11-8da9-e4434bdf6706.png

    图1 加载为工具按钮的VBA小程序 

    同时,有些稍微复杂一点的小程序,由于代码较长,可以单独保存为启用宏的Word文档(后缀名为.docm),并且给文档中添加一个程序启动按钮,并且将程序的操作说明直接写到文档中。为了保证程序的安全性和不被误改,可以使用Word的限制编辑功能。这样的文档以后再次使用时,只要打开文档,点击启动按钮就可以自动运行。不仅操作方便,而且还可以像一个小软件一样与团队成员或朋友相互分享。图2就是这样一个启动了宏程序的Word文档的部分截图。

    4bb31853-091c-eb11-8da9-e4434bdf6706.png

    图2 添加了启动按钮和操作说明的启动宏的Word文档

    (二)简单易学

    与其他大多数编程语言相比,VBA编程简单易学,容易上手。首先,用户不必学习和掌握许多与编程相关的知识。因为VBA内置于微软应用软件中,所以利用VBA编写程序不需要专门的集成开发环境,也就不需要学习开发环境软件。大多数程序开发者除了要掌握一门计算机编程语言之外,还需要学习和掌握操作系统知识、数据库知识和计算机网络知识。而利用VBA编程,程序编写人员只要掌握了VBA语言并且熟悉微软办公软件的各种操作就可以编写一些简单实用的程序。其次,由于VBA语言中所涉及的各种对象、属性、方法和事件都对应于应用软件中的各种不同操作,因此编写的代码也相对容易理解和掌握,而且VBA的帮助文件提供了非常详细的查询,学习者可以通过查找帮助文件,较快掌握VBA中各种对象、属性、方法和事件的编码。再次,VBA编辑器提供了自动插入功能,自动显示各个对象所涉及的属性、方法、数据类型,以及各种常量,用户只需根据自己的编程需要进行选择,更容易学习。最后,通过上文所提到的微软办公软件提供的宏录制功能,初学者可以较快理解各种代码的含义。因此,即使不熟悉算法的初学者也可以通过录制宏查看程序代码,从而熟悉各种算法和程序编码。

    (三)灵活定制

    VBA虽然基于微软办公软件,但是它能够满足不同目的的编程需求。可以根据用户的需要编写简单实用的代码完成实现小的办公操作的自动化,同时也可以通过调用其他办公软件的VBA编程实现复杂任务的自动化操作。因为不同的用户用办公软件来完成不同的任务,所以不同的用户可以根据自己的需要编写不同的代码,实现不同操作的自动化。对于翻译来说,从译前原文文档的处理到译后译文的编辑都可以使用VBA编程实现翻译编辑过程某些操作的自动化。此外,VBA编程也可以用于翻译术语管理之中。

    五、        VBA编程在翻译应用中实例

    以翻译技术为基础的翻译流程包括译前、译中和译后三个过程。VBA编程主要出现在译前的原文文本编辑和译后的译文文本加工,其次也可以应用于翻译术语管理方面(李海亭,2019)。以下就用几个实例说明VBA编程在翻译中的具体应用。这些例子中的代码一般都比较简单,基本上都适合添加到工具栏中,随时处理文档。

    (一)显示或不显示隐藏文字

    校对是翻译过程中非常重要的环节。在校对过程中,有时候需要对照原文,以确定译文的意义是否与原文一致,这时候可以将原文和译文排列为段落对照的格式,也就是所有奇数段落都是原文,而所有的偶数段落都是译文。这样可以随时对照原文,检查译文意义表达是否准确。但有时在译文与原文意义一致的情况下,却只需要对译文的行文进行润色。这时候呈现原文反而会造成不便。其实,完全可以使用Word隐藏文字的功能并利用显示或不显示隐藏文字满足两种不同的需要。具体方法是将原文和译文排成段落对照的格式,并且将原文设置为隐藏文字的格式(这个过程也可以用宏程序完成,见下文)。然后可以编两个不同的宏程序,一个显示隐藏字体,一个不显示隐藏文字(两个程序的代码如下),并且将两个宏加载到常用工具栏中,设置为按钮。在需要显示原文时,点击显示隐藏字体的按钮,原文自动出现。而在不需要显示原文时,点击不显示隐藏文字的按钮,原文自动隐藏,而只显示译文。

    Sub 不显示隐藏文字()

        ActiveWindow.View.ShowAll= False

        ActiveWindow.View.ShowHiddenText= False

    End Sub

    Sub 显示隐藏文字()

        ActiveWindow.View.ShowAll= True

        ActiveWindow.View.ShowHiddenText= True

    End Sub

    (二)隐藏原文奇数段落

    Trados、Déjà vu和memoQ都可以忽略原文中隐藏的文字,利用这个特点,可以将原文中每一个段落都复制,变成AABBCC的形式,然后将奇数段落隐藏,这样导入CAT软件,翻译完成后,导出来的译文就成为原文和译文段落对照的格式。用表格和文本互换的操作可以完成这一任务,而且也可以将这个操作录制成宏,以便以后自动完成各种操作(徐彬,2017)。其实这种利用表格和文本相互转换的操作完成的任务也可以通过编写程序代码来自动完成,而且编写的代码要比宏录制产生的代码更加简洁,从而更容易理解和维护。图1和图2分别就是编写的代码和录制宏的代码实现自动隐藏奇数段落的部分代码。以下是这个程序的全部代码。

    Sub复制原文段落并隐藏奇数段落()

        Dialogs(wdDialogFileOpen).Show  '打开文件选择窗口

        Dim Doc As Document             '定义新文档

        Set Doc = ActiveDocument        '为新文档赋值

        Dim Total As Integer            '定义整形变量作为总行数

        Total = Doc.Paragraphs.Count    '为总行数赋值

        Dim DocName1 As String          '定义整形变量作为活动文档名称

        Dim DocPath As String           '获取活动文档路径

        DocPath = Doc.Path              '为活动文档路径赋值

        Selection.WholeStory            '选择整篇文档内容

        '将文档转换成表格

    Selection.ConvertToTableSeparator:=wdSeparateByParagraphs,           NumColumns:=1, _

    NumRows:=Total,AutoFitBehavior:=wdAutoFitFixed

        With Selection.Tables(1)

            .ApplyStyleHeadingRows = True

            .ApplyStyleLastRow = False

            .ApplyStyleFirstColumn = True

            .ApplyStyleLastColumn = False

        End With

    Doc.Tables(1).Columns(1).Select'选择表1中的第一列

    Selection.Copy         '复制第一列内容

    Selection.InsertColumnsRight   '在所选第一列后面插入新列

    Selection.PasteAndFormat(wdPasteDefault)'粘贴所选第一列并格式化

    Doc.Tables(1).Columns(1).Select'选择表1中的第一列

        With Selection.Font'对所选列字体进行设置

            .Hidden = True

            .Color = wdColorBlue

        End With

    Doc.Tables(1).Select'选择表1

        '将所选表格转换为文档

    Selection.Rows.ConvertToTextSeparator:=wdSeparateByParagraphs, _

    NestedTables:=False

    DocName = Left(Doc.Name,InStrRev(Doc.Name, ".") - 1) '截取源文档的文件名

    Doc.SaveAs2 FileName:=DocPath&"\" &DocName& "段段对照"  '另存新文档为源文档的路径并重新命名

    Doc.CloseSavechanges:=wdSaveChanges'关闭文档并保存修改

    End Sub

    (三)切分长文档

    在翻译活动中,经常会遇到一些长文档,如长达数百页的一本书。这样的翻译工作通常需要好几位译者合作完成。此时就需要翻译项目管理人员将长文档切分成多个短文档,然后分配给不同的译者。即使是一位译者独立在CAT软件中翻译这样的长文档,也应该将其按照章节切分成多个不同的文档,否则在原文导入和译文导出时,由于文件整体太大而导致导入、导出和打开过程太长,从而耗费大量时间。此外,长文档在翻译过程中如果出现任何错误可能会导致整个译文无法导出,给译文译后编辑带来不便,而切分后的各个短文档即使出现问题,也只影响局部而不会影响全部。在长文档的切分中,可以利用Word大纲视图中创建子文档功能完成(徐彬,2017)。当然也可以使用VBA编写一个小程序来自动完成。以下代码就是通过录制宏产生的按照一级标题切分长文档的程序代码。可以按照不同的章节要求先设定好一级标题,然后直接运行该程序或点击添加到菜单栏中对应的按钮就可以直接将一篇长文档切分为好多个短文档。

    Sub 切分文档()

        ActiveWindow.ActivePane.View.Type= wdOutlineView

        Selection.WholeStory

        If ActiveWindow.View =wdMasterView Then

            ActiveWindow.View =wdOutlineView

        Else

            ActiveWindow.View =wdMasterView

        End If

     ActiveDocument.Subdocuments.AddFromRangeRange:=Selection.Range

    ActiveWindow.Close

    End Sub

    (四)去掉多余空格

    在汉译英中,译文中一般要求在两个单词中间有一个空格,而在单词与标点符号之间不要空格。但一般会因为输入失误而在两个单词之间产生两个以上的空格或者在单词与后面的标点符号之间加上空格。通常在译文校对过程中应该去掉这些多余的空格。如果用人工校对和修改,不仅费时费力,还会因为各种原因而未能全部修改。这种简单的劳动其实也可以通过VBA编码来交给计算机自动完成。以下就是通过录制并编辑宏代码产生的去除英文多余空格的程序代码。

    Sub 去除多余空格()

        Selection.Find.ClearFormatting

        Selection.Find.Replacement.ClearFormatting

        With Selection.Find

            .Text = "{1,}([\,\.\?\!^13\(\)'""])"

            .Replacement.Text = "\1"

            .Forward = True

            .Wrap = wdFindContinue

            .MatchWildcards = True

        End With

        Selection.Find.ExecuteReplace:=wdReplaceAll

        With Selection.Find

            .Text = " {2,}"

            .Replacement.Text = " "

            .Forward = True

            .Wrap = wdFindContinue

            .MatchWildcards = True

        End With

    Selection.Find.ExecuteReplace:=wdReplaceAll

    End Sub

    (五)去掉所有书签

    在翻译实践中,经常会遇到利用OCR技术将PDF文件(特别是PDF图像)转换成Word格式,然后再导入CAT软件翻译的情形。例如,用FineReade将PDF文件转换为Word,然而有时PDF文档转换成Word后会出现大量的书签。这种书签一般用Word查找替换对话框中的定位功能一个一个删除,这样做费时费力,其实可以用以下四行代码编写的小程序一次全部删除,当然最好将这样的宏程序附加到常用菜单栏中,每次使用时只要点击一次就可以瞬间完成删除。

    Sub 删除所有书签()

    Dim MyBkAs Bookmark

    For EachMyBkInActiveDocument.Bookmarks

    MyBk.Delete

    Next

    End Sub

    以上几个小程序都是使用WordVBA编写的,这些Word VBA程序也是翻译中对原文和译文进行编辑最常使用的程序。

    六、        结语

    本文论述了VBA编程在翻译实践中的应用,并以几个实例说明了VBA编程在原文和译文编辑及术语管理中的作用。实际上VBA编程在翻译中的应用远不止这些。作为办公软件的一个扩展功能,VBA有极强的灵活性和适应性。将微软办公软件中的Word、Excel、PowerPoint及Access等各种功能通过VBA编程相互结合起来,会在翻译中有无限的应用前景。希望今后有更多学者在这一方面有所研究。

    参考文献

    李海亭. Office VBA编程设计两款翻译术语工具[J].电子技术与软件工程, 2019(07):230-232.

    王华树. 翻译技术教程[M]. 上海:商务印书馆, 2017.

    王华树. 翻译专业硕士(MTI)翻译技术教学研究:问题与对策[J]. 外语电化教学, 2018(06):76-82.

    王华树. 语言服务行业技术视域下的MTI技术课程体系构建[J]. 中国翻译, 2013, 34(06):23-28.

    徐彬. 计算机辅助翻译教学——设计与实施[J]. 上海翻译, 2010(04):45-49.

    徐彬. 翻译技术教学新思考[J]. 北京航空航天大学学报(社会科学版), 2014, 27(06):107-111.

    徐彬, 郭红梅, 国晓立. 21世纪的计算机辅助翻译工具[J]. 山东外语教学, 2007(04):79-86.

    徐彬, 郭红梅. 翻译技术教学新谈[J]. 当代外语研究, 2017(05):96-101.

    徐彬, 谭莹. 计算机辅助下的翻译协作[J]. 山东外语教学, 2008(04):91-94.

    俞敬松, 王华树. 计算机辅助翻译硕士专业教学探讨[J]. 中国翻译, 2016(03):38-42.

    RICHARD M.Mastering VBA for Microsoft Office 2007[M], Indianapolis: Wiley Publishing,Inc. 2008:xxvii, 3.

    RICHARD M. Mastering VBAfor Microsoft Office 2010[M], Indianapolis: Wiley Publishing, Inc.2010:xxvii, 3.


    展开全文
  • ACCESS+VBA编程.rar

    2009-02-20 17:45:46
    本书为WORD格式文档教程,全面介绍ACCESS数据库基本操作及其控件的使用,重点讲解VBA开发ACCESS,通过具体例子说明VBA语法,函数以及模块应用,并有一个VBA开发ACCESS数据库综合应用系统的实例
  • Excel VBA编程教程(基础一)

    千次阅读 多人点赞 2020-07-10 19:27:39
    Visual Basic for Applications(VBA)是 VisualBasic 的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展 Windows 的应用程序功能,特别是Microsoft Office软件...

    VBA介绍

    Visual Basic for Applications(VBA)是 VisualBasic 的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展 Windows 的应用程序功能,特别是Microsoft Office软件。

    说简单点,VBA 是运行在 Microsoft Office 软件之上,可以用来编写非软件自带的功能的编程语言。Office 软件提供丰富的功能接口,VBA 可以调用它们,实现自定义的需求。基本上,能用鼠标和键盘能做的事情,VBA 也能做。

    正如前文所述,VBA 可以运行在 Office 软件上,包括 Excel、Word、PPT、Outlook 等。VBA 语言在 Office 软件中是通用的,基本语法和用法都相同。但是每一个软件具有自己独有的对象,例如 Excel 有单元格对象,Word 有段落对象,PPT 有幻灯片对象。

    编写第一个VBA宏

    」:简单的说,宏是一段可以运行的 VBA 代码片段。

    step one 创建启用宏的工作簿

    首先新建一个工作簿,并将工作簿保存为「启用宏的工作簿」类型。详细步骤查看这篇文章。
    在这里插入图片描述

    step two 打开 VBA 编辑器

    通过功能区「开发工具 → 代码→Visual Basic」或快捷键 Alt + F11 打开 VBA 编辑器。详细步骤参考这篇文章。
    在这里插入图片描述

    step three

    Excel 工作簿中的 VBA 代码通常保存在工作表对象或模块中。本例中,我们用模块保存 VBA 代码。

    首先选中左侧工程列表中的工作簿,后右键,在弹出的选项列表中,选择「插入」。二级菜单中,选择「模块」,完成插入新模块。
    在这里插入图片描述
    插入完成后,在工程列表对应工作簿内,在模块文件夹下,显示新插入的模块。新插入的模块的默认名称是,模块 x,本例中是模块1。在属性窗口,可以修改模块的名称。
    在这里插入图片描述

    step four 打开模块

    双击上一步插入的模块1,在右侧代码窗口区域里,将打开模块1的代码编辑器。在右侧代码窗口中当前打开的代码编辑器所对应的模块,在编辑器标题末尾可以看到。
    在这里插入图片描述

    step five 创建一个宏(VBA 过程)

    在代码编辑窗口中,输入以下代码:

    Sub MyCode()
        
    End Sub
    

    这段代码是一个空的 VBA 过程,只有开始和结束。过程的其他代码,都在这中间编写。

    其中 SubSubroutine 的缩写,直译过来是子程序。在 VBA 中表示一个过程,也是代表一个过程的开始。下一行 End Sub 表示过程的结束。
    在这里插入图片描述

    step six 编写 VBA 过程实体部分

    过程的实体部分指的是,真正会被执行的部分。上一步创建的是一个空的 VBA 过程,里面不包含实体代码。虽然可以正常运行,但是不会有结果输出。

    这一步我们编写 VBA 过程的实体部分。将如下代码输入到过程的开始和结束处之间。

    MsgBox "Hello World"
    

    在这里插入图片描述

    step seven 运行代码

    现在我们已经写完了一个完整的 VBA 过程,现在运行它,看一下结果。

    将光标放置在代码的任何一处,点击工具栏上的运行「▶ 」按钮,或按 F5,运行代码。

    在这里插入图片描述
    可以看到运行结果,Excel 弹出一个对话框,显示内容正是在代码中编写的内容。

    在这里插入图片描述

    认识VBA编辑器

    在这里插入图片描述
    编辑器中每个模块的基本用法如下:

    • 工具栏:编辑器命令栏,与 Excel 功能区域类似,包含 Excel VBA 开发相关的命令。
    • VBA 工程:显示当前 VBA 工程包含的所有对象。通常,一个工作簿就是一个 VBA 工程,其中包括 Excel
      对象、工作表对象、模块等。
    • 属性窗口:查看和设置选中对象的属性的窗口。
    • 代码编辑窗口:实际编写代码的位置。编写、修改、保存代码,都在这里进行。
    • 立即窗口:代码运行过程中,打印出的内容,在立即窗口中显示。一般用于调试代码。
    管理VBA工程

    通常,一个工作簿就是一个 VBA 工程,其中包括 Excel 对象、工作表对象、模块等。当多个工作簿同时打开时,他们公用同一个 VBA 编辑器,VBA 工程界面显示所有的 VBA 工程。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mAmknVH3-1594377170684)(images/VBA教程/image-20200709165047990.png)]

    插入/删除模块

    在一个 VBA 工程中想要插入新的模块时,可在 VBA 工程右键,选择插入类型即可。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xrQEQnPK-1594377170686)(images/VBA教程/image-20200709165315694.png)]

    要删除模块,选中模块,右键,选择「移除 模块」

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-57FjvZZy-1594377170687)(images/VBA教程/image-20200709165336961.png)]

    语法介绍

    程序结构示例

    首先,本篇将使用以下代码,介绍各种程序结构,大家可以先看一下。

    Sub MyCode()
    
        '声明循环变量和是否为空变量
        Dim i As Integer
        Dim isBlank As Boolean
        
        '循环 A2-A10 单元格
        For i = 2 To 10
        
            '存储单元格是否为空的结果
            isBlank = Cells(i, 1).Value = ""
            
            '如果为空,则用上方的单元格的值填充当前单元格
            If isBlank Then
                Cells(i, 1) = Cells(i - 1, 1)
            End If
            
        Next i
    
    End Sub
    

    以上代码运行后,在 A2:A10 单元格区域,依次判断每一个单元格是否为空,如果是空,则用上一个单元格的值填充。

    过程

    过程是 VBA 中,程序实际运行的最小结构。单独的一行或多行代码无法运行,必须把它们放置在一个过程里,才能运行。

    在示例中,Sub 过程名() 开头,End Sub 为结尾部分是一个过程的主题,其余代码需要放置在两者之间。

    Sub MyCode()
    
    End Sub
    

    程序语句

    语句,是表示一个完整意思的一行代码。

    例如,示例中第一行,声明变量就是一条语句。它表示,声明一个整型变量。同理,第二行、第三行和其余的每一行都是语句。VBA 中的过程,就是由这样一条条语句构成的。

    Dim i As Integer
    Dim isBlank As Boolean
    

    通常,一行就是一个语句,除非它用换行符或合并符号.

    Excel VBA 对象

    我们学习 VBA 的最终目的是操纵 Excel,完成一些特定的目标。其中,操纵 Excel 就是通过 Excel VBA 对象完成的。

    在示例中,Cells() 就是一个 Excel VBA 对象,表示一个单元格,提供行号和列号指定单元格。

    程序运行结构

    接下来是程序结构中最核心的部分,也是最有意思的部分,程序运行结构。大部分编程语言都具备基本的三种程序运行结构,分别是顺序结构、循环结构、判断结构。各种简单到复杂的算法,都是由这三种基本的结构,相互组合而完成。

    1.顺序结构

    首先是基本的顺序结构。顺序结构,顾名思义就是按照顺序依次执行。VBA 中的顺序就是从上到下、从左到右的顺序。

    在示例中,首先运行两个声明语句,然后运行循环结构,以此类推。值得注意的事,当程序有嵌套时,嵌套的部分也是按照顺序指定的。

    在这里插入图片描述

    2.循环结构

    第二个基本结构是循环结构。当使用循环结构时,循环部分代码,按照指定的循环次数,循环重复执行。

    在我们的示例中,For 至 Next i 之间的代码就是一个循环代码。
    在这里插入图片描述
    VBA 中,有多种循环结构,本例中是 For 循环结构。For 循环结构中,第一行指定循环次数,最后一行表示开始下一个循环。

    '循环开始
    For i = 2 To 10
    	'这里是循环的代码
    Next i
    
    3.判断结构

    最后一种基本结构是,判断结构。简单来说,该结构中,当提供的表达式为真(True)时,判断结构的主体部分才会被执行,否则跳过。

    在示例代码中,If 开头和 End If 结尾处是典型的判断结构。第一行,判断 isBlank 变量是否为真,如果是,则执行判断结构主体部分,否则跳过。

    '如果为空,则用上方的单元格的值填充当前单元格
    If isBlank Then
        Cells(i, 1) = Cells(i - 1, 1)
    End If
    

    在这里插入图片描述

    运行

    下面,我们实际运行我们的示例代码,看一看它具体的效果。
    在这里插入图片描述




    Excel 是一个对象,这个对象包含很多属性和子对象,而 VBA 是可以操作这些对象的工具,实现各种各样的效果。例如,Excel 包括 Range 对象,即单元格对象,使用 VBA 可以改变单元格对象的填充颜色属性。用代码表示如下。

    'A1 单元格的填充颜色设置为颜色号为 49407 的颜色
    Range("A1").Interior.Color = 49407
    
    • Range(“A1”)、Interior、Color 等是 Excel 具备的对象和属性;
    • 对象和属性的操作,是通过 VBA 语言实现的,即上面是一行 VBA 代码。中间的等号(=)是 VBA 语言的赋值符号,也是能改变单元格填充颜色的关键所在。

    变量

    变量是存储数据的一种表达方式。在程序开始,可以声明一个变量,指定变量的类型(数字、文本、逻辑值等),并给变量赋值。在程序其他地方,就可以用该变量,使其存储的值参与运算。

    '声明一个文本类型的变量
    Dim val As String
    '给 val 变量赋值,即 "Hello World"
    val = "Hello World"
    '在 A1 单元格写入 val 变量存储的数据
    Range("A1").Value = val
    

    数组

    组表示一组同类型的数据的集合,是 VBA 中最重要的概念之一。以下面的代码为例:

    '创建数组
    Dim Val(1 to 4) As String
    '给数组的元素赋值
    Val(1) = "Excel"
    Val(2) = "Word"
    Val(3) = "PowerPoint"
    Val(4) = "Outlook"
    

    基础运算符

    使用 VBA 开发某项功能,本质上是,对变量进行基础的运算和操作,例如加减乘除比较等。为此,VBA 提供了很多运算符和操作符,利用它们可以实现复杂的运算。

    今天先学习 VBA 提供的基础运算符和操作,以及它们的基本用法。VBA 运算符可以分为以下 6 类:

    • 赋值运算符
    • 算数运算符
    • 比较运算符
    • 逻辑运算符
    • 连接运算符
    • 其他运算符

    VBA 中的连接运算符用于连接 2 个或多个文本。其用法与 Excel 公式中的 & 符号相同。

    连接操作符
    运算符说明示例
    &连接两个文本“Zhang” & ” ” & “San” -> “Zhang San”
    其他操作符
    运算符说明
    _ (下划线)将一行代码分解成两行
    : ( 英文冒号)将两行代码放置在一行
    比较运算符

    比较运算符,比较提供的两个变量,如果符合比较条件,返回 True,否则,返回 False。

    假设 a = 10b = 3-> 表示结果。

    运算符说明示例
    =比较两个值是否相等a = b -> False
    >大于a > b -> True
    >=大于等于a >= b => False
    <小于a < b -> False
    <=小于等于a <= b -> False
    <>不等于a <> b -> True
    注释

    通常,一段代码写完后,不会完全没问题。在实际使用过程中可能需要修改,符合最新的需求。过一段时间再打开查看时,可能已经忘记了当时的思路,不能很快想起来有些代码实际的用途,更不用说让别人查看了。这时,就需要注释出场了。

    注释是对代码的一种解释,不影响代码的运行。VBA 中的注释语句是,以英文单引号 (')开头,后接需要解释说明的内容。

    选择结构
    if Then 结构

    选择结构中,If Then 结构是最基础的一个。它只有条件表达式真时,执行的代码。

    If Then 结构基本语法如下,其中 End If是选择结构的结束标志。

    If 条件表达式 Then
        '表达式为真时,执行的代码
    End If
    

    现在我们看实际的例子,判断学生是否及格,及格条件是成绩 ≥60。如果及格,在C列对应单元格填写“及格”。具体代码如下:

    Sub MyCode()
    
        Dim i As Integer
        
        For i = 2 To 10
        
            If Cells(i, "B").Value >= 60 Then
                Cells(i, "C") = "及格"
            End If
            
        Next i
    
    End Sub
    

    我们可以看到,我们使用 B 列中的学生成绩与 60 分比较,如果≥60分,就在 C 列填写及格。

    条件表达式是 Cells(i, "B").Value >= 60,选择性执行的代码部分是 Cells(i, "C") = "及格"

    其中,For 语句是表示循环结构,这里只需知道程序从第一个学生循环到最后一个学生,依次判断每个学生的成绩。循环结构将在下一篇中做详细介绍。

    将以上代码运行后,可以看到运行结果如下:

    在这里插入图片描述

    If Else 结构

    很多时候,我们根据表达式的真假,真时执行一块代码,假时执行另一块代码。这种需求可以使用 If Else结构实现。

    If Else结构中,条件表达式在真时,执行Then后的代码;条件表达式为假时,执行 Else后的代码。基本语法如下:

    If 条件表达式 Then
        '真时执行的代码
    Else
        '假时执行的代码
    End If
    

    我们继续看实际的例子。在上一个例子的基础上,这次对不及格的学生,在C列填入不及格。代码如下:

    Sub MyCode()
    
        Dim i As Integer
        
        For i = 2 To 10
        
            If Cells(i, "B").Value >= 60 Then
                Cells(i, "C") = "及格"
            Else
                Cells(i, "C") = "不及格"
            End If
            
        Next i
    
    End Sub
    

    在这个例子中,条件表达式 Cells(i, "B").Value >= 60为假时,表示学生成绩低于60分,即不及格。这时就执行 Else后的代码。

    程序运行结果如下:
    在这里插入图片描述

    循环结构

    VBA 中程序循环结构基础,以及多种循环结构形式。包括子类在内,VBA 中常使用的循环结构包括 6 种,它们是:

    循环结构说明
    For … Next 循环按指定次数循环执行
    For Each 循环逐一遍历数据集合中的每一个元素
    Do While … Loop 循环当条件为真时,循环执行
    Do … Loop While 循环当条件为真时,循环执行。无论条件真假,至少运行一次
    Do Until … Loop 循环直到条件为真时,循环执行
    Do … Loop Until 循环直到条件为真时,循环执行。无论条件真假,至少运行一次

    此外,学习了两种跳出循环的语句,它们是:

    跳出语句说明
    Exit For跳出 For 循环
    Exit Do跳出 Do While/Until 循环

    本文介绍两个常用的循环

    For 循环
    1. For … Next 循环

    使用 For ... Next循环可以按指定次数,循环执行一段代码。For 循环使用一个数字变量,从初始值开始,每循环一次,变量值增加或减小,直到变量的值等于指定的结束值时,循环结束。

    For ... Next 循环语法如下:

    For [变量] = [初始值] To [结束值] Step [步长]
        '这里是循环执行的语句
    Next
    

    其中:

    • [变量] 是一个数字类型变量,可在循环执行的语句里使用。
    • [初始值] 和 [结束值] 是给定的值;
    • [步长] 是每次循环时,变量的增量。如果为正值,变量增大;如果为负值,变量减小。

    下面看一个实际的例子,求 1 至 10 数字的累积和。

    Sub MyCode()
    
        Dim i As Integer
        Dim sum As Integer
        
        For i = 1 To 10 Step 1
            sum = sum + i
        Next
        
    End Sub
    

    可以看到,For 循环使用i变量,循环 10 次,i 的值从 1 到 10 变化。

    值得注意的是,For 循环的 Step 值如果是 1,则 Step 关键词可省略。上述过程循环部分可写成如下方式:

    For i = 1 To 10
        sum = sum + i
    Next
    
    1. Do While 循环

    Do While循环用于满足指定条件时循环执行一段代码的情形。循环的指定条件在 While关键词后书写。

    Do While … Loop循环,根据 While 关键词后的条件表达式的值,真时执行,假时停止执行。基本语法如下:

    Do While [条件表达式]
        '循环执行的代码
    Loop
    

    其中,只要 [条件表达式] 为真,将一直循环执行。[条件表达式] 一旦为假,则停止循环,程序执行 Loop 关键词后的代码。

    看一个实际的例子,还是求 1- 10 累积和。

    Sub MyCode()
    
        Dim i As Integer
        Dim sum As Integer
        
        i = 1
        Do While i <= 10
            sum = sum + i
            i = i + 1
        Loop
        
    End Sub
    

    i变量的初始值是 1,根据 While 后的条件,只要 i 变量小于等于 10,后续的代码就可以一直循环执行。

    这里为了演示使用了 Do While 循环,实际情况下,这种求和问题,使用 For 循环更简洁。

    With 结构语法

    With 结构由 WithEnd With 两个语句构成,对象的属性和方法都写在两者之间。基本语法如下:

    With [对象]
        .[属性] = [数据]
        .[方法]
        '其他属性和方法
    End With
    

    With 结构里,对象的属性和方法均有点 (.)符号开始,后接对象的属性名和方法名。

    With 结构实例

    现在看一个实际的例子,需要将工作簿中 Sheet1 工作表设置新名称,然后设置标签颜色为黑色,最后隐藏工作表。

    如果不用 With 结构,代码如下:

    Sub MyCode()
    
        Worksheets("Sheet1").Name = "新名称"
        Worksheets("Sheet1").Tab.ThemeColor = xlThemeColorLight1
        Worksheets("Sheet1").Visible = xlSheetHidden
        
    End Sub
    

    可以看到,每个语句都重复写 Worksheets(“Sheet1”) 部分。

    使用 With 结构,可以避免重复写同一个对象名,代码如下:

    Sub MyCode()
    
        With Worksheets("Sheet1")
            .Name = "新名称"
            .Tab.ThemeColor = xlThemeColorLight1
            .Visible = xlSheetHidden
        End With
        
    End Sub
    

    复制实例

    本实例实现的是把很多excel表格的一些数据单元复制到一个新的文档上。

    Sub 合并当前目录下所有工作簿的全部工作表()
    
        Dim MyPath, MyName, AWbName
    
        Dim Wb As Workbook, WbN As String
    
        Dim G As Long
    
        Dim Num As Long
    
        Dim BOX As String
    
        Application.ScreenUpdating = False
    
        MyPath = ActiveWorkbook.Path
    
        MyName = Dir(MyPath & "\" & "*.xls")
    
        AWbName = ActiveWorkbook.Name
    
        Num = 0
    
        Do While MyName <> ""
    
            If MyName <> AWbName Then
    
                Set Wb = Workbooks.Open(MyPath & "\" & MyName)
    
                Num = Num + 1
    
                With Workbooks(1).ActiveSheet
    
                    .Cells(.Range("A65536").End(xlUp).Row + 2, 1) = Left(MyName, Len(MyName) - 4)
    
                    'For G = 1 To Sheets.Count
    
                        Wb.Sheets(1).Range("A3:E3").Copy .Cells(.Range("A65536").End(xlUp).Row + 2, 1)
                        Wb.Sheets(1).Range("C9:D18").Copy .Cells(.Range("A65536").End(xlUp).Row + 2, 1)
    
                    'Next
    
                    WbN = WbN & Chr(13) & Wb.Name
    
                    Wb.Close False
    
                End With
    
            End If
    
            MyName = Dir
    
        Loop
    
        Range("A1").Select
    
        Application.ScreenUpdating = True
    
        MsgBox "共合并了" & Num & "个工作薄下的全部工作表。如下:" & Chr(13) & WbN, vbInformation, "提示"
    
    End Sub
    
    
    展开全文
  • c#操作word VBA简单应用

    千次阅读 2012-05-10 09:28:58
    word,excel等offfice软件进行操作,是我们大多数人再也熟悉不过的事情了。但是,如何在代码中对这些软件进行操作呢?对不同的软件操作,代码差距会很大吗?为了解决这些问题,VBA技术产生了。  Visual Basic ...
  • word宏、宏编程以及VBA

    万次阅读 多人点赞 2018-12-03 19:55:37
    微软的office软件允许用户自己编写,叫VBA的脚本来增加其灵活性,进一步扩充它的能力。 如完成一个一打开word文件同时要打开某个文件的功能,必须要自己编写一段称之为宏的脚本。 具体做法是在菜单栏点击开发工具-...
  • VBA编程基础

    千次阅读 2006-03-22 18:44:00
    例如,如果是在 Microsoft Word 中,当对 Microsoft Excel 类型库做一引用设置时,可以在 Microsoft Word 中声明 Worksheet 类型的变量来表示 Microsoft Excel 中的Worksheet 对象。  如果使用其他的应用程序去控制...
  • 10个excel VBA实例教程,为初级的人作为兴趣入门课程,也可以为有基础的人开拓自己的视野。从基础的知识,到实战性的功能,甚至连接数据库,二维码扫描等等。
  • EXCEL VBA编程基础

    2009-05-05 09:12:00
    除此之外,使用VBA语言还有如下优点:1、VBA是一种通用程序语言,通过它不仅可以共享Microsoft相关的各种软件(如Excel、Word、Access)……,而且随着其它的一些软件(如大名鼎鼎的AutoCAD2000)等对VBA的支持,...
  • 表 20‑1到表 20‑8是VBA编程中使用频率最高的英文单词,按字母排序。词性列中,a表示形容词,n表示名词,v表示动词,p表示介词以及其他词性。 表 20‑1 VBA编程常用词汇表 单词 中文 词性 ...
  • VBA编程的工程性规划

    2017-07-17 18:20:00
    看过很多人写的VBA代码,一团一团的,一点规划都没有,为了VBA编程更具工程性,这里讨论一下,并列出自己的一些建议:0.给VBA工程定义一个名字,而非直接使用默认的名称——"VBAProject",以方便以后可能要进行的跨...
  • vba代码大全,大量的应用实例WORD形式,粘贴在VBA上就可以测试了。vba代码大全,大量的应用实例WORD形式,粘贴在VBA上就可以测试了。vba代码大全,,粘贴在VBA上就可以测试了。
  • VBA编程,完全在office环境下编写的Word,excel软件,对各学校教师或教务老师有超级好的辅助作用。
  • 使用python win32 库 调用word底层vba,将word转成pdf 安装pywin32 pip install pywin32 python代码 from win32com.client import gencache from win32com.client import constants, gencache def createPdf...
  • 摘要 本文介绍了用VBA作为开发语言,用Access或foxpro作为数据库, 用word中的书签作为媒介,实现数据库在Word中的自动替换方法,并以通知书为例给出了源程序。VBA Word 数据库 bookmark(书签)在实际工作中,经常需要...
  • vsto word 中操作实例

    2019-09-25 14:19:05
    vsto word 中操作实例 很有用哈 所以COPY过来了 public partial class ThisDocument { private Office.CommandBarPopup MenuBarItem; // Arbitrary Tag value for new menu item. pr...
  • 具体的VBA编程知识可以借鉴,而学习背后的方法,才是应该透过虚影看到的本质。   Ok,下面进入正题,需要说明的是本文只针对宏观开发,具体的数据类型、语法等不做介绍。   Step 0:准备开发环境。 正如其他...
  • Word宏与VBA/VB

    千次阅读 2019-04-24 18:05:28
    1、 Visual Basic(简称...2、Word宏 宏是一个批量处理程序命令,正确地运用它可以提高工作效率。 微软的office软件允许用户自己编写,叫VBA的脚本来增加其灵活性,进一步扩充它的能力 Visual Basic for Appli...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 750
精华内容 300
关键字:

wordvba编程实例