当另一个文档已经打开时,打开Word文档时出现错误4605
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当另一个文档已经打开时,打开Word文档时出现错误4605相关的知识,希望对你有一定的参考价值。
所以当我想打开一个特定的word文档时,我在错误处理程序上遇到了这个问题。
到目前为止,我开始时的程序是:首次启动很好。然后,当我再次运行时,程序继续加载,直到我手动关闭Word。之后,Word为我提供了以只读模式访问文件的选项。
我已经在论坛和MSDN上搜索了几个小时,但找不到解决方案。
它也一直在给我
错误代码4605
当我第二次运行代码时。
码:
Sub OpenWord()
Dim WordApp As Word.Application
Set WordApp = CreateObject("Word.Application")
WordApp.DisplayAlerts = wdAlertsNone
On Error GoTo ErrorHandler:
WordApp.Documents.Open ("C:\Users\mvandalen\Desktop\Test.docx")
WordApp.Visible = True
Exit Sub
''just for testing
VariableCheese = 5 + 5
ErrorHandler:
WordApp.Documents.Close <<< Here it gives error 4605
WordApp.Quit
Resume Next
End Sub
最终编辑:感谢@Brett,我找到了一个解决方案。我复制了他的代码并删除了以下行(用>>>标记):
Sub final()
Set TestDoc = GetObject("C:\Users\mvandalen\Desktop\Test.docx")
>>>>If TestDoc Is Nothing Then
Set Wd = GetObject(, "Word.Application")
If Wd Is Nothing Then
Set Wd = CreateObject("Word.Application")
If Wd Is Nothing Then
MsgBox "Failed to start Word!", vbCritical
Exit Sub
End If
>>>>f = True
**Else** Added line
**MsgBox "Failed to start Word!", vbCritical** Added line
End If
>>>Set TestDoc = Wd.Documents.Open("C:\Users\mvandalen\Desktop\Test.docx")
>>>If TestDoc Is Nothing Then
>>>MsgBox "Failed to open help document!", vbCritical
>>>If f Then
>>>Wd.Quit
>>>End If
>>>Exit Sub
End If
Wd.Visible = True
>>>Else
>>>With WordDoc.Parent
>>>.Visible = True
>>>.Activate
>>>End With
>>>End If
End sub
此代码打开文件一次,然后再关闭它。但由于某种原因,这条线是必需的Set TestDoc = GetObject("C:\Users\mvandalen\Desktop\Test.docx")
。如果不是,Word文档将变为只读。
我首先转到文件>选项>常规,然后查看框中是否有复选标记:Open e-mail attachments and other uneditable files in reading view
。如果有,请将其删除。
也就是说,我的感觉是您正在尝试关闭已关闭(或未激活)或没有错误的文档。
要解决此问题,请执行以下操作:
If Err <> 0 Then
''Insert your error handling code here
Err.Clear
Resume Next
或者,问题是您没有检查文档是否已打开。这可能导致连续循环。我建议使用类似于下面示例的代码来检测文档是否已经打开。
Set TestDoc = GetObject("C:\Users\mvandalen\Desktop\Test.docx")
If TestDoc Is Nothing Then
Set Wd = GetObject(, "Word.Application")
If Wd Is Nothing Then
Set Wd = CreateObject("Word.Application")
If Wd Is Nothing Then
MsgBox "Failed to start Word!", vbCritical
Exit Sub
End If
f = True
End If
Set TestDoc = Wd.Documents.Open("C:\Users\mvandalen\Desktop\Test.docx")
If TestDoc Is Nothing Then
MsgBox "Failed to open help document!", vbCritical
If f Then
Wd.Quit
End If
Exit Sub
End If
Wd.Visible = True
Else
With WordDoc.Parent
.Visible = True
.Activate
End With
End If
如果文档已经打开,此代码将激活该文档。
根据您的新信息,另一个可能的原因是Visual Basic已经建立了对Word的引用,因为调用Word对象,方法或属性的代码行没有使用Word对象变量限定元素。在结束程序之前,Visual Basic不会释放此引用。当代码运行多次时,此错误引用会干扰自动化代码。要解决此问题,请更改代码,以便使用适当的对象变量限定对Word对象,方法或属性的每次调用。
最近解释这是一篇Excel文章:https://support.microsoft.com/en-hk/help/178510/excel-automation-fails-second-time-code-runs
为了帮助你,我需要知道:
- 你正在使用什么版本的Word。
- 您使用的是MacOS还是Windows?
- 您的宏安全设置是什么?
- 如果你杀了所有Word进程,错误仍然显示?
- 文件是否已准备就绪或受到其他保护?
- 如果您在进入“开发工具”选项卡并运行宏时打开文档并且它处于活动窗口中,是否仍会出现错误?
鉴于我们知道文档不断受到保护,请尝试通过进入信任中心并确保不会勾选Word 2003/7二进制文档和模板来删除保护。
在更仔细地查看代码时,我认为问题在于您不会释放Word对象。由于此代码在Excel中运行,因此这些对象将保留在内存中,而不会在宏结束时释放。并且Word出了名地试图打开一个仍然打开的文档也有问题 - 因为你在内存中有一个对象让它保持打开状态。
请参阅下面的代码更改 - Set [variable] = Nothing
行。
(请注意,您在代码示例中混合了变量名称“TestDoc”和“WordDoc” - 我只是复制了它 - 所以代码,因为它代表,无法正确运行。)
Set TestDoc = GetObject("C:\Users\mvandalen\Desktop\Test.docx")
If TestDoc Is Nothing Then
Set Wd = GetObject(, "Word.Application")
If Wd Is Nothing Then
Set Wd = CreateObject("Word.Application")
If Wd Is Nothing Then
MsgBox "Failed to start Word!", vbCritical
Exit Sub
End If
f = True
End If
Set TestDoc = Wd.Documents.Open("C:\Users\mvandalen\Desktop\Test.docx")
If WordDoc Is Nothing Then
MsgBox "Failed to open help document!", vbCritical
If f Then
Wd.Quit
Set Wd = Nothing
End If
Exit Sub
End If
Wd.Visible = True
Else
With WordDoc.Parent
.Visible = True
.Activate
End With
End If
Set WordDoc = Nothing
Set Wd = Nothing
请尝试以下代码。它:
•如果Word尚未运行,则启动Word。
•如果文档尚未打开,则打开文档。
•如果打开文档,则在编辑后保存并关闭文档。
•退出Word,如果它启动它。
当然,如果要保持文档打开,您可以省略文档关闭和应用程序退出代码。根据您是否要阻止对正在保存的文件的编辑,您可能还需要设置ReadOnly:= True。
Sub OpenWord()
Dim WdApp As Word.Application, WdDoc As Word.Document
Dim bQuit As Boolean, bClose As Boolean
Const StrFlNm As String = "C:\Users\mvandalen\Desktop\Test.docx"
If Dir(StrFlNm) = "" Then
MsgBox "Cannot find the file:" & vbCr & StrFlNm, vbCritical
Exit Sub
End If
bQuit = False: bClose = True
On Error Resume Next
Set WdApp = GetObject(, "Word.Application")
If WdApp Is Nothing Then
Set WdApp = CreateObject("Word.Application")
On Error GoTo 0
If WdApp Is Nothing Then
MsgBox "Can't start Word.", vbExclamation
Exit Sub
End If
bQuit = True
End If
On Error GoTo 0
With WdApp
.Visible = True
For Each WdDoc In .Documents
If WdDoc.FullName = StrFlNm Then
bClose = False: Exit For
End If
Next
If WdDoc Is Nothing Then
Set WdDoc = .Documents.Open(Filename:=StrFlNm, ReadOnly:=False, AddToRecentFiles:=False, Visible:=True)
End If
With WdDoc
'Do your document edits here
If bClose = True Then .Close SaveChanges:=True
End With
If bQuit = True Then .Quit
End With
End Sub
你必须仔细处理已经运行Word会话以及无法获得Word会话的可能性
所以你可以使用辅助函数:
Function GetWord(WordApp As Word.Application) As Boolean
On Error Resume Next
Set WordApp = GetObject(, "Word.Application") 'try getting an already running Word instance
If WordApp Is Nothing Then Set WordApp = CreateObject("Word.Application") ' if unsuccesful then try creating a new Word instance
GetWord = Not WordApp Is Nothing ' notify the result
End Function
因此,您的主要代码将重构如下
Option Explicit
Sub OpenWord()
Dim WordApp As Word.Application
If Not GetWord(WordApp) Then 'if unsuccesful in getting/creating a Word session then exit sub
MsgBox "Couldn't get an existing instance or create a new instance of Word", vbCritical
Exit Sub
End If
With WordApp 'reference the Word session you just got/created
.DisplayAlerts = wdAlertsNone
.Visible = True
On Error GoTo WordErrorHandler:
.Documents.Open ("C:\Users\mvandalen\Desktop\Test.docx")
' rest of your code exploiting the opened document
End With
On Error GoTo 0 'disable Word Error processing
' here goes the rest of your code to work without Word object/data
Exit Sub ' exit not to process statements following 'WordErrorHandler'
WordErrorHandler:
With WordApp
If .Documents.Count > 0 Then .Documents.Close '<<< Here it gives error 4605
.Quit
End With
Set WordApp = Nothing
Resume Next
End Sub
将文档另存为模板(.dotx)并将.Open()
更改为.Add()
。
Dim WordApp As Word.Application
Dim WordDoc As Word.Document
Set WordApp = New Word.Application
Set WordDoc = WordApp.Documents.Add "C:\Users\mvandalen\Desktop\Test.dotx"
WordApp.Visible = True
'...
WordDoc.Close wdDoNotSaveChanges
由于您有对Word的引用,因此无需调用CreateObject("Word.Application")
。
删除对Word库的引用并将WordApp
和WordDoc
声明为Object
,或使用New
关键字。
这样,您可以同时打开任意数量的实例。
以上是关于当另一个文档已经打开时,打开Word文档时出现错误4605的主要内容,如果未能解决你的问题,请参考以下文章