打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
EXCEL单个文件多表合并工具

上一篇我们分享了用透视表分发EXCEL数据

在4S店还会遇到这样的情况:

为了数据整洁,将“集客记录”每天做一张表格,一个月一个EXCEL文件,里面有31张表,月底要要统计分析时需要汇总数据。

当然,其他行业也会遇到类似的情况:单个EXCEL文件中的多个表格合并成一个表格。

多表合并的前提条件:所有表格的表头完全一致

这在个前提下又分为两种情况:

一、表头位于第一行,所有数据向下累加

二、表头位于第一列,所有数据向右累加

另外,如果只想合并每张表的指定区域的数据怎么处理?

有些集团4S店,会将每个店的报表单独一页,各店的数据格式完全一致,如果只想分析其中某种业务的数据,就需要从每张表的指定区域复制数据出来。

下面给出的这个小工具,可以实现上述的功能。

这是向下合并的示例:

这是向右合并的示例:

向下合并截取部分数据的示例:

合并后,会自动将各个表的名字附在该表数据后面

这份源码如下:

Public multi As Boolean

Public selectrng As Variant

Function finalrow(sh As Worksheet)

Nrow = sh.UsedRange.Rows.Count

finalrow = sh.UsedRange.Rows(Nrow).Row

End Function

Function finalcol(sh As Worksheet)

Ncol = sh.UsedRange.Columns.Count

finalcol = sh.UsedRange.Columns(Ncol).Column

End Function

Sub CopyRangeFromMultiWorksheets()

Dim mybook As Workbook

Dim FName As Variant

Dim FNum As Long

Dim sh As Worksheet

Dim DestSh As Worksheet

Dim CopyRng As Range

Dim frow As Long, fcol As Long

Dim Lrow As Long, Lcol As Long

Dim multirow As Boolean

FName = Application.GetOpenFilename(filefilter:=Excel Files (*.xl*), *.xl*, _

MultiSelect:=True)

For FNum = LBound(FName) To UBound(FName)

Set mybook = Nothing

On Error Resume Next

Set mybook = Workbooks.Open(FName(FNum), UpdateLinks:=0)

On Error GoTo 0

Next FNum

UserForm1.Show

With Application

.ScreenUpdating = False

.EnableEvents = False

End With

'如果工作表RDBMergeSheet存在则将其删除

Application.DisplayAlerts = False

On Error Resume Next

ActiveWorkbook.Worksheets(RDBMergeSheet).Delete

On Error GoTo 0

Application.DisplayAlerts = True

'添加一个名为RDBMergeSheet的工作表

Set DestSh = ActiveWorkbook.Worksheets.Add

DestSh.Name = RDBMergeSheet

'遍历所有工作表并将数据复制到DestSh

For Each sh In ActiveWorkbook.Worksheets

If sh.Name DestSh.Name Then

'找到在工作表DestSh中带有数据的最后一行

Lrow = finalrow(DestSh)

Lcol = finalcol(DestSh)

frow = finalrow(sh)

fcol = finalcol(sh)

'设置希望复制的单元格区域

If selectrng = Then

Set CopyRng = sh.Range(sh.Cells(1, 1), sh.Cells(frow, fcol))

Else

Set CopyRng = sh.Range(selectrng)

End If

If multi Then

'测试工作表DestSh中是否有足够的行用来复制所有数据

If Lrow + CopyRng.Rows.Count DestSh.Rows.Count Then

MsgBox 在工作表Destsh中没有足够的行用来放置数据!

GoTo ExitTheSub

End If

'下面的语句从每个工作表中复制值和格式

CopyRng.Copy

With DestSh.Cells(Lrow + 1, A)

.PasteSpecial xlPasteValues

.PasteSpecial xlPasteFormats

Application.CutCopyMode = False

End With

'可选代码: 下面的语句复制工作表名称到最后一列

DestSh.Cells(Lrow + 1, fcol + 1).Resize(CopyRng.Rows.Count).Value = sh.Name

Else

If Lcol + CopyRng.Columns.Count DestSh.Columns.Count Then

MsgBox 在工作表Destsh中没有足够的列用来放置数据!

GoTo ExitTheSub

End If

'下面的语句从每个工作表中复制值和格式

CopyRng.Copy

With DestSh.Cells(1, Lcol + 1)

.PasteSpecial xlPasteValues

.PasteSpecial xlPasteFormats

Application.CutCopyMode = False

End With

'可选代码: 下面的语句复制工作表名称到最后一行

DestSh.Cells(frow + 1, Lcol + 1).Resize(1, CopyRng.Columns.Count).Value = sh.Name

End If

End If

Next

ExitTheSub:

Application.GoTo DestSh.Cells(1)

'自动调整DestSh工作表的列宽

DestSh.Columns.AutoFit

With Application

.ScreenUpdating = True

.EnableEvents = True

End With

End Sub

还有配合的窗体的源码:

Private Sub CommandButton1_Click()

'传递“向下”与“向右”的选择结果

If multi1.Value Then multi = True

If multi2.Value Then multi = False

'传递选区的输入结果

selectrng = selectbox.Value

'隐藏对话框

UserForm1.Hide

End Sub

如果需要源文件请关注微信公众号:EXCEL为工具4S店经营数据分析

留言索取

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
合并一个EXCEL多个sheet的内容到一个汇总sheet
神奇的Excel VBA系列之:制作工作表目录
搜集各种Excel VBA的命令供参考!
Excel vba批量提取文件名 修改文件名!
好几天才可以复制粘贴完,那就来用一键生成询证函(增强版)
vba excel编程三日谈(1)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服