EXCEL | VBA实例操作

将工作簿中的所有工作表单独保存,原表仍然存在

1.原工作簿:


原工作簿

2.效果显示:


单独工作表

3.VBA代码:

Sub chaifen()

'定义变量sht为工作表
Dim sht As Worksheet
'在所有工作表中遍历一次
For Each sht In Sheets
'工作表复制
    sht.Copy
'目前活动的工作表另存为,注意路径的写法
    ActiveWorkbook.SaveAs Filename:="D:\C 文件\excel\VBA\day03\CHAIFEN\" & sht.Name & ".xlsx"
'目前活动的工作表关闭
    ActiveWorkbook.Close
Next
End Sub

4.知识点:
thisworkbook:指当前VBA代码所处的 workbook
activeworkbook:指当前活跃的workbook
相同点:如果VBA代码只对本身工作薄进行操作,则两者相同;
不同点:如果VBA代码新建或打开了其他工作薄,则往往新建或刚打开的是activeworkbook,可以通过"工作薄名.active"方法激活指定对象。


保留工作薄中不想删除的工作表,其他全部删除

1.原工作薄


绝不能删除1.png

2.删除后


绝不能删除2.png

3.VBA代码

Sub test()
'删除其他表,保留 绝不能删除 表
Dim sht As Worksheet

Application.DisplayAlerts = False

For Each sht In Sheets
'如果工作表名不等于“决不能删除”
    If sht.Name <> "绝不能删除" Then
    '将工作表删除
        sht.Delete
    End If
Next

Application.DisplayAlerts = False

End Sub

4.知识点:
worksheet:单个工作表
worksheets:指定工作薄中所有工作表的集合
Application.DisplayAlerts:如果宏运行时Excel显示特定的警告和信息,则该值为True。如果不想在宏运行时被无穷无尽的提示和警告消息困扰,则将该属性设置为False。


利用空白工作薄控制创建新的工作薄并填写内容

1.VBA代码

Sub chuangjian()
'新建工作薄
Workbooks.Add
'活动工作薄工作表1单元格a1填写内容“这是我自动创建出来的”
ActiveWorkbook.Sheets(1).Range("a1") = "这是我自动创建出来的"
'活动工作薄另存为到指定的文件路径
ActiveWorkbook.SaveAs Filename:="D:\C 文件\excel\VBA\day03\123.xlsx"
End Sub

2.运行效果


123.png

123内容.png

3.知识点:
Workbooks:对象是Microsoft Excel应用程序中当前打开的所有Workbook对象的集合,有Close、Add、Open等方法
Workbook:对象是一个Microsoft Excel工作薄,有name、path等属性,有SaveAs等方法,有Open、Activate等事件
Workbooks.Add:新建工作薄,新建的工作薄将成为活动工作薄


利用空白工作薄控制已有的工作薄并填写内容

1.空白的工作表1


空白的工作表1

2.VBA代码

Sub test()

Application.ScreenUpdating = False
Application.DisplayAlerts = False
'工作薄打开指定路径下的1.xlsx
Workbooks.Open Filename:="D:\C 文件\excel\VBA\day03\1.xlsx"
'活动工作薄工作表1单元格a1填写"又又到此一游"
ActiveWorkbook.Sheets(1).Range("a1") = "又又到此一游"
'活动工作薄保存
ActiveWorkbook.Save
'活动工作薄关闭
ActiveWorkbook.Close

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub

3.含内容的工作表1


又又到此一游1.png

4.知识点:
Application.ScreenUpdating:在Excel的工作表里面数据发生变化后,False禁止实时刷新,True为默认值表示实时更新数据


按部门名称来筛选数据

1.筛选数据


筛选数据

2.VBA代码

Sub chaifen()

    Sheet1.Range("a1:F32").AutoFilter Field:=4, Criteria1:="一车间"

End Sub

3.筛选一车间


筛选一车间

将数据工作表取消筛选状态

1.筛选状态


筛选状态

2.VBA代码

Sub qxshaixuan()
    
    Sheet1.Range("a1:F32").AutoFilter

End Sub

3.取消筛选


取消筛选

将工作表数据按照部门拆分到部门名称所对应的工作表中-No.01

【注意事项】:分表已经提前做好,需要拷贝数据到分表中
1.如下所示:


工作表-数据

按照数据表部门,分别实现以部门名称建立的新表,然后将数据表中部门名称单元格所在行复制到新表中。

2.代码如下:

Sub chaifen1()

