1

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

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

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 文档最初都是同一个文件的副本。该文件有几千个副本,但每个副本都位于自己的文件夹中,并具有唯一的名称。

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

因为欢迎消息/用户表单会在文档打开时自动加载,所以我将以下代码添加到文档的打开事件中:

Sub Document_Open()

If ThisDocument.ReadOnly = True then Exit Sub

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

End sub

这确保了当 excel 项目循环遍历所有文件时,如果它发现一个文件已更改,它需要打开文件(只读),以便它可以导入数据而不会被用户表单/欢迎消息中断,关闭它并携带在搜索循环所有文件检查更改的修改日期。

它应该持续运行,但是,大约 20% 的时间,一个文档将仅通过 excel 代码打开,但会显示 word 文档中的欢迎消息框,表明 thisdocument.readonly 错误地返回了 false。如果我在这种情况下调试 word 文档,然后执行

? thisdocument.readonly

我得到一个“错误”的结果。但是,即使是 word 文档的标题栏也以“(只读)”结尾,所以它显然已经以只读方式打开,因此 readonly 应该返回 True。

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

4

1 回答 1

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 的链接,以及在该链接内容中提供代码的人。这是一个很大的帮助,非常感谢。

于 2012-10-02T23:30:42.630 回答