欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > 使用多个VBA字典对象快速整理BOM层级

使用多个VBA字典对象快速整理BOM层级

2025/9/15 18:58:20 来源:https://blog.csdn.net/taller_2000/article/details/147670236  浏览:    关键词:使用多个VBA字典对象快速整理BOM层级

实例需求:系统中导出的BOM清单如下图中左侧(A列和B列)所示,现在需要整理为右侧所示的BOM节点层级表(D列和E列)。

在这里插入图片描述

示例代码如下。

Sub Demo()Dim oDicAll As Object, oDicPair As ObjectDim i As Long, v, arrSet oDicAll = CreateObject("scripting.dictionary")Set oDicPair = CreateObject("scripting.dictionary")arr = Range("A1").CurrentRegion.ValueFor i = LBound(arr) + 1 To UBound(arr)oDicAll(arr(i, 1)) = EmptyoDicAll(arr(i, 2)) = EmptyoDicPair(arr(i, 2)) = arr(i, 1)Next iDim iCnt As Long: iCnt = oDicAll.Counti = 0For Each v In oDicAll.keysIf Not oDicPair.exists(v) ThenoDicAll(v) = 1i = i + 1Debug.Print i, v & " - level 1"End IfNextDo While TrueFor Each v In oDicPair.keysIf Not VBA.IsEmpty(oDicAll(oDicPair(v))) ThenoDicAll(v) = oDicAll(oDicPair(v)) + 1oDicPair.Remove vi = i + 1Debug.Print i, v & " - level " & oDicAll(v)If i = iCnt Then Exit DoEnd IfNextLoopRange("D:E").ClearContentsRange("D1:E1") = Array("子项", "BOM层级")Range("D2").Resize(iCnt, 1) = Application.Transpose(oDicAll.keys)Range("E2").Resize(iCnt, 1) = Application.Transpose(oDicAll.items)
End Sub

【代码解析】

第4~5行代码创建两个字典对象。

  • oDicAll保存BOM节点的层级
  • oDicPair保存BOM节点的父子从属关系

第6行代码将数据读取到数组中。
第7~11行代码循环遍历数据,将数据加载到两个字典对象中。
第12行代码获取BOM节点的个数。
第14~20行代码循环遍历全部BOM节点,寻找根节点。
第15行代码判断节点是否存在于oDicPair中,那么说明该结点为根节点。
第16行代码设置其层级为1。
第17行代码计数器累加。
第18行代码在【立即窗口】输出节点信息(非必需步骤)。
第21~31行代码更新oDicAll中的BOM层级。
由于无法确定完成此步骤的循环次数,因此第21行代码的循环条件为True,循环体内必须有可以结束循环的代码语句(如第28行代码),否则将成为死循环。
第22~30行代码循环遍历父子从属关系字典。
第23行代码判断父节点是否已经具备层级信息。
如果满足条件,第24行代码将更新子节点层级。
第24行代码计数器累加。
第28行代码判断已经填充层级信息的节点个数,如果与字典中元素个数相同,说明已经确定全部节点的层级,将结束Do循环。
第32行代码清空结果单元格区域。
第33行代码写入标题行。
第34~35行代码将字典中的数组写入工作表。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词