SolidWorks*Excel+VBA-文件格式转换-其二(完整代码,量大管饱)
- 2026-10-25 02:51:49
SolidWorks*Excel+VBA-文件格式转换-其二(完整代码,量大管饱)接上回,这次放出完整代码结构,咱们自顶向下挨个索引。 友情提醒:内容极其枯燥,让人极度不适,现在退出文章还来得及

既然上车,那就别走了,车门已焊死,来折磨下自己的大脑
1、文件格式转换主程序: 主程序调用的第一个变量OutPutFileTypes,在全局中预先定义(上篇已说) 1.1、接下来是主程序调用的第一个子过程myselcondi(),用于处理选择操作结果 这个子过程调用了两个全局变量,存储选择的行表信息 1.2、继续,接下来是第二个子过程SetGolDic(),用来设置全局字典。 同样,这个过程也是用到3个全局字典变量,用于索引表头,文件类型 1.3、接下来,就是我们的进度条老朋友ProcessBarUpdater(),就不多说了。 1.4、然后,就到轮了重量级选手OpenDsFiles_next(),打开文件。 这段程序做了通用化处理,可以被不同程序段调用,返回一个2元素一维数组,第一个元素存文件对象,第二个元素存处理结果信息。 1.4.1、这段程序也有个子过程,ChkDrwSlt(),检查工程图,工程图如果有问题,那必然是万万不能输出的。 到这里为止,就是程序结构全过程。 乍一看,像屎山......再看,作为作者,都不想去多看一眼
值得一提的是这几个字典变量贯穿全文,几乎所有程序段都有它们的身影。 



