美文网首页
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