Word vba document.readonly status错误地返回false

时间:2012-09-27 22:20:10

标签: excel vba excel-vba ms-word word-vba

我有一个excel项目,它检查单词文档是否有更改的修改日期,如果更改,它会打开该文档并将单词表单字段中的文本导入excel。

打开并导入word文档的excel例程如下:

Sub CopyFromWord(pFile as String,aFile as string)

Dim wdApp As Object

On Error Resume Next
Set wdApp = GetObject(, "Word.Application")
If Err.Number <> 0 Then
    Set wdApp = CreateObject("Word.Application")
Else 'word is already running
End If
On Error Goto 0

Set wdDoc = wdApp.Documents.Open(Filename:="" & pFile & "", ReadOnly:=True)
wdApp.Visible = False
   For Each c In wdDoc.bookmarks
    'removed code that copies values from word doc fields to excel sheet
   Next c
wdApp.Activedocument.Close SaveChanges:=False

End Sub

单词文档全部以同一文件的副本开头。该文件有几千个副本,但每个副本都有一个唯一的名称。

用户找到他们需要的文件夹并在其中打开word文档。它会调出用户表单,然后使用userform的输入填充文档中的表单域。然后,命令按钮将保存并退出表单。

由于欢迎消息/ userform会在文档打开时自动加载,因此我将以下代码添加到文档的open事件中:

Sub Document_Open()

If ThisDocument.ReadOnly = True then Exit Sub

msgbox "Welcome " & Environ$("Username") & ". Click OK to begin."
Userform1.show

End sub

这确保当excel项目循环遍历所有文件时,如果发现一个文件已经更改,则需要打开文件(只读),以便它可以导入数据而不会被userform / welcome消息打断,关闭它,并继续搜索循环所有文件,检查更改的修改日期。

它应该不断运行,但是,大约20%的时间,文档将只能由excel代码打开,但word文档中的欢迎消息框将显示,表明thisdocument.readonly错误地返回false。 如果我在这种情况下调试word文档,并执行

? thisdocument.readonly

我收到“假”结果。但是,即使word文档的标题栏以“(只读)”结尾,因此它显然是以只读方式打开的,因此readonly应该返回True。

它并不特定于任何文档,如果我尝试重复打开它们,它似乎在下一轮工作(因为它正确地注册了只读并在消息框代码之前退出了sub)。我找不到任何类型的模式,也无法在网上找到任何信息,我已经搜索了好几个星期了!

1 个答案:

答案 0 :(得分:1)

可能不会被认为是答案,但根据蒂姆威廉的建议,我设法把这个完全解决了我的问题。我起初挣扎是因为我试图过早地设置房产。完整代码如下:

 Sub CopyFromWord(pFile as String)

 Dim wdApp As Object

 On Error Resume Next
 Set wdApp = GetObject(, "Word.Application")
 If Err.Number <> 0 Then
 Set wdApp = CreateObject("Word.Application")
 Else 'word is already running
 End If
 On Error Goto 0

'save current setting
secAutomation = wrdApp.Application.AutomationSecurity

'set Word to disable macros when a document is opened via vb:
wrdApp.Application.AutomationSecurity = msoAutomationSecurityForceDisable
'(without using wrdApp prefix it would only apply to the code's App i.e. Excel)

Set wdDoc = wdApp.Documents.Open(Filename:="" & pFile & "", ReadOnly:=True)
wdApp.Visible = False
For Each c In wdDoc.bookmarks
'removed code that copies values from word doc fields to excel sheet
Next c

'restore original setting before closing
wrdApp.Application.AutomationSecurity = secAutomation

wdApp.Activedocument.Close SaveChanges:=False

End Sub

非常感谢Tim Williams的链接,以及在该链接的内容中提供代码的人。这是一种帮助,非常感谢。