'实现功能:将数据表中Range("d" & i)单元格对应的行数据拆分到新表Range("d" & i).value名称的表中

    '定义整型数据i,k,j
    Dim i,k,j As Integer
           
    '遍历第二个工作表到最后一个工作表
    For j = 2 To Sheets.Count
    
        '将工作表数据中的抬头拷贝到其他工作表中去
        Sheet1.Range("a1").Resize(1, 6).Copy Sheets(j).Range("a1")
    
        '遍历数据表中第二行到最后一行数据
        For i = 2 To Sheets(1).Range("a65536").End(xlUp).Row
        
            '假如数据表单元格("d" & i)单元格对应的值等于表二的名称
            If Sheet1.Range("d" & i).Value = Sheets(j).Name Then
            
                '计算表二目前状态下已有多少行数据
                k = Sheets(j).Range("a65536").End(xlUp).Row
                
                '将数据表中Range("d" & i)单元格所在整行数据拷贝到数据表中已有行数的下一行
                Sheet1.Range("d" & i).EntireRow.Copy Sheets(j).Range("a" & k + 1)  
            End If
        Next
    Next 
End Sub

3.得到效果:


工作表-二车间
工作表-一车间

在分表中出现小数点,暂时还未知原因!

4.知识点:
{1}、在保存含有VBA代码的文件时,在警告提示中选择否,保存格式为xlsm,即可保存成功
{2}、Sheets.Count:获取本工作薄中工作表的总数
{3}、Sheets(Sheets.Count):调用排在最后一位的工作表
{4}、Sheets(Sheets.Count).Name:获取最后一个工作表的名称


将工作表数据按照部门拆分到部门名称所对应的工作表中-No.02

【注意事项】:分表已经提前做好,需要拷贝数据到分表中
【使用方法】:利用excel筛选功能提高效率
1.工作簿表们


工作簿表们

2.VBA代码

Sub shaifen()
'定义整型变量i
Dim i As Integer
'从第二张工作表开始遍历
For i = 2 To Sheets.Count
'根据工作表名称来筛选数据工作表
    Sheet1.Range("a1:F32").AutoFilter Field:=4, Criteria1:=Sheets(i).Name
'将筛选后的数据工作表复制到第i张工作表的a1单元格
    Sheet1.Range("a1:F32").Copy Sheets(i).Range("a1")
Next
'取消数据工作表的筛选
    Sheet1.Range("a1:F32").AutoFilter
End Sub

3.执行筛选复制程序后


财务部1.png
二车间1.png
技改办1.png
经理室1.png
人力资源部1.png
销售1部1.png
销售2部1.png
一车间1.png

4.知识点:
Sheets(i).Name:第i张工作表的名称


将工作表数据按照部门拆分到部门名称所对应的工作表中-No.03

【注意事项】:分表未提前做好,需要拷贝数据到分表中
【使用方法】:判断建表结合筛选功能提高拆分表效率
1.数据工作表


20190117-数据工作表

2.VBA代码

Sub chaifenshuju()
'定义工作表变量sht
Dim sht As Worksheet
'定义整型变量k,i,j
Dim k, i, j As Integer
Dim irow As Integer '此处定义一个一共多少行的整数值

irow = Sheet1.Range("a65536").End(xlUp).Row

'1此处是建立新工作表的代码
'此处为一个标准遍历写法,需要记住
For i = 2 To irow
'将标记值复位,便于创建未重名新工作表
    k = 0

    For Each sht In Sheets
        
        If sht.Name = Sheet1.Range("d" & i) Then
        
            k = 1
        
        End If
    
    Next
    
    If k = 0 Then
    '按部门名称来创建新工作表
        Sheets.Add after:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = Sheet1.Range("d" & i)
        
    End If
    
Next

'此处是将数据表中的数据按部门进行拷贝到对应部门的工作表中

For j = 2 To Sheets.Count

    Sheet1.Range("a1:f" & irow).AutoFilter Field:=4, Criteria1:=Sheets(j).Name
    Sheet1.Range("a1:f" & irow).Copy Sheets(j).Range("a1")

Next
    '数据工作表取消或者选中筛选状态
    Sheet1.Range("a1:f" & irow).AutoFilter

End Sub

3.拆分后效果


20190117-财务部.png
20190117-二车间.png
20190117-技改办.png
20190117-经理室.png
20190117-人力资源部.png
20190117-销售1部.png
20190117-销售2部.png
20190117-一车间.png

针对MsgBox以及InputBox的测试

1.测试代码

Sub test()

    MsgBox "你好!"

End Sub

【效果展示】


20190117-你好

2.测试代码1

Sub test1()

    InputBox "你几岁了?"

End Sub

【效果展示】


20190117-你几岁了.png

