美文网首页
Excel-vba 基础

Excel-vba 基础

作者: Ly3911 | 来源:发表于2020-09-08 16:20 被阅读0次

    参考:https://zhuanlan.zhihu.com/data-analysis-by-xian

    1.控件


    vba1.png
    Private Sub CommandButton1_Click()
    
    Dim V_name1 As Integer                     '单变量声明格式
    
    Dim V_name2, V_name3 As String             '同类型多变量声明格式
    
    Dim V_name4 As Double, V_name5 As Boolean, V_name6 As Date '不同类型多变量声明格式
    
    '数据赋值
    
    V_name1 = 200
    V_name2 = "this is a string 1"
    V_name3 = "this is a string 2"
    V_name4 = 2573.876
    V_name5 = True
    V_name6 = Now()
    
    
    MsgBox ("现在时间:" & V_name6) '窗口显示
    
    End Sub
    

    2.数据类型
    a.字符串 string
    b. 数字类型 整形 integer 长整形 long 单精度浮点型 single 双精度 double
    c.日期型 date
    d.布尔型 boolean
    e.变体型 variant (当不确定数据类型时,可以用来保存)
    f.对象型 object (*)
    3.数组
    3.1静态数组-长度固定不变,默认索引从0开始
    Dim MyArray(10 to 20) as String
    3.2动态数组-长度可变,待长度确定可用ReDim重新定义数组
    Dim MyArray() as String
    数组赋值与取值

    Private Sub CommandButton1_Click()
    Dim arr(5) As String
    For i = 1 To 5
        arr(i) = i
    Next
    v_time = arr(1)
    MsgBox ("数值:" & v_time)
    End Sub
    

    3.3多维数组
    定义一个4行5列的两维数组:Dim MyArr(4,5) as String 或 MyArr(1 to 4, 5 to 8)
    定义一个三维数组:Dim MyArr(3,4,5) as String 或 MyArr(1 to 3, 4 to 6, 7 to 9)
    4.字典
    4.1创建字典:

    Dim d As Object
    Set d =CreatObject("Scripting.Dictionary")
    

    4.2 字典的6个方法-Add、Exists、Keys、Items、 Remove、RemoveAll
    Add方法

     d.Add Key,Item    #key:键,Items值
    

    Exists方法

    d.Exists(Key)  #判断关键字是否存在于字典(键),返回True/False
    

    Keys方法

    d.Keys()   #返回字典所有的键,类型是数组
    

    Items方法

    d.Items()   #返回字典所有的值,类型是数组
    

    Remove方法

    d.Remove(key)  #移除指定Key的数据
    

    RemoveAll方法

    d.RemoveAll()  #清空字典
    

    5.条件选择
    5.1 IF
    If...Then...End If
    If...Then...Else...End If
    If...Then...ElseIf...Then...End If
    5.2 Select Case
    Select Case 测试表达式
    Case 表达式1
    ' 如果测试表达式等于表达式1,则执行这里的语句
    Case 表达式2
    ' 如果测试表达式等于表达式2,则执行这里的语句
    Case 表达式3
    ' 如果测试表达式等于表达式3,则执行这里的语句
    ' 后面可以有更多的Case (最后一个可以使用Case Else)

    End Select
    Sub test2()
        Dim score As Integer
        score = 53
        Select Case score
            Case Is >= 90
                Debug.Print "优"
            Case Is >= 80
                Debug.Print "良"
            Case Is >= 60
                Debug.Print "中"
            Case Else
                Debug.Print "差"
        End Select
    End Sub
    

    6.流程控制
    6.1 For
    a.循环次数已知
    for 变量=开始值 to 结束值
    循环执行的语句
    next

    For i = 1 To 10
        Debug.Print i
    Next
    

    b.循环次数未知
    For Each 循环变量 In 循环对象
    ' 循环执行的语句
    Next 循环变量

    遍历数组
    For Each a In myArr
        Debug.Print a
    Next a
    

    7.1操作工作表


    vba表引用.png
    Sub vba1()
    
        Dim sht_slea As Worksheet
        Dim sht_result As Worksheet
        Dim sht_para As Worksheet
    
        Set sht_slea = Worksheets("SLEA")
        Set sht_result = Worksheets("Check_Result")
        Set sht_para = Worksheets("Parameter")
    
    End Sub
    

    用 Dim 变量名 As Worksheet 的格式来定义一个工作表对象;
    用 Set 变量名 = Worksheets("表名") 的格式来把工作表对象赋值给指定的变量;
    然后就可以用这个变量来引用或操作对应工作表中的对象和数据了。
    7.2操作单元格区域
    单元格区域,即Range对象。应该是在Excel VBA中用得最多的对象。Range对象是Worksheet对象的一个子集。所以通常通过worksheet_object.Range()的方式来引用。

    Sub test()
        Dim sht_slea As Worksheet
        Dim rng As Range
    
        Set sht_slea = Worksheets("SLEA")
        Set rng = sht_slea.Range("D2")
    
        Debug.Print rng
    End Sub
    

    输出SLEA表中D2单元格中的数据。
    特说明一下。仅在Range对象引用的是单个单元格时,才可以用Debug.Print或者MsgBox来输出Range对象中的内容。引用了多个单元格的Range对象使用Debug.Print或者MsgBox来输出,将会报错。
    7.3操作多个单元格区域

    Sub vba2()
        Dim sht_slea As Worksheet
        Dim rng As Range
        Set sht_slea = Worksheets("SLEA")
        Set rng = sht_slea.Range("A1:D2")
        '多区域sht_slea.Range("D2:D5, B2:B5")
        rng.Interior.ColorIndex = 16
        'A1:D2填充颜色
        For Each Item In rng
            Debug.Print Item
        Next Item
        '遍历数组rng内容
    End Sub
    

    7.4操作单元格对象
    单元格,Cells(行号,列号),即可引用到单个单元格对象。Cells对象也是Worksheet对象的一个子集,以worksheet_object.Cells()的方式来引用。

    Sub test2()
        Dim sht_slea As Worksheet
    
        Set sht_slea = Worksheets("SLEA")
        Debug.Print sht_slea.Cells(1, 2)
    End Sub
    

    使用Cells和Range似乎没什么区别,但是在进行数据处理时,我们经常需要动态地把数据读或写入一个单元格中,这时候,用数字表示位置的Cells对象,再结合For循环,操作起来就很方便了。

    Sub test3()
        Dim sht_slea As Worksheet
        Set sht_slea = Worksheets("SLEA")
        For r = 1 To 5
            For c = 1 To 4
                Debug.Print sht_slea.Cells(r, c)
            Next
        Next
    End Sub
    

    注意:
    1.Range("B2:D4")也可以用Range(Cells(2, 2), Cells(4, 4))来表示
    2.Range("B2:B4, D2:D4")和Range("B2:B4", "D2:D4")的区别:前者是分别引用B2:B4和D2:D4这两个区域,而后者则表示引用的是从B2:B4开始到D2:D4结束为止的这一整个连续的区域。所以后者其实是等价于Range("B2:D4")。
    3.父对象的省略
    Worksheet对象,父对象为Workbook,即工作薄;
    VBA也提供了一种用法,即Worksheet直接由Application对象引出。Range的父对象是Worksheet对象,Cells对象的父对象也是Worksheet对象。所以在给这些对象赋值时,标准的写法应当要把父对象给写上,如:

    Sub test3()
        Dim sht_slea As Worksheet
        Dim titl_rng As Range
        Dim data_rng As Range
        Dim wbk as Workbook
    
        Set wbk = Application.ThisWorkbook()
        Set sht_slea = wbk.Worksheets("SLEA")
        Set title_rng = sht_slea.Range("A1:D1")
        Set data_rng = sht_slea.Range(sht_slea.Cells(2, 1), sht_slea.Cells(4, 4))
    End Sub
    

    VBA中代码涉及到的对象都位于一个工作薄,这个工作薄是激活状态时,则这些父对象是可以省略的(如果有同时打开了多个Excel文件,而在不同的工作薄中有同名的工作表,则忽略父对象时有可能会让程序产生误解,导致执行失败)。默认就是当前(激活的)工作薄。所以在当前工作薄被激活时,上述代码和下面的是等价的:

    Sub test4()
        Dim sht_slea As Worksheet
        Dim titl_rng As Range
        Dim data_rng As Range
    
        Set sht_slea = Worksheets("SLEA")
        Set title_rng = sht_slea.Range("A1:D1")
        Set data_rng = sht_slea.Range(Cells(2, 1), Cells(4, 4))
    End Sub
    

    尽量避免意外情况的发生,在单独引用Cells、Range对象时,Worksheet对象也不要省略;
    8.1过程和函数

    Sub 过程名()
        在过程中执行的代码
    End Sub
    
    Function 函数名(参数1, 参数2, ...) As 数据类型
        在函数中执行的代码
        函数名 = 函数执行后的结果
    End Function
    

    8.2参数
    a.可选参数
    格式与必选参数类似,只是在参数名前面用Optional声明参数是可选的。

    Sub sub_test(Optional s As String)
        Debug.Print s
    End Sub
    

    b.必选参数
    必选参数在定义时放置在过程或函数名后面的括号中

    Sub sub_test(s As String)
        Debug.Print s
    End Sub
    

    在调用上述过程时,可以不传入参数,此时则不会输出任何东西,也不会报错,因为参数是可选的。如果传入了参数,则会输出这个参数。

    Sub sub_test(Optional s As String = "Hello, World")
        Debug.Print s
    End Sub
    带参数调用:
    Sub test()
        Call sub_test("I am a boy")
    End Sub
    不带参数调用:
    Sub test()
        Call sub_test
    End Sub
    

    c.同时用可选参数与必选参数

    Sub sub_test(var As Integer, Optional s As String = "Hello, World")
        Debug.Print var
        Debug.Print s
    End Sub
    调用
    Sub test()
       Call sub_test(50, "Hi, Meinv")
    End Sub
    

    9.错误处理
    9.1 On Error GoTo
    表示如果自本行开始后面的代码执行出错,则跳至指定位置继续执行。

    Sub te4()
        On Error GoTo con
        Debug.Print "a" + 3
        Debug.Print 8 - 5
    con:
        Debug.Print "error occur"
    End Sub
    

    第2行设置了On Error GoTo con,即当第3行出错时,就跳到con标记处,执行自con后的代码。标记后面应加上冒号(:)。第3行中,用双引号包含的a是一个字符串,而3是一个数字,直接将字符串与数字相加是会出错的,所以这里会触发错误,第4行不会被执行到,程序会直接跳转到con处,执行后面的Debug.Print语句。程序输出error occur。
    9.2 On Error Resume Next
    表示如果代码执行出错,则从出错代码的下一行代码继续执行。

    Sub te3()
        On Error Resume Next
        Debug.Print 5 + 3
        Debug.Print "a" + 3
        Debug.Print "error occur"
    End Sub
    

    代码第3行执行正常,第4行将出错,于是直接执行第5行。
    所以程序的输出是:
    8
    error occur

    相关文章

      网友评论

          本文标题:Excel-vba 基础

          本文链接:https://www.haomeiwen.com/subject/iarpsktx.html