以安全模式打开Word(从Outlook VBA)

时间:2010-07-23 10:57:20

标签: ms-word word-vba outlook-vba

我有一个Word文档作为电子邮件的附件,我需要从中获取一些数据以传递给URL。为此,我将附件保存到本地临时文件,然后打开文档,然后使用Word对象模型从文档中的表中提取数据。

我在VBA中打开文档时遇到了一些问题:首先它很慢,因为我们有一些企业宏内容在Word打开时加载;其次,如果有任何消息在Word打开时ping(例如文档恢复内容),代码就会挂起而Word永远不会关闭。

所以,我的问题是我可以从VBA以安全模式打开Word,这样除了裸骨文档之外什么都没有(因为这就是我所需要的)?或者,有没有更好的方法来控制Word来解决我遇到的问题?

1 个答案:

答案 0 :(得分:2)

也许使用shell以安全模式打开,比如说:

“C:\ Program Files \ Microsoft Office \ Office11 \ Winword.exe”/ a

然后使用GetObject获取实例。

更多详情:

Dim wd As Object
Dim strWord As String, strDoc As String
Dim intSection As Integer
Dim intTries As Integer

    On Error GoTo ErrorHandler

    strWord = "C:\Program Files\Microsoft Office\Office11\WinWord.Exe"
    strDoc = "C:\Docs\ADoc.doc"

    Shell """" & strWord & """ /a", vbMinimizedFocus

    ''Set focus to something other than the word document
    ''See http://support.microsoft.com/kb/238610
    Forms!MyForm.SetFocus

    intSection = 1 ''attempting GetObject...
    Set wd = GetObject(, "Word.Application")
    intSection = 0 ''resume normal error handling

    wd.Documents.Open strDoc

    ''Code here

    Set wd = Nothing

    ''Exit procedure:
    Exit Sub

ErrorHandler:
    If intSection = 1 Then
        intTries = intTries + 1
        If intTries < 20 Then
            Sleep 500 '' wait 1/2 seconds
            Resume ''resume code at the GetObject line
        Else
            MsgBox "GetObject still failing. Process ended.", _
                vbMsgBoxSetForeground
        End If
    Else ''intSection = 0 so use normal error handling:
        MsgBox Error$
    End If

对于睡眠,这需要放在模块的顶部:

Private Declare Sub Sleep Lib "kernel32" _
    (ByVal dwMilliseconds As Long)

/ a启动Word并防止加载项和全局模板(包括Normal模板)自动加载。

/ a开关还锁定设置文件;也就是说,如果使用此开关,则无法读取或修改设置文件。