Python(pywin32)でWordを操作する[2] - Wordを起動／終了する


#概要

Wordを起動／終了します。
**[Application.Quit()を呼ばないと、プロセスがバックグラウンドに残ります。](https://qiita.com/int_main_void/items/8776cc4b9b05478273b3#applicationquit%E3%82%92%E5%91%BC%E3%81%B0%E3%81%AA%E3%81%84%E3%81%A8
)**
([VBScriptだとさらに良くない動作](https://qiita.com/int_main_void/items/8776cc4b9b05478273b3#word%E3%82%82set-x--nothing%E3%81%A7%E3%81%AF%E6%B6%88%E3%81%9B%E3%81%AA%E3%81%84))

次回、新規ドキュメントを開きます。

#今回利用するWordオブジェクト

![word_obj.png](https://qiita-image-store.s3.amazonaws.com/0/34777/4ffe4466-fc1d-7210-ebbb-55a8c451e3d4.png)

|オブジェクト名|プロパティ/メソッド|説明|リンク|
|:---|:---|:---|:---|
|Application|-      |Wordアプリを表すオブジェクト|[msdn][app_msdn]|
|           |Visible|Wordを画面表示する|[msdn][visible_msdn]|
|           |Quit() |Word を終了する|[msdn][quit_msdn]|


#Wordを起動する

Applicationオブジェクトを生成すると、Wordがバックグラウンドプロセスで起動します。
VisibleプロパティをTrueに設定すると画面上に出てきます。事情がいろいろあるので、最初のうちはApplication.Visible=Trueにしておくのがいいと思います。

```python
import win32com.client

#Wordを起動する : Applicationオブジェクトを生成する
Application=win32com.client.Dispatch("Word.Application")

#Wordを画面表示する : VisibleプロパティをTrueにする
Application.Visible=True
```

#Wordを終了する

Application.Quitメソッドを呼ぶとWordが終了します。パラメータで終了時の振る舞い(e.g.開いている文書を保存するなど)が指定できます([msdn][quit_msdn])。

Quit()を呼ばずに終了するとWordのプロセスが残ってしまうので注意してください。


```python
#Wordを終了する　: Quitメソッドを呼ぶ
Application.Quit()
```

#補足
##Application.Quit()を呼ばないと・・・

win32com.client.Dispatch()の場合は、既存のWordプロセスを使いまわしているようで、一つ残ります。**VBScriptの場合はスクリプト実行した分だけ残ります。**

##マイクロソフトのサンプルでQuit()を呼んでないけど・・・？

[ネットのvscriptサンプル](https://www.google.com/search?q=vbscript++word.application)だとQuit()を呼んでないものがそこそこあり、その中にマイクロソフトのサンプルもあるんですが、

> [Office Space Microsoft Word 文書でテキストを検索、置換する - technet.microsoft.com][vbscript_word_search] 
>> ```vb
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
・・・略・・・
If objSelection.Find.Execute Then
    Wscript.Echo "The search text was found."
Else
    Wscript.Echo "The search text was not found."
End If
```

これは、「Visible=Trueにしていればユーザが画面操作でプロセスを消せるでしょ？」

[オブジェクトの解放 - technet.microsoft.com][vbscript_word_quit2]
> このタイプのオブジェクトの場合、**ユーザーが手動でシャットダウンできるように Visible プロパティを使って Excel を画面に表示する**か、またはスクリプトから Excel を閉じる必要があります。

・・・という割り切りがあります。

「大してメモリ使わないし、サクッと終了するから、Set X = Nothingもいらないでしょ。」
[オブジェクトの解放 - technet.microsoft.com][vbscript_word_quit2]
> 要約すると、**オブジェクトをNothingに設定しても、実行中のアプリケーションは終了せず、非常に複雑で、実行時間が長く、メモリを多く消費するスクリプトでない限り、VBScript がオブジェクトを解放してくれるので、オブジェクトをNothingに設定する必要はありません**(では、ここで休憩してもかまいません)。

・・・とも考えてのことだと思います。

##WordもSet X = Nothingでは消せない


(1) 以下をundead_word_process.vbsとして保存

```vb:undead_word_process.vbs
Set App = CreateObject("Word.Application")
Set App = Nothing
```

![undead.PNG](https://qiita-image-store.s3.amazonaws.com/0/34777/7be9eb56-8ef9-7a54-5473-43640aacbbed.png)

(2) undead_word_process.vbsを10回ダブルクリック
(3) 30秒くらい待つ
(4) タスクマネージャでバックグラウンドプロセスを確認
**(5) 見えないWordが10個起動している**

![task_mgr.PNG](https://qiita-image-store.s3.amazonaws.com/0/34777/7990355f-1f02-ada1-560d-d886f989d963.png)


#関連
[Python(pywin32)でWordを操作する[1] - Wordオブジェクトモデル](https://qiita.com/int_main_void/items/16cede139bd64514b810)
[Python(pywin32)でWordを操作する[2] - Wordを起動／終了する](https://qiita.com/int_main_void/items/8776cc4b9b05478273b3)
[Python(pywin32)でWordを操作する[3] - 新規ドキュメント作成](https://qiita.com/int_main_void/items/a36cf348d6eedb31246f)
[Python(pywin32)でWordを操作する[4] - 文字列を入力/取得/削除する](https://qiita.com/int_main_void/items/f135d321262d9de05efc)
[Python(pywin32)でWordを操作する[5] - ドキュメントをファイルに保存する、Wordのオプション変更](https://qiita.com/int_main_void/items/b8549c92b33ea0f7d63b)
[Python(pywin32)でWordを操作する[6] - 特定のタイトルが付いているウィンドウの操作](https://qiita.com/int_main_void/items/6c3569dc242f843ca946)
[Python(pywin32)でWordを操作する[7] - 既存文書を開く/閉じる(Documents.Open(), Document.Close())](https://qiita.com/int_main_void/items/af46e7fe40f528b0b5cd)
[Python(pywin32)でWordを操作する[8] - 段落単位の文字列取得, 統計(ページ数, 段落数,etc)取得](https://qiita.com/int_main_void/items/7c5bc0aab52d8bfadd6e)


#参考
- [オブジェクト モデル - MSDN][object_model]
- [PyWin32 Documentation - Tim Golden's Stuff][tim_pywin32_docs]
- [VOV(VBA, OLE, VBScript)による自動操作 - スクリプト系プログラミング言語ファンのじたばた][vov]
- [COM(Component Object Model)についてふわっと学習していく その１ 導入編 - Qiita][qiita_com]
- [VBScriptでWordファイルのページ数一覧を作ってみる - Segmentation Fault][macro_list]
- [Office Space  Microsoft Word 文書でテキストを検索、置換する - technet.microsoft.com][vbscript_word_search]
- [みんなのワードマクロ][macro]
- [オブジェクトの解放 - technet.microsoft.com][vbscript_word_quit2]
- [Office アプリケーションを別のアプリケーションから制御する - msdn.microsoft.com][vbscript_word_quit1]

[quit_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/application-quit-method-word
[visible_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/application-visible-property-word
[object_model]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/object-model-word-vba-reference
[qiita_com]:https://qiita.com/mintcandy/items/979a4a2669c8fc1f4f2f
[tim_pywin32_docs]:http://timgolden.me.uk/pywin32-docs/index.html
[vov]:http://www.dastec.org/vov/index.htm
[macro]:https://www.wordvbalab.com/
[macro_list]:https://www.wordvbalab.com/page-2266/
[vbscript_word_page]:http://www.segmentation-fault.xyz/entry/2017/11/25/222859
[vbscript_word_search]:https://technet.microsoft.com/ja-jp/library/ee692875.aspx
[vbscript_word_quit1]:https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/controlling-one-microsoft-office-application-from-another
[vbscript_word_quit2]:https://web.archive.org/web/20110405220235/https://technet.microsoft.com/ja-jp/scriptcenter/ff522015.aspx#8


[app_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/application-object-word
[docs_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/documents-object-word
[doc_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/document-object-word
[paras_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/paragraphs-object-word
[para_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/paragraph-object-word
[sens_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/sentences-object-word
[wrds_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/words-object-word
[chrs_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/characters-object-word
[rng_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/range-object-word
[rng_txt_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/range-text-property-word
[para_rng_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/paragraph-range-property-word