ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 行业案例 > 经营管理 > 轻巧应对多人填写表时数据冲突问题,按姓名拆分表格,填写完毕并合并表格内容

轻巧应对多人填写表时数据冲突问题,按姓名拆分表格,填写完毕并合并表格内容

作者:绿色风 分类:经营管理 时间:2022-08-18 浏览:312
楼主
い卋玑┾宝珼
在公司里,经常会有些表格,共享工作簿之后,可能同时有多个人一起填写。

对于这样的表格,如果大家同时填写在一行的话,保存时,就需要选择是保存对方的数据还是自己的数据,这造成了许多不遍。

于是提出了这样的一个需求。根据填写的表格的内容,依据需要填写的人员,拆分成多个表格,最终再将多个表格合并在一起。

合并后的表格,可以按照需要,进行排序等。

这件事情,用VBA是可以实现的。

第一步:准备一张表,具有三个sheet,表名类似如下:

 

第一页为最终统计的表,第二页放置模板,在第三页放置填写人的姓名等。

模板类似下图:

 

第三页的姓名列,类似下图

 

第二步:拆分表
根据第三页填写的信息,将表按人名拆分成多份
  1. Sub AddForPerson()
  2. 'add workbook

  3. '
  4.     Dim sh As Worksheet, i As Integer, sLocation As String
  5.     ' 对于date中的所有的名字
  6.     For i = 2 To ThisWorkbook.Sheets(3).Cells(Rows.Count, 1).End(3).Row
  7.         '复制模板sheet
  8.         ThisWorkbook.Sheets(2).Copy
  9.         Set sh = ActiveSheet
  10.         '改名
  11.         sh.Name = ThisWorkbook.Sheets(3).Cells(i, 1).Value
  12.         '设置保存路径
  13.         sLocation = ThisWorkbook.Path & "\" & sh.Name & ".xls"
  14.         ActiveWorkbook.SaveAs Filename:=sLocation, FileFormat:=xlNormal
  15.         '关闭文档
  16.         ActiveWorkbook.Close True
  17.     Next
  18. End Sub
第三步,填写之后,合并表
需要注意的一点,以我公司的表为例,除了标题以后,还会增加一行或者两行例子,如图所示

 
所以在合并表的时候,需要从有效数据开始复制。
  1. '合并总表
  2. Sub Summary()
  3.     Dim wb As Workbook, sLocation$, sShName$, iRows As Integer, icolumn As Integer, iTotalCount As Integer, sh1 As Worksheet, iRowExample As Integer
  4.     Set sh1 = ThisWorkbook.Sheets(1)
  5.     iRowExample = ThisWorkbook.Sheets(2).Cells(Rows.Count, 2).End(3).Row '统计加例子一共多少行
  6.     iRows = sh1.Cells(Rows.Count, 2).End(3).Row '总表中数据行数
  7.     icolumn = sh1.Cells(1, Columns.Count).End(1).Column '总表中数据列数
  8.     sh1.Range(sh1.Cells(iRowExample + 1, 1), sh1.Cells(iRows + 1, icolumn)).ClearContents '清空已经填写的数据
  9.     For i = 2 To ThisWorkbook.Sheets(3).Cells(Rows.Count, 1).End(3).Row '姓名列表第一行为标题,所以从第二行取到最后一行
  10.         sShName = ThisWorkbook.Sheets(3).Cells(i, 1).Value '取单元格内容
  11.         '设置取文档的路径
  12.         sLocation = ThisWorkbook.Path & "\" & sShName & ".xls"
  13.         Workbooks.Open sLocation '打开文档
  14.         iRows = ActiveWorkbook.Sheets(1).Cells(Rows.Count, 2).End(3).Row '填写数据的最后行
  15.         icolumn = sh1.Cells(1, Columns.Count).End(1).Column '填写数据的最后列
  16.         iTotalCount = sh1.Cells(Rows.Count, 2).End(3).Row '总表中已经转移了多少行
  17.         If iRows > iRowExample Then '当个人表格中,有填写数据时
  18.             ActiveWorkbook.Sheets(1).Range(ActiveWorkbook.Sheets(1).Cells(iRowExample + 1, 1), ActiveWorkbook.Sheets(1).Cells(iRows, icolumn)).Copy sh1.Cells(iTotalCount + 1, 1) '拷贝数据到总表
  19.         End If
  20.         ActiveWorkbook.Close True '关闭文档
  21.     Next
  22.     iTotalCount = sh1.Cells(Rows.Count, 2).End(3).Row '获取总表中数据总共行数
  23.     If iTotalCount > iRowExample Then '当总表有填写数据时
  24.         sh1.Cells(iRowExample + 1, "A") = 1 '设置起始编号
  25.         sh1.Range("A" & iRowExample + 1).AutoFill Destination:=sh1.Range("A" & iRowExample + 1 & ":A" & iTotalCount), Type:=xlFillSeries '填充序号
  26.     End If
  27. End Sub
在例如以上代码的时候,只需要将模板列和总表列的内容,换成你需要的数据即可
代码很简单,但是如果碰到共享的文档的时候,还是很实用的

表格合并之后,就可以在总表中,按照你需要的顺序,排列数据即可


PS。以上代码,在XP的2003和2007中,以及Win7的2003,2010与2013中测试均没有问题。如发现问题,请注明系统环境与使用版本,最好顺便带附件说明发生问题的环境。谢谢

2012-08-20日 12:35 修正:当没有填写任何数据的时候,统计的表格内容有问题,添加了保护处理
2012-08-20日 18:44修正:修正了起始序列号有时候不对的问题,添加代码sh1.Cells(iRowExample + 1, "A") = 1 '设置起始编号

轻巧应对多人填写表时数据冲突问题,按姓名拆分表格,填写完毕并合并表格内容.rar
2楼
xmyjk
谢谢西西分享。
3楼
嘉昆2011
Mark

解决了文件共享后,不能使用数据透视表查看数据源明细的问题。
4楼
CheryBTL
确实强大,收藏学习**
5楼
vanesshuan
好像很难
6楼
雾里看花
主要还是看理解,活学活用。其实不用VBA也可以完成。

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap