美文网首页
Execl工具-宏-VBA

Execl工具-宏-VBA

作者: 赵客缦胡缨v吴钩霜雪明 | 来源:发表于2022-04-21 09:09 被阅读0次

    VBA是一种编程语言,它依托于Office软件,不能独立运行,通过VBA可以实现各种Office软件操作的自动化。

    通俗易懂的来说就是在Excel中想实现什么功能,就可以通过VBA语言编写的程序区实现。

    VBA编码语法

    VBA的代码的开始和结束

    Sub 代码名称()
      代码内容
      ...
    End Sub
    

    数据类型

    ①字符串 String

    ②数字类型:整型 Integer、长整型 Long、单精度浮点型 Single(小数点后最多6位)、双精度浮点型 Double(小数点后最多14位)。

    ③日期型 Date

    ④布尔型 Boolean:True\False.

    ⑤变体型 Variant(不知道是什么类型,可定义为variant,但这种操作应当尽量避免)

    变量

    用于保存在程序运行过程中需要临时保存的值或对象。

    定义变量:Dim 变量名 (As 数据类型)

    Dim i as Integer
    i=6
    
    方法1:dim 变量名 as 数据类型
    方法2:dim 变量名 as 数据类型,变量名 as 数据类型
    方法3:dim 变量名,变量名 as 数据类型 ()
    方法4:dim 变量名+数据类型符
    
    Sub 变量测试()
    
    Dim i As Integer
    Dim i1 As Integer, str As String
    Dim i2, i3 As Integer
    Dim i4%
    
    End Sub
    

    变量名的命名规则

    由字母、数字、下划线以及汉字构成
    只能以字母或汉字开头,不可以是数字或者下划线开头
    长度不可以超过255个字符
    不可以使用VBA中的关键字
    见名知意
    变量名的后面可以添加一个符号,表示该变量盛装的数据的类型,常用符号:%、&、#、$、!
    尽量不要使用中文命名
    不要使用特殊符号,可以用英文字母、中文、数字、下划线,不能以数字开头
    不能使用系统保留字,比如sub、for
    大小写不敏感
    

    注意
    变量名字不要重复
    VBA中变量可以不声明就使用,但是不建议,如果不声明就使用,那么该变量里面可以盛装任意类型的数据

    字符串

    几个常用的字符串函数:

    Len(): 求长度
    
    Trim(): 去掉两端空格
    
    Replace(): 替代子串
    
    Left(): 从左边取若干字符
    
    Right(): 从右边取若干字符
    
    Mid(): 从中间取若干字符
    
    Instr(): 查找子串
    
    LCase(), UCase(): 将字母变成小/大写
    

    进行操作前可叠加使用Trim()和LCase()清除数据中的空格和因大小写不一致出现的问题。

    for循环:

    for i=1 to 10 step 2
    cells(i,2)=7
    next i
    
    ①循环
    
    For … next
    
    Do While … Loop
    
    For Each in … Next
    
    ②判断
    
    If ... Then ... (Else if ... Else ...) End if
    
    Not, And, Or(优先级从左往右)
    

    if分支结构:

    if a>90 then
    cells(1,1)=""
    elseif a>70 then
    cells(1,1)=""
    elseif a>60 then
    cells(1,1)=""
    else
    cells(1,1)=""
    end if
    

    BVA调试:

    设置断点,让程序暂停
    单步调试,每次只执行一次(F8)
    添加监视,随时查看变量值
    

    字符串:

    设置双引号,否则会被认为是变量
    特殊字符:空格 回车 换行,空串和空格字符串不一样
    大写小写不一样,文本数字要分开,1是数字1,“1”是字符串
    逻辑运算符 not and or (优先级从高到低)

    while循环:

    whlie cells(i,1)<>""
    cells(i,2)=5
    i=i+1
    wend
    do whlie cells(i,1)<>""
    cells(I,2)=5
    i=i+1
    loop
    

    面向对象

    面向对象的概念:对象(系统中具体的事物)、类(对象的分类)、属性(是什么样子)、方法(能做什么)
    常用的对象:

    application(excel系统) 
    
    workbook工作簿 
    
    worksheet工作表 
    
    range单元格内容区域
    

    为代表对象的变量赋值,必须使用set关键字

    用worksheets引用工作表的两种方法:

    根据工作表的显示方法,比如worksheets(5)
    根据工作表的名称,比如worksheets("数据明细")

    worksheet对象的name属性:

    根worksheet.name代表了该工作表的名称,可以用它取得或者修改工作表名称

    worksheets的count属性:代表了所属工作簿中一共有多少工作表

    worksheets的add方法:在所属工作簿中新建一个工作表

    举个例子:循环打开多个工作簿

    估计好多人听说VBA是从合并工作簿知道的,合并工作簿是有通用的代码框架的,记住框架,再也不怕对工作簿进行其他操作。

    Sub 循环打开工作簿()
    
        Application.ScreenUpdating = False
    
        myfile = Dir(ThisWorkbook.Path & "\*.xls*")
    
        Do While myfile <> ""
    
              If myfile <> ThisWorkbook.Name Then
    
                    Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & myfile
    
                    我是需要填空的代码
    
              Else
    
            End If
    
            myfile = Dir
    
        Loop
    
        Application.ScreenUpdating = True
    
        MsgBox "完成"
    
    End Sub
    

    如果你要提取特定内容的单元格,只需要结合find方法,查找内容是“你好”的单元格的行号,并赋值。在空白处填上如下代码即可。

    ThisWorkbook.Worksheets(1).Cells(a, 1) 
    = wb.worksheets(1).Cells.Find("你好", , xlValues, xlWhole, xlByColumns, xlNext, True, True).row
    

    如果你要合并工作簿,那么只需要在填空的代码里,对单元格区域应用copy方法。在空白处填上如下代码即可。

    wb.worksheets(1).range("a1").usedrange.copyThisWorkbook.Worksheets(1).range("a1")
    
    Option Explicit
    
    Sub 季度汇总()
        
        Dim i, j, k, name
        Dim w As Worksheet, r As Worksheet
        
        Set r = Worksheets("季度汇总")
    
        '循环扫描汇总表中的每一行,记住每次要查找的姓名
        For i = 3 To 10
            name = r.Cells(i, 2)
                
            '循环扫描所有工作表,并用 w 指向该工作表
            For Each w In Worksheets
                '如果该工作表名字以“月”结尾,则认为是月报表
                If Right(w.name, 1) = "月" Then
                    '循环扫描该月报表的每一行,判断其姓名列是否等于name
                    k = 3
                    Do While w.Cells(k, 2) <> ""
                        '如果第k行姓名等于name,则将该行累加到汇总表第i行
                        
                        If LCase(Trim(w.Cells(k, 2))) = LCase(Trim(name)) Then
                        
                            For j = 3 To 6
                            r.Cells(i, j) = r.Cells(i, j) + w.Cells(k, j)
                            Next j
                            
                        End If
                        k = k + 1
                    Loop
                End If
            Next w
        Next i
    End Sub
    

    相关文章

      网友评论

          本文标题:Execl工具-宏-VBA

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