hello,小伙伴们,大家好
今天小编的领导的领导要求把这些数据合并起来
就以小编这暴脾气本想甩锅不干的,退回去的
开玩笑...工作还是要做,工资还是要拿~
如下图所示

运行效果

代码如下
Sub GetData(control As IRibbonControl)Dim Dic As ObjectDim intX&, intY&, iRow&, iCol&, y&, x&Dim aData, aRes, strName$aData = Range("A1").CurrentRegion '获取数据来源Range(Range("k1"), Cells(1, Columns.Count)).EntireColumn.Clear '清除K列以后的数据iCol = 1: iRow = 1: x = 1 '初始化数据ReDim aRes(1 To UBound(aData), 1 To iCol) '定义结果数组大小Set Dic = CreateObject("Scripting.Dictionary") '后期绑定字典For intX = LBound(aData) To UBound(aData) '遍历循环数据源,从最小下标开始strName = aData(intX, 1) '赋值If strName <> "" ThenIf strName = "姓名" Then '判断是否为姓名x = intX '获取所在数据源行位置For intY = 2 To UBound(aData, 2)If aData(intX, intY) <> "" ThenIf Not Dic.exists(aData(intX, intY)) Then '判断标题关键字是否存在于字典中iCol = iCol + 1 '累加数据列位置Dic(aData(intX, intY)) = iCol '标题关键字对应的条目为结果数组列位置If iCol > UBound(aRes, 2) Then ReDim Preserve aRes(1 To UBound(aRes), 1 To iCol) '调整结果数组大小aRes(1, iCol) = aData(intX, intY) '结果数组写入标题End IfEnd IfNextElseiRow = iRow + 1 '结果数组行位置累加aRes(iRow, 1) = aData(intX, 1) '写入名字For intY = 2 To UBound(aData, 2)If aData(x, intY) <> "" Theny = Dic(aData(x, intY)) '获取标题关键字的条目aRes(iRow, y) = aData(intX, intY) '写入结果数组End IfNextEnd IfEnd IfNextaRes(1, 1) = "姓名"With Range("K1").Resize(iRow, iCol).Value = aRes '输出内容.Font.Name = "微软雅黑" '修改字体.Borders.ColorIndex = 23 '添加边框End WithSet Dic = Nothing '释放字典内存End Sub
如果小伙伴有看过之前关于字典的文章,这个做起来应该不是很难
VBA 字典 多表不同标题顺序 使用字典定位来合并工作表真的很简单
代码解析:
第10至36行循环数据源
第11行判断数据源中的第1个列位置是否为空,源数据带有合并单元格
第12行判断数据源中的第1个列位置是否为姓名,如果是证明这一行为标题行,循环判断,记录各个标题在结果数组中的列位置
第14行x先记录标题在数据源的那个行位置,这个很重要
第16行判断是否为空值,由于数据源不规则,为空代表到头了,该处可以加多个条件为空Exit For跳出循环,代码少跑点...
第28至33行,证明数据源第1列不是空值也不是标题,则是数据内容,先存入名字,利用存入x记录的标题所在数据源中的行位置,使用字典的特性取出每一列对应的标题所在结果数组中的列位置
第31行写入内容
第38至42行输出内容,格式设置...
示例文件下载
链接:https://pan.baidu.com/s/1cXWULw4BZSet-6Fu6zrKUg
提取码:abcd
收工!
如果小伙伴有好的思路,可以在小编的公众号留言发给小编研究下
文章觉得有用,点个赞+在看,你的每一次点赞和转发就是小编原创的动力
关注公众号 ↓
文章转载自Excel VBA练习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




