我有一个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)。我找不到任何类型的模式,也无法在网上找到任何信息,我已经搜索了好几个星期了!
答案 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的链接,以及在该链接的内容中提供代码的人。这是一种帮助,非常感谢。