ad

《Excel VBA+SQL数据管理与应用模板开发》_工作效率UP!_5.2 工作表快速合并

网友投稿 115 2023-11-07

【摘要】 本书摘自《Excel VBA+SQL数据管理与应用模板开发》一书中第5章,第2节,韩小良著。

5.2 工作表快速合并

如何把大量的工作表合并到一个工作表中呢?加入合并的工作表不在一个工作 簿中,而是多个独立的工作簿,又该如何合并呢?每个工作表的列数不一样,但需 要把共有的列数据汇总起来,如何处理?诸如此类,就是工作表的合并问题。

如果基础表格是规范的表单,使用Power Query可以快速地合并并建立数据 模型,在此基础上进行各种分析。但是,如果基础表不规范(例如,列数不一样、 列顺序不一样、表格顶部还有大标题之类的文字),此时使用VBA 就是一种较好的 选择。

本节将结合实际案例,介绍工作表合并的VBA+ADO+SQL 方 法 。

快 速 汇 总 当 前 工 作 簿 或 其 他 工 作 簿 中 的 N 个 工 作 表

《Excel VBA+SQL数据管理与应用模板开发》_工作效率UP!_5.2 工作表快速合并

这种问题在实际工作中经常会遇到。例如,将当前工作簿中的12个月工资表进行汇总、 将另外一个工作簿里的12个月工资表进行汇总(不打开该工作簿),将工作簿里的数百个店 铺数据进行汇总等。

对于这样的汇总,可使用连接查询的方法来完成,也就是对每个工作表的 SELECT 语句 用UNION 进行连接,即可得到这些工作表的汇总数据。这种方法在第3章已经介绍过了, 语句基本结构如下(注意,下面的语句写法要求每个工作表的列结构必须完全相同,也就是 列数相同,列顺序也相同)。

select *from[表1$]

union

select *from[表2S]

union

select *from [表3$]

union

select *from [表N$]

如果仅仅是汇总这些工作表中共有的几列数据,可以用具体的字段列表来代替星号(*)。

select 字段1,字段2,字段3,…,字段n from[表1S]

unjon

select字段1,字段2,字段3,…,字段n from [表2$]

union

select字段1,字段2,字段3,…,字段n from [表3$]

union

select字段1,字段2,字段3,…,字段n from[表N$]

快速汇总N 个工作簿,每个工作簿只有一个工作表

如果是要汇总指定文件中的N 个工作簿,但每个工作簿中仅有一个工作表,并且每个工 作表都有相同的名称,那么可以使用循环访问工作簿的方法来查询每个工作簿数据,然后把 每个工作簿数据保存在当前工作簿中。

案例5-4

下面的例子是汇总当前工作簿所在文件夹下的子文件夹“案例5-4源文件”里的6个工 作簿,并分别保存6个分公司的工资数据

Sub 合并汇总工作簿_保存到一个工作表0

Dim cnn As ADODB.Connection

Dim rs As ADODB.Recordset

Dim ws As Worksheet

Dimi As Integer,n As Integer,fName As String

Dim wb As Variant

指定保存汇总数据的工作表

Set ws =This Workbook.Worksheets("汇总表")

ws.Range("A2:Z100000").Clear

'指定要汇总的工作簿

wb=Array(" 分公司A"," 分公司B"," 分公司C"," 分公司D"," 分公司E"," 分公司F")

循环每个工作簿进行查询汇总

Fori=0 To UBound(wb)

'确定每个工作簿数据开始保存的起始行

n=ws.Range("A100000").End(xIUp).Row+1

'指定每个工作簿的路径和名称

fName =ThisWorkbook.Path&"案例5-4源文件"&wb(i)&".xlsx"

'建立与每个工作簿的连接

Set cnn =New ADODB.Connection

With cnn

.Provider ="microsoft.ace.oledb.12.0"

.ConnectionString="Extended Properties=Excel 12.0;"_

&"Data Source="&fName

.Open

End With

'查询每个工作簿的数据

Sql="select'"&wb(i)&"as 分公司,*from [工资表$]"

Set rs =New ADODB.Recordset

rs.Open Sql,cnn,adOpenKeyset,adLockOptimistic

ws.Range("A"&n).CopyFromRecordset rs

'关闭该工作簿的查询和连接

rs.Close

cnn.Close

Next i

MsgBox"汇总完毕!"vbInformation," 汇总工作簿"

End Sub

运行上面的程序,即可将6个工作簿数据汇总到一个工作表中,如图5-8所示。

如果不是将6个工作簿数据汇总到当前工作簿的一个工作表中,而是分别保存在当前工 作簿的不同工作表中,工作表名称就是工作簿名称,那么可以将程序修改如下。

Sub 合并汇总工作簿_分工作表保存0

Application.DisplayAlerts =False

Dim cnn As ADODB.Connection

Dim rs As ADODB.Recordset

Dim ws As Worksheet

Dim i As Integer,j As Integer,n As Integer,fName As String

Dim wb As Variant

'指定要汇总的工作簿

wb=Array(" 分公司A"," 分公司B"," 分公司C"," 分公司D"," 分公司E"," 分公司F")

'删除当前工作簿中已经存在的工作表

On Error Resume Next

Fori=0To UBound(wb)

This Workbook.Worksheets(wb(i)).Delete

Next i

'依次访问每个工作簿,查询数据

Fori=0 To UBound(wb)

'创建新工作表,并将新建的工作表重命名为该工作簿名称

Set ws =Worksheets.Add(after:=Worksheets(Worksheets.Count))

ws.Name =wb(i)

'指定每个工作簿的路径和名称

fName =ThisWorkbook.Path&"\案例5-4源文件\"&wb(i)&".xlsx"

'建立与每个工作簿的连接

Set cnn =New ADODB.Connection

With cnn

.Provider ="microsoft.ace.oledb.12.0"

.ConnectionString="Extended Properties=Excel 12.0;"_

&"Data Source="&fName

.Open

End With

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:达人之路·《高效办公应用宝典公式·函数与VBA》_2.2 公式的复制与填充
下一篇:《Excel VBA跟卢子一起学早做完,不加班(实战进阶版)》_2.5.2 OateDiff 函数和C 转换函数
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×