3.测试代码2

Sub test2()

    Dim i As Integer
    
    i = InputBox("你几岁了?")
    
    Sheet1.Range("A1") = i

End Sub

【效果展示】


20190117-输入5后变化.png

20190117-3变成5.png

4.测试代码3

Sub test3()

    Dim i As Integer
    
    i = InputBox("你几岁了?")
    
    MsgBox "哦,原来你6岁啦"

End Sub

【效果展示】


20190117-输入7.png

4

5.测试代码4

Sub test4()

    Dim i As Integer
    
    i = InputBox("你几岁了?")
    
    MsgBox "哦,原来你" & i & "岁啦"

End Sub

【效果展示】


20190117-输入10.png

20190117-与输入10一致.png

6.测试代码5

Sub test5()

    Range("A1").Select

End Sub

【效果展示】


20190117-A1选中.png

7.测试代码6

Sub test6()

    Cells(4, 1).Select

End Sub

【效果展示】


20190117-A4选中.png

将工作表数据按照部门拆分到部门名称所对应的工作表中-No.04

【注意事项】:分表未提前做好,需要拷贝数据到分表中
【使用方法】:在NO.03的基础上再升级成最终版本
1.使用控件


使用控件

2.VBA代码

Sub chaifenshuju()

Dim sht As Worksheet
Dim k, i, j As Integer
Dim irow As Integer '此处定义一个一共多少行的整数值
Dim l As Integer

l = InputBox("请输入你要按哪列分")


'创建新表之前,删除除数据工作表之外的其他工作表
'消除提示
Application.DisplayAlerts = False
If Sheets.Count > 1 Then

    For Each sht1 In Sheets
    
        If sht1.Name <> "数据" Then
        
            sht1.Delete
        
        End If
    
    Next

End If

'消除提示
Application.DisplayAlerts = False


irow = Sheet1.Range("a65536").End(xlUp).Row
'1此处是建立新工作表的代码
'此处为一个标准遍历写法,需要记住
For i = 2 To irow

    k = 0

    For Each sht In Sheets
        
        If sht.Name = Sheet1.Cells(i, l) Then
        
            k = 1
        
        End If
    
    Next
    
    If k = 0 Then
    
        Sheets.Add after:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = Sheet1.Cells(i, l)
        
    End If
    
Next

'此处是将数据表中的数据按部门进行拷贝到对应部门的工作表中

For j = 2 To Sheets.Count

    Sheet1.Range("a1:f" & irow).AutoFilter Field:=l, Criteria1:=Sheets(j).Name
    Sheet1.Range("a1:f" & irow).Copy Sheets(j).Range("a1")

Next
    '数据取消或者选中筛选状态
    Sheet1.Range("a1:f" & irow).AutoFilter
    
    Sheet1.Select
    
    MsgBox "已经执行完毕!"

End Sub

3.执行效果


20190118-按第四列来分

20190118-按第五列来分

4.功能:可以按照列数来进行拆分工作表


按工作表1中单元格内容进行创建新工作表

1.Sheet1


Sheet1.png

2.VBA代码-No.01

Sub xinjianbiao01()

    Sheets.Add after:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Name = Sheet1.Range("a1")

End Sub

3.VBA代码-No.02

Sub xinjianbiao02()

    Sheets.Add(after:=Sheets(Sheets.Count)).Name = Sheet1.Range("a2")

End Sub

4.执行代码后


1月2月.png

5.知识点:
Sheets.Add after:=Sheets(Sheets.Count):在最后一张工作表后添加新工作表


按工作表1中单个单元格内容进行创建新工作表

1.工作薄


Sheet1.png

2.VBA代码
Sub xinjianbiao()

'此处k被定义为整数,默认初始值为0,可以看做是一个开关,判断新表是否能够建立
'此处是针对工作表1单元格a1进行创建新表

Dim sht As Worksheet
Dim k As Integer

'遍历目前已经存在的工作表
For Each sht In Sheets
'如果存在工作表名与制定单元格值相同,则给k赋值1
If sht.Name = Sheet1.Range("a1") Then

    k = 1

End If

Next

'如果k值为0,则说明存在工作表名与制定单元格值没有相同

If k = 0 Then

Sheets.Add after:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = Sheet1.Range("a1")

End If

End Sub
3.执行代码后


1月2月.png

4.知识点:
此处设置整数变量k作为标记值,来判断同工作薄中工作表是否有重复名称,如果没有则新建,如果有则不会另外新建


按工作表1中多个单元格内容进行创建新工作表

1.工作表1


工作表123月.png

2.VBA代码

