总是听到或看到有人问,编程好学吗?如何入门?多久能学会?它能做些什么?怎么写代码呀?执行过程中出问题了谁能帮帮我...如果你也有类似的问题那就赶快关注我的公众号,一起学起来吧!
在Excel数据处理中,数据字典和数组的组合应用是解决复杂问题的“黄金搭档”,能够显著提升办公自动化水平和数据处理效率。通过将字典的快速查找能力与数组的高效批量操作相结合,可以应对多种常见且棘手的应用场景
接下来就通过一则案例近距离地感受一下它们的魅力吧
1 实现需求
如下图所示,有两张表格,结构一致,但是B列和F列产品顺序不一致

现在要求将两张表格的数据基于一个共同的基准列(如B列)进行对齐,如将第二张表格(F列和G列)按照B列产品顺序重新调整,最终结果显示如下:

2 代码及说明
2.1 操作步骤
打开你的.xlsm文档
按下 Alt + F11 快捷键,打开VBA编辑器
2.2 代码实现
代码核心逻辑:
首先以B列和F列为基准确定两张表的数据条数,并将B列、F列及G列数据读入内存数组,方便快速操作
使用字典对象,将F列的值作为"键"(Key),将其对应的行索引作为"项"(Item)存储起来。这样,就创建了一个从F列值到其所在行位置的快速查找表,具体可参考如下图帮助理解

遍历B列的每一个值,在字典中查找是否存在匹配的键。如果找到,则从原始数组中取出对应的F、G列数据,按照B列的顺序放入新的临时数组中;如果找不到,则放入一个错误值(如#N/A)以作标识
将重组后的数组写回原始的F列和G列位置,完成数据的重新排列
参考代码如下:
重要提醒:代码执行过程中会直接修改工作表中的原始数据,且操作不可撤销,因此一定要提前备份好数据
Sub AlignTablesByColumnB()Dim ws As WorksheetDim lastRowB As Long, lastRowF As LongDim i As Long, j As LongDim arrB As Variant, arrF As Variant, arrG As VariantDim tempF As Variant, tempG As VariantDim dict As ObjectDim found As Boolean' 设置当前工作表Set ws = ActiveSheet' 获取B列和F列的最后一行数据lastRowB = ws.Cells(ws.Rows.Count, "B").End(xlUp).RowlastRowF = ws.Cells(ws.Rows.Count, "F").End(xlUp).Row' 将数据读入数组arrB = ws.Range("B1:B" & lastRowB).ValuearrF = ws.Range("F1:F" & lastRowF).ValuearrG = ws.Range("G1:G" & lastRowF).Value' 创建临时数组存储重新排序后的数据ReDim tempF(1 To lastRowB, 1 To 1)ReDim tempG(1 To lastRowB, 1 To 1)' 使用字典建立F列值的快速查找索引Set dict = CreateObject("Scripting.Dictionary")For i = 1 To UBound(arrF, 1)If Not dict.Exists(arrF(i, 1)) Thendict(arrF(i, 1)) = i ' 存储行索引End IfNext i' 按照B列的顺序重新排列F、G列数据For i = 1 To UBound(arrB, 1)found = FalseIf dict.Exists(arrB(i, 1)) Thenj = dict(arrB(i, 1))tempF(i, 1) = arrF(j, 1)tempG(i, 1) = arrG(j, 1)found = TrueEnd If' 如果未找到匹配项,可以留空或标记If Not found ThentempF(i, 1) = CVErr(xlErrNA) ' 或 ""tempG(i, 1) = CVErr(xlErrNA) ' 或 ""End IfNext i' 将重新排序后的数据写回F、G列ws.Range("F1").Resize(UBound(tempF, 1), 1).Value = tempFws.Range("G1").Resize(UBound(tempG, 1), 1).Value = tempG' 清理对象Set dict = NothingMsgBox "表格对齐完成!F、G列已按照B列的顺序重新排列。", vbInformationEnd Sub
3 结尾
好了,今天的编程知识到此结束了,又到每日分享冷知识的时间了,一个小小的连字符(-)能犯多大错误?
1962年,NASA的“水手1号”金星探测器因火箭导航程序代码中遗漏了一个连字符(-),导致发射后不久偏离轨道,最终被摧毁。这个小小的语法错误在当时造成了约8000万美元的损失,可谓是最昂贵的软件错误了
本公众号一直在不间断地分享免费的编程案例和实用技巧。无论您是用来提升自动化办公效率还是想提升自我,请关注我的公众号,解锁更多的编程知识