这次VBA的目标就是把不同工作表内的不同表头(即列标题有所不同)的表格进行汇总到一张表内。

先来看下这张汇总表格有什么地方是值得注意的:列标题与数据是一一对应的,来自哪个表的数据就对应行标题来自哪个表格

列标题汇总了所有的列标题(项目名称),避免了重复

数据填充在相应的单元格,没有数据的地方就留空

思路

因为列标题是汇总的,没有重复的,所以就先想到可以利用字典来进行汇总,同时排除了重复项。又因为数据要填充到相应的单元格,即要有对应的行号和列号,就选择用列标题的值和列标题对应的item进行标号,以确保数据能进入正确的单元格。利用一个循环找到操作一张表格的起始行号和结束行号,对第一列进行填充,以达到粘贴的数据与行标题是对应的效果。

简而言之,分为以下几步:遍历工作表,取出不同的标题行名称

遍历每一列,把每一列的数据复制到合并表

命名对应的行标题

实战

遍历工作表1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18Set d = CreateObject("scripting.dictionary")

Set newst = Sheets.Add

newst.Name = "合并"

m = 2

For Each sh In Sheets

If sh.Name <> "合并" Then

For i = 1 To sh.UsedRange.Columns.Count

If Not d.exists(sh.Cells(1, i).Value) Then

d(sh.Cells(1, i).Value) = m

m = m + 1

End If

Next i

End If

Next sh

newst.Range("A2") = "工作表"

newst.Range(Cells(1, 2), Cells(1, d.Count + 1)) = d.keys

建立一个字典,对一个文档中的所有工作表进行遍历,对凡是名字不叫合并的表,取出首行的标题名称,检查是否在字典关键字中,若没有就添加到关键字,并指定item。item的命名是有讲究的,因为可以直接用来对应粘贴数据值。由于数据是从第二列开始粘贴的(第一列是显示对应的工作表名称),所以item的命名也从2开始。最后把字典中的关键字(不同的标题名称)赋值给合并表中的首行单元格。

复制数据1

2

3

4

5

6

7

8

9

10For Each sh In Sheets

If sh.Name <> "合并" Then

r = newst.UsedRange.Rows.Count + 1

For i = 1 To sh.UsedRange.Columns.Count

sh.UsedRange.Columns(i).Offset(1).Copy newst.Cells(r, d(sh.Cells(1, i).Value))

Next i

r2 = newst.UsedRange.Rows.Count

newst.Range("A" & r & ":A" & r2) = sh.Name

End If

Next sh

同样使用循环遍历所有的工作表,只是将中间的字典部分进行了更换。把一张工作表中的数据都粘贴到合并表中,其中粘贴的内容要向下横移一行(offset),因为首行是标题行,不需要粘贴。

合并表中的标题行是唯一值,所以序列号与单张表中的标题行序列肯定是不匹配的,如何确保特定列的内容能准确无误的粘贴进相应的列当中呢?这就要用到我们之前为关键字指定的item,通过keys查找item的值,我们可以确定对应的列在合并表中是哪一列,以进行定位。

确定粘贴的行数就相对简单些,因为只要在使用过的行以下进行粘贴就好了。但是要注意的是由于我们是对一个文档中所有的工作表进行遍历循环,所以行数的增加(r = newst.UsedRange.Rows.Count + 1)应当放在遍历列循环的外面,否则每完成一列的粘贴,行数就会往下错,导致数据粘贴成阶梯形状(自己动手试试或者脑补吧 =_=)

命名行标题

最后利用r和r2来确定遍历一个工作表的起始行和结束行,将这几行的第一列命名为相应的表名即可。

全部代码1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42Sub combin()

Dim d As Object

Dim newst As Worksheet

Dim sh As Worksheet

Dim m

Dim r, r2

Dim i

Set d = CreateObject("scripting.dictionary")

Set newst = Sheets.Add

newst.Name = "合并"

m = 2

For Each sh In Sheets

If sh.Name <> "合并" Then

For i = 1 To sh.UsedRange.Columns.Count

If Not d.exists(sh.Cells(1, i).Value) Then

d(sh.Cells(1, i).Value) = m

m = m + 1

End If

Next i

End If

Next sh

newst.Range("A2") = "工作表"

newst.Range(Cells(1, 2), Cells(1, d.Count + 1)) = d.keys

For Each sh In Sheets

If sh.Name <> "合并" Then

r = newst.UsedRange.Rows.Count + 1

For i = 1 To sh.UsedRange.Columns.Count

sh.UsedRange.Columns(i).Offset(1).Copy newst.Cells(r, d(sh.Cells(1, i).Value))

Next i

r2 = newst.UsedRange.Rows.Count

newst.Range("A" & r & ":A" & r2) = sh.Name

End If

Next sh

Set d = Nothing

End Sub

总结

运用字典的时候可以巧妙的运用keys和item的对应关系进行单元格定位,这样可以减少很多的工作量并且非常有效的达到目的。

