Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : その他)
Excel VBAから開いているWordを閉じるには
投稿日時: 20/05/28 23:28:13
投稿者: Alice87

Microsoft Excel for Officeを使用しています。
 
Excel VBAからWordを開き処理を行った後、該当のWordを閉じたいのですが「実行時エラー 4605文書ウィンドウが選択されていないためメソッドまたはプロパティが使用できません。」とメッセージが出てきます。
 
いろいろなサイトを見て下記のようなプログラムにしたのですが、どう直せばWordが閉じられるのか解決できずこちらに投稿致しました。
 
なお、複数サイトを見ましたが、下記サイトの記述を参考に作っています。
https://www.relief.jp/docs/excel-vba-close-word-documents.html
 
アドバイスをいただけると幸いです。
 
宜しくお願い致します。
 
-------------------------------
sub test()
 
〜〜途中割愛〜〜
               If InStr(myFile, ".doc") > 0 Then
                 
                   myFile = CStr(myFile)
                 
                    With CreateObject("Word.Application")
                        .Documents.Open myFile
                        .Visible = True
                        .ActivePrinter = "CubePDF" 'cubePDFで印刷
                        .ActiveDocument.PrintOut
                    End With
                            'pdf用のファイル名作成するのに、拡張子を削除
                            myFile = Left(myFile, InStrRev(myFile, ".") - 1)
                            '拡張子をpdfに変更
                            myFile = myFile & ".pdf"
                 
                                'CubePDFウィンドウが開いたか確認
                                Do
                                   cuhw = FindWindow("WindowsForms10.Window.8.app.0.1d364f7_r9_ad1", vbNullString) '
                                                                                                                   '(CubePDFが常にこのクラス名とは限らない)
                                Loop While cuhw = 0
                 
                        SetForegroundWindow cuhw 'CubePDFのウィンドウをアクティブ化
         
                            With CreateObject("Wscript.Shell") '保存先の所まで移動して名前付与
 
                                .SendKeys "{TAB}"
                                 .SendKeys "{TAB}"
                                 .SendKeys "{TAB}"
                                 .SendKeys "{TAB}"
                                 .SendKeys "{TAB}"
                                 .SendKeys "{TAB}"
                                 .Run "%COMSPEC% /c echo " & myFile & "| clip", 0, True 'クリップボードにFnameをコピー
                                .SendKeys "^v" '貼り付け
                                .SendKeys "{ENTER}"
                             End With
                              
                        Sleep 3000
                              
                       cuhw = FindWindow("OpusApp", vbNullString)
                              
                      SetForegroundWindow cuhw 'Wordのウィンドウをアクティブ化 ←アクティブ化には成功
                              
                     GetObject(Class:="Word.Application").Documents.Close ←★ここでエラー
                              
                              
                    Set wd = Nothing
                     
                    GoTo next_File
                     
                End If
〜〜以降割愛〜〜
 
 
 
 
 

回答
投稿日時: 20/05/29 08:07:30
投稿者: MMYS

CreateObjectはインスタンスを新規作成。
GetObjectは起動済みのインスタンスから取得
 
ワードは複数起動出来ます。つまり、
GetObjectではどのWordインスタンスなのか保証されません。
今回のケースはCreateObjectで作成したインスタンスを終了ですから、
そのインスタンスを保持します。
 
    Dim appWord As Object
     
    Set appWord = CreateObject("Word.Application")
    With appWord
        .Documents.Open myFile
        .Visible = True
        .ActivePrinter = "CubePDF" 'cubePDFで印刷
        .ActiveDocument.PrintOut
    End With
     
    '〜処理〜
     
    appWord.Quit
    Set appWord = Nothing
 
ところで、処理した後にWordを閉じてますが
PDF化として印刷した時点で、Wordは不要です。
With内で閉じてしまうのが良いと思います。
 

投稿日時: 20/06/01 10:04:30
投稿者: Alice87

MMYS様
 
早速のアドバイスありがとうございます。
 
MMYS様の記載どおりにしたところ、問題なく処理ができました!!
大感謝です。本当にありがとうございます。
 
(QuitをWith内に入れて試したのですが、その後の「CubePDF」のキーボード操作でずれたところがEnterされてしまいうまくいかなかったので、MMYS様の記載どおりにしました。