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