表头顺序不一样的表格如何合并_不同表头的多表合并相关推荐

  1. excel合并多个工作表_多个Excel工作表合并到一个工作簿

    Excel多工作表合并可以采用PowerQuery来实现,不需要复杂的代码.不需要额外的插件! (注:PowerQuery是微软推出的一个功能强大的数据抓取工具,在Excel2013中需要安装官方插件 ...

  2. python做excel多表按列合并_python如何实现excel多表合并(附代码)_后端开发

    php504错误怎么解决_后端开发 php504错误的解决方法:1.增加fastcgi进程响应的缓冲区大小:2.更改php环境配置,增加php-cgi进程处理脚本的超时时间:3.将php-fpm的处理 ...

  3. 表头顺序不一样的表格如何合并_excel表怎样将两张表的数据合并,顺序不一样...

    展开全部 1.首先打开2个excel表格(如图一.图二),会发现这两个excel表格的A列是相同类型的,都是"百32313133353236313431303231363533e58685e ...

  4. 中数组的合并_【美团面试题】合并两个有序数组

    [美团面试题]合并两个有序数组 题目描述 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组 划重点 初始化 nums1 和 ...

  5. 三轴合并_用两套乐高60107合并成铰接式云梯消防车,看看和60112有什么区别

    我们之前通过将乐高城市组 60107 那套云梯消防车改装成一个特技赛车冲过终点线的场景,来演示了积木的套内 MOC. 今天我们就来看看两套 60107 又能做什么. 60107 (2006) 2016 ...

  6. 帆软相同列合并_扩展后连续单元格合并

    2.1 模板设计 1)新建数据集查询ds1: SELECT substr(订购日期,1,4) as 年份, 货主省份, 货主城市, count(1) as 数量 FROM S订单 where 货主省份 ...

  7. python 批量替换一对多sheet邮件合并_:巧用Word的邮件合并功能批量处理文件_读览天下...

    Word中的邮件合并功能特别适合处理大批量的文件.在秘书工作中,诸如制作信封.席卡等格式相同的大批量文件,均可用邮件合并功能实现,以减少工作量.本文试以制作3份请柬为例,讲解Word2007中该功能的 ...

  8. mysql内联表格使用索引_【求助】MYSQL表关联内联视图不走索引问题??诡异啊...

    首先声明: FACT_DATE_SALES_CI_INDEX 的DAY,DIM_ORG建有复合索引,同时FACT_DATE_SALES_FACT_DATE_SALES_F1表的RETAIL_SALES ...

  9. python 视频字幕合并_怎么把字幕和视频合并(教你两者合并方法)

    其实超简单超简单!python好现成的库,一下子省略了好多步骤! 本文在Windows环境下!linux只是不需要手动输入imagicmagick的位置! PS:如有需要Python学习资料的小伙伴可 ...

最新文章

  1. 清华姚班校友陈丹琦斩获2022斯隆奖!「诺奖风向标」27位华人学者入选
  2. 手机可以阅读html吗,手机文档html能删除吗
  3. linux kernel的问与答
  4. 建立ssh无密码登录环境
  5. Android自定义View——可以设置最大宽高的FrameLayout
  6. java黄油刀_一篇文章玩转ButterKnife,让代码更简洁
  7. ONVIF协议网络摄像机(IPC)客户端程序开发(3):理解什么是Web Services
  8. 太原理工大学荣获2020(第二届)集成电路EDA设计精英挑战赛一等奖
  9. 服务器系统winpe提取驱动,WinPE 10 驱动程序包
  10. cub数据集多少张图片_细粒度分类数据集汇总
  11. 【信息通信与软件工程国际会议】2022年第二届信息通信与软件工程国际会议
  12. 哈工大计算机网络Mooc 第八章笔记(网络层(中))
  13. web项目移动端在线预览(word格式转html)
  14. crm管理系统是什么意思 crm系统全称是什么 - whale帷幄
  15. UE4 actor碰到炸弹血条减少
  16. 手机dpi修改工具_修改手机的分辨率,让你的手机更流畅
  17. 1、Android概述
  18. DIJ(单源次短路) - Two Paths - HDU 6181
  19. C++ 内容基础知识
  20. 世界过敏性疾病日 | 儿童过敏性鼻炎校园筛查启动

热门文章

  1. 关于 Android 6.0 的流媒体播放异常
  2. The SwiftProgramming Language读书笔记第26页
  3. Android【Retrofit(HTTP客户端),RxJAVA(响应式编程)】
  4. java支持wingdings吗,[转]往JRE里添加新字体
  5. 人工智能 2. 图像识别
  6. 信息系统项目管理师自学笔记(一)——信息的定义与信息系统
  7. 搜狐云景client工具评測之WordPress的搭建
  8. 训练O_net网络,并测试图片
  9. “功能”之后,网约车决胜“服务”
  10. 想进阿里?这些Dubbo面试题助你一臂之力