Sub xinjianbiao1()

'此处k被定义为整数,默认初始值为0,可以看做是一个开关,判断新表是否能够建立
'此处是针对工作表1单元格a1进行创建新表,如果要扩展到a2、a3的话,就需要对a1创建新表的内容循环三次,并稍作修改
'定义工作表变量sht
    Dim sht As Worksheet
'定义整型变量k
    Dim k As Integer    
For i = 1 To 3

    '【血泪提醒】记得要恢复标记值k=0,不然一直为1状态,就无法建立新工作表
    k = 0
    
    '遍历目前已经存在的工作表
    For Each sht In Sheets
        '如果存在工作表名与制定单元格值相同,则给k赋值1
        If sht.Name = Sheet1.Range("a" & i) Then
            k = 1
        End If
    Next
    
    '如果k值为0,则说明存在工作表名与指定单元格值没有相同
    
    If k = 0 Then  
        Sheets.Add after:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = Sheet1.Range("a" & i) 
    End If  
Next
End Sub

3.1月2月3月


1月2月3月.png

将分工作表内容合并到数据工作表中

【提醒】前提已经创建好数据工作表
1.分工作表


20190117-财务部.png
20190117-二车间.png
20190117-技改办.png
20190117-经理室.png

2.VBA代码(有待优化)

Sub hebingfenbiao()

'整型变量irow为分工作表的总行数,yrow为数据工作表总行数
Dim irow, yrow As Integer

'定义工作表变量sht
Dim sht As Worksheet

For Each sht In Sheets

    irow = sht.Range("a65536").End(xlUp).Row
    yrow = Sheets("数据").Range("a65536").End(xlUp).Row

    If sht.Name <> "数据" Then
                
        sht.Range("a1:f" & irow).Copy Sheets("数据").Range("a" & yrow + 1)
    
    End If

Next

'数据工作表A1单元格所在整行删除
Sheets("数据").Range("A1").EntireRow.Delete

'最后数据工作表被选中
Sheets("数据").Select

'提示操作已经执行完毕!
MsgBox "已经执行完毕!!!"

End Sub

3.合并后效果


20190122 合并分表到数据工作表

录制宏1,对某一单元格字体的大小进行修改

1.原单元格


原单元格大小

2.VBA代码(此代码是录制的)

Sub 宏1()

    With Selection.Font
        .Name = "宋体"
        .Size = 18
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .ThemeFont = xlThemeFontMinor
    End With
End Sub

3.执行代码后


执行程序后单元格大小

4.对录制宏代码进行修改

Sub test1()

    Sheet2.Range("A1").Font.Size = 18

End Sub

5.执行后效果


A1字体为18

对With的应用

1.未使用With的代码

Sub test()

    Sheet2.Range("A1") = 6
    Sheet2.Range("A4") = 12
    Sheet2.Range("A5") = 8
    Sheet2.Range("A7") = 10

End Sub

2.使用With的代码

Sub testxiugai()

    With Sheet2
    
        .Range("A1") = 6
        .Range("A4") = 12
        .Range("A5") = 8
        .Range("A7") = 10
    
    End With

End Sub

3.执行后的效果一样


With代码执行后

选中工作表中某单元格,则单元格所在整行标记某颜色

手动模式下的整行变色

1.手动模式下整行变色


手动模式下整行变色

2.VBA代码
【代码位置】代码在模块2中


模块2中的代码
Sub ChangeColor()
    '所有单元格背景色=无填充颜色
    Cells.Interior.Pattern = xlNone
    '选择单元格或者多个单元格(选区)所在整行背景颜色填充为黄色
    Selection.EntireRow.Interior.Color = 65535
     '选择单元格或者多个单元格(选区)所在整列背景颜色填充为黄色
    'Selection.EntireColumn.Interior.Color = 65535
End Sub

3.【弊端】在每次点击其他单元格或区域后,必须要点击宏,选择ChangeColor宏执行后才会有效果,不会自动。

自动模式下的整行变色

1.自动模式下的整行变色


自动模式下整行变色

2.VBA代码
【代码位置】代码在Sheet1


代码在Sheet1中
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    '工作表选区发生变化,此sub是自动执行,不需要每次点击并选择宏
    '此处是事件,如果发生了某事,则会自动执行代码
    
    Cells.Interior.Pattern = xlNone
    Selection.EntireRow.Interior.Color = 65535      
End Sub

3.【好处】每当单元格点击发生变化后,触发事件,自动执行事件中包含的代码,不用再去点击宏啦!!!

按工作表1中单元格内容进行创建新工作表

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

推荐阅读更多精彩内容