由于工作需要,做了一些excel操作word的小工具。但是头疼的是,给多个同事用的话需要挨个儿手动加载word引用。
于是乎,在网上找到了解决方案:http://www.exceloffice.net/archives/2065
使用的是:
object.AddFromGuid (guid, major, minor) As Reference
我按照我的使用方式修改了一下:
- 首先确定当前excel能否使用VBProject,如不能,提示解决方法:“Excel-文件-选项-信任中心-信任中心设置-宏设置-勾选信任对VBA工程对象模型的访问”。(当然,首先当前脚本已加载了 MS VB for App)
- 由于不确定同事使用的office版本,需要把当前excel已加载的word引用清除;后来发现无法清除已丢失的word引用,于是把这一步放到了excel关闭的时候操作;
- 搜索当前excel引用的版本,加载对应的word引用。由于手头office有限,无法获得所有的版本号,所以使用On Error Resume Next把未识别的都加载上。
顺便还学习了一下 On Error
- On Error Resume Next ‘ 不报错
- On Error Goto myErr ' 发生错误时跳转到myErr,当然此标签段末尾需要加上Exit Function/Sub
- On Error Goto 0 ' 恢复默认报错模式
代码如下:
'
' 一、 预加载word引用
'
Function fn_preLoad()
fn_preLoad = 0
Dim oRef As Reference
Dim iVer
Dim sArrTmp
Dim guidWord, guidExcle
Dim msgErr, msgMethod
Dim test
guidWord = "{00020905-0000-0000-C000-000000000046}"
guidExcle = "{00020813-0000-0000-C000-000000000046}"
On Error GoTo err_word_ref
Set test = ThisWorkbook.VBProject.References
With ThisWorkbook.VBProject
' 由于打开此脚本的word版本不同,首先清空word引用
' 无法清除丢失的word引用,解决方法:excel关闭的时候清除word引用
' For Each oRef In .References
' If oRef.GUID = guidWord Then
' .References.Remove oRef
' End If
' Next
' 检测当前excel引用的版本,
' Description="Microsoft Excel 11.0 Object Library"
For Each oRef In .References
If oRef.GUID = guidExcle Then
sArrTmp = Split(oRef.Description, " ")
iVer = CInt(sArrTmp(2))
End If
Next
' 加载对应的word引用
If iVer = 16 Then
' word2016
Set oRef = .References.AddFromGuid(guidWord, 8, 7)
ElseIf iVer = 14 Then
' word2010
Set oRef = .References.AddFromGuid(guidWord, 8, 5)
ElseIf iVer = 11 Then
' word2003
Set oRef = .References.AddFromGuid(guidWord, 8, 3)
Else
' office有限。。。无法测试
On Error Resume Next
Set oRef = .References.AddFromGuid(guidWord, 8, 4)
Set oRef = .References.AddFromGuid(guidWord, 8, 6)
On Error GoTo 0
End If
End With
fn_preLoad = -1
Exit Function
err_word_ref:
msgErr = " 错误 " & Err.Number & " : " & Err.Description & vbCrLf
msgMethod = "解决方法:" & vbCrLf & _
" 1、Excel-文件-选项;" & vbCrLf & _
" 2、信任中心-信任中心设置;" & vbCrLf & _
" 3、宏设置,勾选 ""信任对VBA工程对象模型的访问"";" & vbCrLf & _
" 4、确定。"
MsgBox msgErr & msgMethod
Exit Function
End Function
excel关闭时清除word引用代码:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim oRef As Reference
Dim guidWord
guidWord = "{00020905-0000-0000-C000-000000000046}"
On Error Resume Next
With ThisWorkbook.VBProject
' 由于打开此脚本的word版本不同,需清空word引用
' 无法清除丢失的word引用,解决方法:excel关闭的时候清除word引用
For Each oRef In .References
If oRef.GUID = guidWord Then
.References.Remove oRef
End If
Next
End With
End Sub