webdevqa.jp.net

VBAでWordオブジェクトを閉じる/解放しますか?

開発した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
_

これは私に2つの問題を与えます:

  1. ドキュメントが開きますが、バックグラウンドで表示されます。ユーザーは、タスクバーでMicrosoft Wordを確認することを知らない限り、ドキュメントが開かれたことを知りません。
  2. 受信したWord文書を閉じようとすると:このファイルは別のアプリケーションまたはユーザーによって使用されています。(C:\ Users\Me\AppData ...\Normal。 dotm)

そのダイアログで[OK]をクリックすると、[名前を付けて保存]画面が表示されます。

それをキャンセルして、空白のMicrosoft Wordインスタンスを閉じようとすると、次のようになります。

グローバルテンプレートNormalに影響する変更が加えられました。これらの変更を保存しますか?

次に、[いいえ]をクリックすると、すべてが最終的に閉じます。

誰かがこれらの2つの問題で私を助けることができますか?どういうわけかオブジェクトを解放する必要がありますか?これは今まで見たことがありません。

[〜#〜]編集[〜#〜]

@ 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
_

もう1つのWord文書を開いてボタンをクリックすると、次のようになります。

  1. マニュアルが最前線で開きますが、すぐにThis file is in use by another application or user. (C:\Users\Me\AppData\...\Normal.dotm)を受け取ります
  2. [OK]を押すと、[名前を付けて保存]ダイアログが表示されます。
  3. [名前を付けて保存]ダイアログをキャンセルすると、マニュアルドキュメントが表示されます。
  4. 赤いXをクリックしてドキュメントを閉じると、_Changes have been made that affect the global template, Normal. Do you want to save those change?_が表示されます。[いいえ]をクリックすると、ドキュメントが閉じます。

このドキュメントが私が開いているWordの最初のインスタンスである場合:

  1. ドキュメントが開きます。
  2. コードが_objWord.Quit_行にヒットするとすぐに、ドキュメントはすぐに閉じます。

ドキュメントを最前線に開いて、ユーザーが必要なときにマニュアルを表示して支援を求め、自分の裁量でドキュメントを閉じることができるようにしたいと思っています。

6

したがって、グローバルテンプレートを保存するように要求するWordで発生している問題は、通常のテンプレートに対する権限を持つコピーWordが既に開いているためです。 CreateObjectを使用してWordオブジェクトを設定すると、Wordが再度読み込まれ、通常のテンプレートが読み取り専用として開きます。

あなたがする必要があるのは、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

もう1つの優れたコード行は、表示アラートを抑制することです。これにより、「保存しますか」タイプのダイアログボックスが表示されなくなります。

objWord.DisplayAlerts = 0

11
CuberChase

次のようなものを試してください。

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

オブジェクトを何にも設定しないと、接続が失われるはずです

3
dennythecoder

私も同じ問題を抱えていました。そして、以下のコードだけがこのWordウィンドウを閉じました:

Dim X As Variant

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

私は答えの1つでこのコードを見つけました Excel vbaからWordアプリケーションを閉じる

0