6

我有以下代码来打开我开发的 Excel 工作簿应用程序的手册:

Sub OpenManual()

'Word.Application.Documents.Open "\\filePath\FormFlow To MSExcel\FeedSampleReport-Manual.docx"

Dim objWord As Object
Set objWord = CreateObject("Word.Application")
objWord.Visible = True

objWord.Documents.Open "\\filePath\FormFlow To MSExcel\FeedSampleReport-Manual.docx"

End Sub

这给了我两个问题:

  1. 文档打开,但在后台。用户不知道文档已打开,除非他们知道在任务栏中检查 Microsoft Word。
  2. 当我尝试关闭我收到的 word 文档时: 此文件正在被另一个应用程序或用户使用。(C:\Users\Me\AppData...\Normal.dotm)

当我在该对话框上单击确定时,我会收到一个“另存为”屏幕。

如果我取消它并尝试关闭空白的 Microsoft Word 实例,我会得到:

已进行影响全局模板 Normal 的更改。是否要保存这些更改?

然后,如果我单击否,一切最终都会关闭。

谁能帮我解决这两个问题?我需要以某种方式释放对象吗?以前从未见过这种情况。

编辑

尝试@Layman-Coders 方法后:

Sub OpenManual()
'Word.Application.Documents.Open "\\filePath\FormFlow To MSExcel\FeedSampleReport-Manual.docx"

'Open an existing Word Document from Excel
Dim objWord As Object
Set objWord = CreateObject("Word.Application")
objWord.Visible = True

' Should open as the forefront
objWord.Activate

'Change the directory path and file name to the location
'of the document you want to open from Excel
objWord.Documents.Open "\\filePath\FormFlow To MSExcel\FeedSampleReport-Manual.docx"

objWord.Quit
Set objWord = Nothing

End Sub

当我打开另一个 word 文档并单击按钮时,会发生以下情况:

  1. 手册在最前面打开,但我立即收到This file is in use by another application or user. (C:\Users\Me\AppData\...\Normal.dotm)
  2. 我按 OK 并收到 Save As 对话框。
  3. 取消“另存为”对话框并显示我的手动文档。
  4. 当我单击红色 X 关闭文档时,我收到Changes have been made that affect the global template, Normal. Do you want to save those change?我单击否并且文档关闭。

如果此文档是我打开的单词的第一个实例:

  1. 文档打开。
  2. 一旦代码到达该objWord.Quit行,文档就会立即关闭。

我只是希望文档在最前面打开,允许用户在需要时查看手册以获得帮助,并让他们自行决定关闭文档。

4

3 回答 3

11

因此,您遇到的 Word 要求您保存全局模板的问题是因为已经打开了一个 Word 副本,该副本具有 Normal 模板的权限。当您用于CreateObject设置 Word 对象时,您将第二次加载 Word,它将 Normal 模板打开为只读。

您需要做的是检查 Word 是否打开以及是否抓取了 Word 的副本。如果不是,那么您可以打开 Word。

Sub OpenManual()
    Dim objWord As Object

    'We need to continue through errors since if Word isn't
    'open the GetObject line will give an error
    On Error Resume Next
    Set objWord = GetObject(, "Word.Application")

    'We've tried to get Word but if it's nothing then it isn't open
    If objWord Is Nothing Then
        Set objWord = CreateObject("Word.Application")
    End If

    'It's good practice to reset error warnings
    On Error GoTo 0

    'Open your document and ensure its visible and activate after openning
    objWord.Documents.Open "\\filePath\FormFlow To MSExcel\FeedSampleReport-Manual.docx"
    objWord.Visible = True
    objWord.Activate

    Set objWord = Nothing
End Sub

另一行不错的代码是抑制显示警报。这将停止出现“您要保存”类型的对话框。

objWord.DisplayAlerts = 0

于 2013-06-19T21:01:34.197 回答
3

尝试这样的事情:

Sub OpenManual()

'Word.Application.Documents.Open "\\filePath\FormFlow To MSExcel\FeedSampleReport-Manual.docx"

Dim objWord As Object
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
objWord.Activate 'Should make it the forefront (1)
objWord.Documents.Open "\\filePath\FormFlow To MSExcel\FeedSampleReport-Manual.docx"
'If you just want to close it afterwards...
objWord.Quit 'Changes are discarded

'Either way, you should have the following somewhere
Set objWord = Nothing 
End Sub

将对象设置为空应该消除连接

于 2013-06-18T20:53:36.297 回答
0

我有同样的问题。并且只有下面的代码关闭了这个 Word 窗口:

Dim X As Variant

X = Shell("powershell.exe kill -processname winword", 1)

我在excel vba的Closing word application的答案之一中找到了这段代码

于 2017-08-28T17:29:20.787 回答