文章目录
引言
问题的分析与设计
VBA打开关闭Excel文件
读取Excel文件内容
Excel文档之间复制粘贴数据
代码入口设计
代码实现
运行结果
回顾总结
引言
工作中为了方便查看和数据分析,我们经常会将很多Excel中的表格合并到一起,手动操作特别的麻烦,这个时候VBA就派上用场了,它可以帮助我们自动合并Excel内容
提前准备测试数据,有若干个待合并的Excel表格,存放路径:C:Test测试路径
每个Excel文档中内容不同,显示如下:

现在需要将它们合并后输出到C:Test汇总结果.xlsx文档中,来看一下要怎么实现吧
问题的分析与设计
整个功能实现设计到几个知识点,首先是利用VBA打开、关闭指定的Excel文件,其次是读取指定Excel数据,最后才是复制粘贴,内容有点多我们逐个介绍
VBA打开关闭Excel文件
使用Workbooks.Open方法即可,参考如下
Dim wbTarget As Object
Set wbTarget = Workbooks.Open(“C:Test汇总结果.xlsx”)
使用完后,True为保存关闭,False为不保存关闭,根据是情况选择
wbTarget.Close SaveChanges:=True
读取Excel文件内容
针对上一步打开的文档,即wbTarget变量指向新打开的Excel文档,可以通过wbTarget逐层获取该Excel文档对应的Sheet、Range、cells 。
如wbTarget.Sheets(1),即指向的是第一个Sheet表单,当无法确定第一个Sheet表单的名字时,这种方法很方便,如果确定Sheet表单的名字,也可以使用wbTarget.Worksheets(“Sheet1”),到这里是不是就很熟悉了呢?
Excel文档之间复制粘贴数据
复制粘贴数据有很多种方法,可以通过剪切板也可以通过数组,相比之下剪切板使用方便一些,可以支持整片区域的复制、也可以按行复制,数据量小的话也是不错的选择
代码中就是使用的按行复制,也可以通过简单的修改代码实现按区域复制,这样大家可以亲身体会两者的区别,比较优劣
对应代码行41~57,即For循环处开始
代码入口设计
考虑使用方便,还是选取在Sheet页面插入命令按钮(Active x控件)
第一步:Excel文件首先要另存为.xlsm格式文件,第一次打开.xlsm文件会有安全警告,选择启用即可
第二步:顺次选择工具栏 –开发工具–插入–命令按钮(Active X控件),在表单中的适当位置拖动鼠标即可插入。如果该步骤有问题,可以查看我前期写的公众号文章,里面有详细的步骤:如何快速开始编程还不用搭建环境,那一定就是它了……
第三步:双击添加的命令按钮,快速打开VBA代码并且默认会创建类似如下的两行代码,然后我们只要在中间添加代码就可以通过命令按钮调用了
Private Sub CommandButton1_Click()
End Sub
各种与用户交互的参数设置直接通过表格输入,整体显示如下

代码实现
源码如下,都是编程基础知识
''引用Microsoft Scripting Runtime库
Private Sub CommandButton1_Click()
Dim ws As Worksheet
Dim iRow As Integer
Set ws = Worksheets("Sheet1")
'根据目标路径获取Excel文件
Dim Filename As String
Dim SourcePath As String
SourcePath = ws.Cells(5, 2).Value 'B5单元格获取待合并Excel路径
Filename = Dir(SourcePath & "*.xlsx") '传入路径
If Filename = "" Then '指定路径下没有Excel文件
MsgBox "路径下没有Excel文件,请核对后再执行,程序退出!" '提示没有Excel文件,程序退出
Exit Sub
End If
iRow = 6 '获取待合并Excel文件列表,从6行保存,方便核对
Do While Filename <> ""
ws.Cells(iRow, 2).Value = SourcePath & "" & Filename '拼接全路径,并输入到B列(13行开始)
iRow = iRow + 1 '下一行'Debug.Print fileName
Filename = Dir 'Dir
Loop
'打开目标Excel
Dim wbTarget As Object
Dim TargetPath As String
Dim TargetSheet As Worksheet
Dim BeginRow As Integer
TargetPath = ws.Cells(3, 2).Value & "" & ws.Cells(4, 2).Value & ".xlsx" 'B3 B4单元格获取待合并Excel路径
Set wbTarget = Workbooks.Open(TargetPath, UpdateLinks:=0, ReadOnly:=False) '打开指定的Excel文件
Set TargetSheet = wbTarget.Sheets(1) '设置目标区域,默认第一个Sheet
BeginRow = 1
'读取源文件数据
Dim wbSource As Object
Dim n As Integer
Dim SourceSheet As Worksheet
Dim lastRow As Integer
Dim lastColumn As Integer
For n = 6 To iRow - 1 '循环控制Excel文件
SourcePath = ws.Cells(n, 2).Value
Set wbSource = Workbooks.Open(SourcePath, UpdateLinks:=0, ReadOnly:=True) ''打开指定的Excel文件,只读方式,不可见
Application.ScreenUpdating = False
Set SourceSheet = wbSource.Sheets(1) '设置目标区域,默认第一个Sheet
lastRow = SourceSheet.Cells(SourceSheet.Rows.Count, 1).End(xlUp).Row
Dim dRow As Integer
For dRow = 1 To lastRow
SourceSheet.Rows(dRow).Copy
TargetSheet.Range("A" & BeginRow - 1 + dRow).PasteSpecial xlPasteAll ' 仅复制值" xlPasteAll xlPasteValues
Next dRow
wbSource.Close SaveChanges:=False '源Excel文件只读取,不保存关闭
Set wbSource = Nothing
BeginRow = BeginRow + lastRow '下一个复制位置
Next n
' 关闭目标Excel
wbTarget.Close SaveChanges:=True '目标Excel文件保存关闭
Set wbTarget = Nothing
MsgBox "完成合并"
End Sub
运行结果
在Sheet1页面填写好参数之后,点击添加的命令按钮“合并Excel”后程序开始运行,完成内容合并程序结束后会有提示框,关闭提示框查看目标Excel文档,即可看到汇总后的数据信息

回顾总结
目前的代码只是实现不同Excel中内容的拼接,如果还有更多的要求,可以在这个基础上进行优化,基础框架都搭建好了,动手实现你心中最完美的表格汇总吧
如果想学习更多的编程知识,无论是用来提升自动化办公效率还是想着提升自我,都可以已关注我的公众号,解锁更多的VBA技能
我的分享对你有帮助的话,麻烦点赞、加已关注支持一下吧,你的支持就是我最大的创作动力!
最后,再提醒一下大家,如果你有需求但因为各种问题搁置,可以把你的问题反馈给我,一起帮你出谋划策哦!搜索公众号“努力鸭是黑色的”,已关注我的公众号能够更加及时沟通反馈哦!
















暂无评论内容