hello ,小伙伴们,大家好
在前两篇小编写了VBA 字典 数据行列转置一维表转二维表,二维表转一维表的...
在当中有提到过字典的关联定位功能
今天来举个荔枝..
如下图所示 ↓

这是一份业务员在各个地区销售产品的数据源
现需要转换成F列的格式
先上代码,代码如下
Sub Dic_关联()Dim Dic As ObjectDim aData, aResDim intX&, x&, y&, iRow&, iCol&Dim strID$aData = Range("B2").CurrentRegion '数据来源ReDim aRes(1 To UBound(aData), 1 To UBound(aData, 2)) '定义结果数组大小Set Dic = CreateObject("Scripting.Dictionary") '后期绑定字典iRow = 1 '数组行位置初始化For intX = 2 To UBound(aData) '遍历循环数据源strID = aData(intX, 1) & "," & aData(intX, 2) '连接字符串做为关键字 既 地区&","&产品If Not Dic.exists(strID) Then '判断关键字是否存在字典中iRow = iRow + 1 '结果数组行位置累加Dic(strID) = iRow '连接字符串作为关键字Key 数组行位置作为条目Item 写入字典Dic(iRow) = 3 '数组行位置作为关键字,条目为3,存入结果数组初始列为第3个位置aRes(iRow, 1) = aData(intX, 1) '符合条件的元素写入结果数组aRes(iRow, 2) = aData(intX, 2)aRes(iRow, 3) = aData(intX, 3)Dic(strID & "," & aData(intX, 3)) = "" '为避免出现重复,再次连接字符串 既地区&","&产品&","&业务员ElseIf Not Dic.exists(strID & "," & aData(intX, 3)) Then '判断地区&","&产品&","&业务员是否存在字典中x = Dic(strID) '取出结果数组行位置 地区&","&产品y = Dic(x) + 1 '取出结果数组列位置 并且+1If y > UBound(aRes, 2) Then ReDim Preserve aRes(1 To UBound(aRes), 1 To y)'判断列位置是否大于结果数据列维度,符合条件使用ReDim Preserve调整结果数组的大小aRes(x, y) = aData(intX, 3) '写入业务员Dic(x) = y '重新写入字典Dic(strID & "," & aData(intX, 3)) = ""End IfEnd IfNextaRes(1, 1) = "地区": aRes(1, 2) = "产品"For y = 3 To UBound(aRes, 2) '循环结果数组第一行aRes(1, y) = "业务员" & y - 2 '写入标题NextRange("F2").Resize(iRow, UBound(aRes, 2)) = aRes '输出内容Set Dic = Nothing '释放End Sub
运行效果

代码主要看第10至31行
第11行使用了字典的特点,关键字的唯一性,将多条件查询的字符串合并成一个字符串,转换成单条件查询
第12行判断字典中是否存在关键字
第13行结果数组行位置累加
第14行 将连接的字符串做为关键字Key条目为数组行位置Item 写入字典
第15行数组行位置作为Key初始Item为3写入字典
第19行为避免出现重复连接地区产品业务员作为关键字写入字典
第22至23行分别取结果数组的行列位置也就是我们常说的关联定位
...
在上述代码中,还是如前两篇文章所说的,利用了字典的特性,以关键字我Key,位置为Item,使多个数据之间存在位置的关联...
示例文件下载
链接:https://pan.baidu.com/s/1FBbsH8IsVWzW_bL6uJ5uXQ
提取码:abcd
收工!
如果小伙伴有好的思路,可以在小编的公众号留言发给小编研究下
文章觉得有用,点个赞+在看,你的每一次点赞和转发就是小编原创的动力
关注公众号 ↓

文章转载自Excel VBA练习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




