SolidWorks*Excel+VBA-关于拉取BOM提速
- 2026-11-07 16:46:49
SolidWorks*Excel+VBA-关于拉取BOM提速先对比下,这是之前的。 然后这是现在的。 两者对比,拉取信息的速度有明显提升。
程序代码并未做多大修改。 为什么会有这么大的差别,主要原因在于Excel单元格对象的批量赋值方法。耗时对比: 数组批量写入<<用循环对.cells()挨个赋值。 本次优化程序中,PropRng是单元格范围对象,ValArr是已经预处理过的数组数据,数组的数据顺序可按需调整。 赋值结束后需要清空数组留待下一次使用。清空数组一般有以下方式,我们这里需要保持维度,所以采用redim。 当前电脑的远古配置 
如果按当下正常点水平的绘图工作本,速度估计能达到各路插件的平均水准,吧

已关注
关注
重播 分享 赞
已关注
关注
重播 分享 赞
Sub GetBomTb_Next(ParaModel As ModelDoc2, i As Long, Multi As Boolean, Optional AllModelNmDic As Dictionary, Optional dep As String) '递归展开材料明细表Dim Comps As Variant, Comp As Variant, ChiModel As ModelDoc2, PartModel As PartDoc, SouRow As LongDim ModelNmDic As Dictionary, ChiModelFullNm As String, ChiModelNm As String, j As Long, k As Long, m As LongDim PropNms As Variant, PropTps As Variant, PropVal As Variant, PropValRes As VariantDim ModelMat As String, ActivConfig As String, PropTmp As String, PropRng As Range, ValArr()ParaModel.ResolveAllLightWeightComponents False '解除轻化Comps = ParaModel.GetComponents(True)Set ModelNmDic = CreateObject("Scripting.Dictionary")With ThisWorkbook.ActiveSheetj = 1ReDim Preserve ValArr(PropTitDicA.Count + PropTitDicB.Count - 2) '排除第一列,数组下标从0开始For Each Comp In CompsIf Not (Comp.IsSuppressed Or Comp.ExcludeFromBOM) Then '未压缩且未被排除Set ChiModel = Comp.GetModelDoc2: ChiModelFullNm = ChiModel.GetPathName: ChiModelNm = ChiModel.GetTitleActivConfig = ChiModel.ConfigurationManager.ActiveConfiguration.NameSelect Case MultiCase True '展开为多阶If Not ModelNmDic.Exists(ChiModelFullNm) Then '单个装配内,不重复搜索子阶Application.StatusBar = "正在汇算多阶BOM:" & ChiModelFullNmModelNmDic.Add ChiModelFullNm, iSet PropRng = .Range("B" & i).Resize(1, UBound(ValArr) + 1)ChiModel.Extension.CustomPropertyManager(ActivConfig).GetAll2 PropNms, PropTps, PropVal, PropValResFor m = 0 To UBound(ValArr)Select Case .Cells(1, m + 2).ValueCase "文件全名": ValArr(m) = ChiModelFullNmCase "文件位置": ValArr(m) = Left(ChiModelFullNm, InStrRev(ChiModelFullNm, "\") - 1)Case "SW模型文件名": ValArr(m) = Left(ChiModelNm, InStrRev(ChiModelNm, ".") - 1)Case "扩展名": ValArr(m) = UCase(Mid(ChiModelNm, InStrRev(ChiModelNm, ".")))Case "阶层": ValArr(m) = "S" & dep & "." & jCase "当前配置": ValArr(m) = ActivConfigCase "数量": ValArr(m) = 1Case "材质"If ChiModel.GetType = swDocASSEMBLY ThenChiModel.Extension.CustomPropertyManager(ActivConfig).Get2 "材料", PropTmp, ModelMatElseSet PartModel = ChiModelModelMat = PartModel.GetMaterialPropertyName2(ActivConfig, "")Set PartModel = NothingEnd IfValArr(m) = ModelMatCase ElseIf VarType(PropNms) <> vbEmpty Thenk = GetRefVal(.Cells(1, m + 2).Value, PropNms)If k <> 0 Then ValArr(m) = PropVal(k - 1)End IfEnd SelectNextPropRng.Value = ValArr: ReDim ValArr(UBound(ValArr))i = i + 1If ChiModel.GetType = swDocASSEMBLY Then GetBomTb_Next ChiModel, i, Multi, , dep & "." & j '递归展开j = j + 1ElseSouRow = ModelNmDic.Item(ChiModelFullNm).Cells(SouRow, PropTitDicA("数量")) = .Cells(SouRow, PropTitDicA("数量")) + 1End IfCase False '展开为单阶If Not AllModelNmDic.Exists(ChiModelFullNm) Then '全局唯一Application.StatusBar = "正在汇算单阶BOM:" & ChiModelFullNmAllModelNmDic.Add ChiModelFullNm, iSet PropRng = .Range("B" & i).Resize(1, UBound(ValArr) + 1)ChiModel.Extension.CustomPropertyManager(ActivConfig).GetAll2 PropNms, PropTps, PropVal, PropValResFor m = 0 To UBound(ValArr)Select Case .Cells(1, m + 2).ValueCase "文件全名": ValArr(m) = ChiModelFullNmCase "文件位置": ValArr(m) = Left(ChiModelFullNm, InStrRev(ChiModelFullNm, "\") - 1)Case "SW模型文件名": ValArr(m) = Left(ChiModelNm, InStrRev(ChiModelNm, ".") - 1)Case "扩展名": ValArr(m) = UCase(Mid(ChiModelNm, InStrRev(ChiModelNm, ".")))Case "阶层": ValArr(m) = "S1"Case "当前配置": ValArr(m) = ActivConfigCase "数量": ValArr(m) = 1Case "材质"If ChiModel.GetType = swDocASSEMBLY ThenChiModel.Extension.CustomPropertyManager(ActivConfig).Get2 "材料", PropTmp, ModelMatElseSet PartModel = ChiModelModelMat = PartModel.GetMaterialPropertyName2(ActivConfig, "")Set PartModel = NothingEnd IfValArr(m) = ModelMatCase ElseIf VarType(PropNms) <> vbEmpty Thenk = GetRefVal(.Cells(1, m + 2).Value, PropNms)If k <> 0 Then ValArr(m) = PropVal(k - 1)End IfEnd SelectNextPropRng.Value = ValArr: ReDim ValArr(UBound(ValArr))i = i + 1ElseSouRow = AllModelNmDic.Item(ChiModelFullNm).Cells(SouRow, PropTitDicA("数量")) = .Cells(SouRow, PropTitDicA("数量")) + 1End IfIf ChiModel.GetType = swDocASSEMBLY Then GetBomTb_Next ChiModel, i, Multi, AllModelNmDic '递归展开End SelectEnd IfNextEnd WithSet ModelNmDic = NothingSet Comp = NothingSet Comps = NothingSet ChiModel = NothingSet ParaModel = NothingEnd Sub
PropRng.Value = ValArr'批量赋值ReDim ValArr(UBound(ValArr))'数据清空,保留数组对象本身维度Erase ValArr'彻底清除,没法复用,需要再次定义维度


本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。