乐于分享
好东西不私藏

SolidWorks*Excel+VBA-中期优化

SolidWorks*Excel+VBA-中期优化

因为涉及Excel以及SW应用程序的交互,大部分sub过程都需要获取SW对象,在以往的例子中,可以看到大量的这句代码
Set swApp = GetObject(, "SldWorks.Application")
但是当SW主程序未打开,GetObject是获取不到对象的,会报错,于是,你又可以看到大量的强制忽略错误的代码
On Error Resume Next
在VBA中,这句代码是强制忽略所有错误,继续按步执行下一句语句。这就会导致很多其他错误一并被忽略,不方便调试,也容易埋雷。
所以,预先把肯定会报错的程序段隔离出去,降低风险。
Public swApp As SldWorks.SldWorksSub myftn(Control As IRibbonControl) '回调Dim PrgID As String, PrgArr As VariantOn Error GoTo AppNoOpen        PrgID = Control.ID: PrgArr = Split(PrgID, "_")        If InStr(PrgID, "SWapp") <> 0 Then            Set swApp = GetObject(, "SldWorks.Application")AppNoOpen:  If swApp Is Nothing Then                MsgBox "请先打开SolidWorks!", vbExclamation, "不正经的机械仙人"                Err.Clear                Exit Sub            End If        End IfOn Error GoTo PrgEnd        If UBound(PrgArr) > 1 Then            Application.Run PrgArr(1), PrgArr(2)        Else            Application.Run PrgArr(1)        End If        If Not swApp Is Nothing Then Set swApp = Nothing        Exit SubPrgEnd: MsgBox "遇到错误,已中止!", vbExclamation, "不正经的机械仙人"        Err.ClearEnd Sub
把swapp设为全局变量,所有程序都可引用,然后在按钮回调机制中判断当前程序是否需要getobject,把错误前置隔离。
但是如何判断当前程序段是否需要获取sw对象?这个就得在定制xml中,id名称加以区分,我是通过判断id名称中是否含有swapp字符串判断。
看到这里,你已经可以隔离报错了,把它牢牢捏在手里。