Sub OutputFlies() '导出dwg/dxf/pdf/stp/x_t/igsDim ReturnVal(), NullVal(1), SwDrw As DrawingDoc, SwMdoc As ModelDoc2, OutPutfs As StringDim k As Integer, posn As Long, Results1 As String, Results2 As StringDim Outpt2D As Boolean, Outpt3D As BooleanOutpt2D = OutPutFileTypes.chk_DWG Or OutPutFileTypes.chk_DXF Or OutPutFileTypes.chk_PDFOutpt3D = OutPutFileTypes.chk_STEP Or OutPutFileTypes.chk_X_T Or OutPutFileTypes.chk_IGSIf Not (Outpt2D Or Outpt3D) ThenMsgBox "未勾选任何输出文件类型!", vbExclamation, "不正经的机械仙人"Exit SubEnd IfWith ThisWorkbook.ActiveSheetIf myselcondi ThenswApp.CloseAllDocuments (True): SetGolDicFor k = 1 To SelnumberProcessBarUpdater k, Selnumber, "正在转换输出:", "共" & Selnumber & "个,第" & k & "个 ..."posn = Selarray(k)OutPutfs = .Cells(posn, PropTitDicA("文件位置")) & "\" & .Cells(posn, PropTitDicA("SW模型文件名")) '此时先不含后缀'导出2D图If Outpt2D ThenReturnVal = OpenDsFiles_next("slddrw", posn, True)Results1 = ReturnVal(1)ElseReturnVal = NullValEnd IfIf VarType(ReturnVal(0)) <> vbEmpty Then Set SwDrw = ReturnVal(0)If Results1 = "SW工程图√" ThenResults1 = ""If OutPutFileTypes.chk_DWG ThenSwDrw.SaveAs2 OutPutfs & ".dwg", swSaveAsCurrentVersion, True, TrueResults1 = Results1 & "dwg;"End IfIf OutPutFileTypes.chk_DXF ThenSwDrw.SaveAs2 OutPutfs & ".dxf", swSaveAsCurrentVersion, True, TrueResults1 = Results1 & "dxf;"End IfIf OutPutFileTypes.chk_PDF ThenSwDrw.SaveAs2 OutPutfs & ".pdf", swSaveAsCurrentVersion, True, TrueResults1 = Results1 & "pdf;"End IfEnd IfIf Not SwDrw Is Nothing ThenswApp.QuitDoc SwDrw.GetPathName: Set SwDrw = NothingEnd IfErase ReturnVal'导出3D图If Outpt3D ThenReturnVal = OpenDsFiles_next("model", posn)Results2 = ReturnVal(1)ElseReturnVal = NullValEnd IfIf VarType(ReturnVal(0)) <> vbEmpty Then Set SwMdoc = ReturnVal(0)If Results2 = "SW模型√" ThenResults2 = ""If OutPutFileTypes.chk_STEP ThenSwMdoc.SaveAs2 OutPutfs & ".step", swSaveAsCurrentVersion, True, TrueResults2 = Results2 & "step;"End IfIf OutPutFileTypes.chk_X_T ThenSwMdoc.SaveAs2 OutPutfs & ".x_t", swSaveAsCurrentVersion, True, TrueResults2 = Results2 & "x_t;"End IfIf OutPutFileTypes.chk_IGS ThenSwMdoc.SaveAs2 OutPutfs & ".igs", swSaveAsCurrentVersion, True, TrueResults2 = Results2 & "igs;"End IfEnd IfIf Not SwMdoc Is Nothing ThenswApp.QuitDoc SwMdoc.GetPathName: Set SwMdoc = NothingEnd IfErase ReturnVal.Cells(posn, PropTitDicA("操作结果")) = Results1 & Results2: Results1 = "": Results2 = ""NextElseMsgBox "未选择正确行,程序结束!", vbExclamation, "不正经的机械仙人"End IfEnd WithErr.ClearApplication.StatusBar = FalseEnd Sub
Public Type chkBoxschk_DWG As Booleanchk_DXF As Booleanchk_PDF As Booleanchk_STEP As Booleanchk_X_T As Booleanchk_IGS As BooleanEnd TypePublic OutPutFileTypes As chkBoxs
Function myselcondi() As Boolean '处理选择操作Dim MySelection() As IntegerDim i As Long, j As LongDim Selarea As Range, Selrange As RangeReDim MySelection(1 To 1000) As IntegerOn Error Resume NextErr.Clear: j = 1000Selnumber = 1For Each Selarea In Selection.AreasFor Each Selrange In Selarea.RowsIf Not (Selrange.Hidden) And Selrange.Row > 2 ThenMySelection(Selnumber) = Selrange.RowSelnumber = Selnumber + 1If Selnumber > j - 2 Thenj = j + 1000ReDim Preserve MySelection(1 To j)End IfEnd IfNextNextSelnumber = Selnumber - 1If Selnumber = 0 Thenmyselcondi = False: Exit FunctionEnd IfReDim Preserve MySelection(1 To Selnumber) As Integer: Selarray = MySelectionFor i = 1 To SelnumberMySelection(i) = WorksheetFunction.Small(Selarray, i)NextSelarray = MySelection: myselcondi = TrueEnd Function
Public Selarray As Variant, Selnumber As Integer '选择的行数Function SetGolDic() '给全局字典赋值Dim i As Integer, Swftypes()Swftypes = Array(Array(".SLDPRT", swDocPART), Array(".SLDASM", swDocASSEMBLY), Array(".SLDDRW", swDocDRAWING))With ThisWorkbook.ActiveSheetPropTitDicA.RemoveAll: PropTitDicB.RemoveAll: SwFtypeDic.RemoveAlli = 1Do While .Cells(1, i) <> ""If .Cells(1, i).Interior.Color <> 10498160 Then '紫色底色为通用属性PropTitDicA.Add .Cells(1, i).Value, iElsePropTitDicB.Add .Cells(1, i).Value, iEnd Ifi = i + 1LoopFor i = 0 To UBound(Swftypes)SwFtypeDic.Add Swftypes(i)(0), Swftypes(i)(1)NextEnd WithEnd Function
Public PropTitDicA As New Dictionary '非通用化属性表头Public PropTitDicB As New Dictionary '通用化一般属性表头Public SwFtypeDic As New Dictionary 'SW文件类型
Function ProcessBarUpdater(CurNum As Integer, TotalNum As Integer, strTopic As String, endTopic As String)Dim intNumberOfall As Integer, intCurrentOfBars As IntegerIf CurNum = 1 Then Application.StatusBar = "就绪"intNumberOfall = 35 '总显示长度intCurrentOfBars = (CurNum / TotalNum) * intNumberOfallApplication.StatusBar = strTopic & "「" & String(intCurrentOfBars, Chr(47)) & String(intNumberOfall - intCurrentOfBars, Chr(45)) & "」" & endTopicEnd Function
Function OpenDsFiles_next(DsFtype As String, posn As Long, Optional drwchk As Boolean) As Variant '打开文件子程序Dim DsFname As String, SwErr As Long, SwFileType As Long, OpFile As Variant, ReturnVal(1)With ThisWorkbook.ActiveSheetSelect Case TrueCase DsFtype = "model"DsFname = .Cells(posn, PropTitDicA("文件位置")) & "\" & .Cells(posn, PropTitDicA("SW模型文件名")) & .Cells(posn, PropTitDicA("扩展名"))If Dir(DsFname) = "" ThenReturnVal(1) = "无SW模型文件!"ElseSwFileType = SwFtypeDic(UCase(.Cells(posn, PropTitDicA("扩展名"))))Set OpFile = swApp.ActivateDoc2(DsFname, False, SwErr)If OpFile Is Nothing Then Set OpFile = swApp.OpenDoc(DsFname, SwFileType)If OpFile Is Nothing ThenReturnVal(1) = "打开SW模型失败!" '重名或高版本ElseSet ReturnVal(0) = OpFileReturnVal(1) = "SW模型√"End IfSet OpFile = NothingEnd IfCase DsFtype = "slddrw"DsFname = .Cells(posn, PropTitDicA("文件位置")) & "\" & .Cells(posn, PropTitDicA("SW模型文件名")) & ".SLDDRW"If Dir(DsFname) = "" ThenReturnVal(1) = "无SW工程图!"ElseSwFileType = swDocDRAWINGSet OpFile = swApp.ActivateDoc2(DsFname, False, SwErr)If OpFile Is Nothing Then Set OpFile = swApp.OpenDoc(DsFname, SwFileType)If OpFile Is Nothing ThenReturnVal(1) = "打开SW工程图失败!" '重名或高版本ElseOpFile.ViewFullPageSet ReturnVal(0) = OpFileIf drwchk Then ReturnVal(1) = ChkDrwSlt(OpFile) '执行检查End IfSet OpFile = NothingEnd IfCase ElseDsFname = .Cells(posn, PropTitDicA("文件位置")) & "\" & .Cells(posn, PropTitDicA("SW模型文件名")) & "." & DsFtypeIf Dir(DsFname) = "" ThenReturnVal(1) = "无" & UCase(DsFtype) & "文件!"ElseIf Shell("explorer " & DsFname, vbNormalFocus) = 0 ThenReturnVal(1) = UCase(DsFtype) & "打开失败!"ElseReturnVal(1) = UCase(DsFtype) & "√"End IfEnd IfEnd SelectEnd WithOpenDsFiles_next = ReturnValEnd Function
FunctionChkDrwSlt(SwDrw As Variant)AsString '检查工程图:比例,配置等Dim i As Integer, LinkedScale As Long, ViewLinkedConfi As Long, BOMLinkedConfig As Long, ShtNames, Views, SubViewDim BomFeat As BomFeature, mSwDrw As ModelDoc2, BomConfigNms, ConfigVis, viewptShtNames = SwDrw.GetSheetNames: Set mSwDrw = SwDrwFor i = 0 To UBound(ShtNames)Views = SwDrw.Sheet(ShtNames(i)).GetViewsIf VarType(Views) = vbEmpty Then GoTo Next1For Each SubView In Viewsviewpt = SubView.PositionIf viewpt(0) * viewpt(1) = 0 Then GoTo Next2 '调色板视图,x/y位置有一个是0If SubView.GetBaseView Is Nothing Then '主视图没有基础视图If Not SubView.UseSheetScale Then LinkedScale = LinkedScale + 1ElseIf Not SubView.UseParentScale And SubView.Type <> swDrawingDetailView _And InStr(SubView.Name, "轴测") = 0 _Then LinkedScale = LinkedScale + 1 '视图比例未关联父视图,不考虑局部视图、轴测图If Not SubView.LinkParentConfiguration And _(SubView.Type = swDrawingAuxiliaryView Or SubView.Type = swDrawingProjectedView) _Then ViewLinkedConfi = ViewLinkedConfi + 1End If'检查明细表配置与关联视图是否一致If SubView.GetKeepLinkedToBOM ThenmSwDrw.Extension.SelectByID2 SubView.GetKeepLinkedToBOMName, "BOMFEATURE", 0, 0, 0, False, 0, Nothing, 0Set BomFeat = mSwDrw.SelectionManager.GetSelectedObject5(1)mSwDrw.ClearSelection2 TrueBomConfigNms = BomFeat.GetConfigurations(True, ConfigVis)If BomConfigNms(0) <> SubView.ReferencedConfiguration Then BOMLinkedConfig = BOMLinkedConfig + 1Set BomFeat = Nothing: Erase BomConfigNms: Erase ConfigVisEnd IfNext2: NextErase ViewsNext1:NextErase ShtNames: Set mSwDrw = NothingIf LinkedScale + ViewLinkedConfi + BOMLinkedConfig = 0 ThenChkDrwSlt = "SW工程图√"ElseIf LinkedScale > 0 Then ChkDrwSlt = ChkDrwSlt & "视图比例×;"If ViewLinkedConfi > 0 Then ChkDrwSlt = ChkDrwSlt & "视图配置×;"If BOMLinkedConfig > 0 Then ChkDrwSlt = ChkDrwSlt & "明细表配置×;"End IfEnd Function


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