Execl工具-宏-VBA

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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容