Python(pywin32)でWordを操作する[4] - 文字列を入力/取得/削除する


#概要

新規ドキュメントにRangeオブジェクトで文字列を入力/取得/削除します。
次回は「保存」か、「Sentences/Paragraphs/Words/Charactorsを使った何か」にします。

#今回利用するWordオブジェクト
![word_obj.png](https://qiita-image-store.s3.amazonaws.com/0/34777/3d3d9c61-a2fc-3d9a-f16b-fcc1debd876a.png)

前回までに紹介したメソッド/プロパティは省略。

|オブジェクト名|プロパティ/メソッド|説明|リンク|
|:---|:---|:---|:---|
|Document |-      |Documents内の1つの文書|[msdn][doc_msdn]|
|         |Range()|Rangeオブジェクトを生成するメソッド|[msdn][doc_rng_msdn]|
|         |Content|文書全体を示すRangeオブジェクト|[msdn][doc_content_msdn]|
|Range|-      |隣接する領域を表すオブジェクト|[msdn][rng_msdn]|
|         |Start|Rangeの開始文字位置を設定もしくは取得|[msdn][rng_start_msdn]|
|         |End|Rangeの末尾文字位置を設定もしくは取得|[msdn][rng_end_msdn]|
|         |Text|Rangeのテキストを設定もしくは取得|[msdn][rng_text_msdn]|
|         |Delete()|Rangeのテキストを削除|[msdn][rng_delete_msdn]|

文字を入力/取得する場合、Rangeを利用します。
※Rangeに非常によく似た[Seletion](https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/selection-object-word)もあります。別途説明予定。

今までのモデルでは簡単化のため「ショートカット的関連」は省いていますが、実は「DocumentとRangeの間」にも関連があります。

![word_obj.png](https://qiita-image-store.s3.amazonaws.com/0/34777/6ed1f4cf-6876-fa08-cb38-3a3fc6d217df.png)



#コード
qtconsoleの確認結果を示していきますが、前回同様テンプレ的な処理は省略します。
↓の「★なんらかの処理★」部分に記述しているイメージで読んでください。

```python
import win32com.client

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

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

#新規ドキュメントを作成する : Documents.Add()する。
doc=Application.Documents.Add()


★なんらかの処理★


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


##文字列を入力/取得する

「あいうえお」とキーボードで手入力して、下図のファイルを作り、これをRangeで調査してみます。

![word_range.PNG](https://qiita-image-store.s3.amazonaws.com/0/34777/fdb48570-42d7-381b-5737-a695e5910416.png)

Range(0,1)が何の領域を示すかテキストを取得して調べてみます。

```python
In [194]: doc.Range(0,1).Text
Out[194]: 'あ'
```

「あ」を含む領域でした。
Range(2,4)も調べてみます。

```python
doc.Range(2,4).Text
Out[195]: 'うえ' Range(2,3)
```
「う」と「え」を含む領域でした。

Range(1,1)といった幅ゼロが何を示すのか、"!"を入れて調べてみます。

```python
In [199]: doc.Range(1,1).Text="!"

In [201]: doc.Range(0,3).Text
Out[201]: 'あ!い'
```

「あ」と「い」の間に挟まりました。
Range(x,x)は、文字と文字の境界を示す幅ゼロの領域のようです。

"!"の入力前の状態は、図的に示すと・・・

![range1.PNG](https://qiita-image-store.s3.amazonaws.com/0/34777/2225f834-fb39-7093-b730-7f36a0f2b535.png)

だったようです。

Range.Delete()を使って、"!"を削除してみます。

```python
# "!"が入力されていることを確認
In [201]: doc.Range(0,3).Text
Out[201]: 'あ!い'

# "!"の位置を確認。
In [211]: doc.Range(1,2).Text
Out[211]: '!' # Range(1,2)

# "!"を削除 : Range(1,2).Delete()を実施。
In [212]: doc.Range(1,2).Delete()
Out[212]: 1

In [214]: doc.Range(0,3).Text
Out[214]: 'あいう' # "!"が削除できた。

```


Document.Contentを使って文書全体のテキストを取得してみます。

```python
In [215]: doc.Content.Text
Out[215]: 'あいうえお\r'
```

最後のCR(\r)を含めて文書全体のようです。

Contentプロパティは「文書全体を示すRangeオブジェクト」なので、Range()メソッドとStart, Endを使って、Contentと等価なRangeオブジェクトを作ってみます。

```python
In [215]: doc.Content.Text
Out[215]: 'あいうえお\r'

In [216]: doc.Content.Start
Out[216]: 0

In [217]: doc.Content.End
Out[217]: 6

In [219]: doc.Range(doc.Content.Start,doc.Content.End).Text
Out[219]: 'あいうえお\r'
```

doc.Content と Range(Content.Start,Content.End) が等価であることがわかりました。

最後に、手で入力したものをすべて削除してみます。先の通り、Contentプロパティは「文書全体を示すRangeオブジェクト」なので、このRangeオブジェクトのDelete()を呼び出してみます。

```python
In [220]: doc.Content.Text
Out[220]: 'あいうえお\r'

In [221]: doc.Content.Delete()
Out[221]: 1

In [222]: doc.Content.Text
Out[222]: '\r'
```
文書全体が削除できました。

#関連
[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][inserting-text-in-a-document]
- [オブジェクト モデル - 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 文書でテキストを検索、置換する][vbscript_word_search]
- [みんなのワードマクロ][macro]

[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

[^1]: msdnには、なぜかBookmark.Nameの例が書かれている。(タイトルはDocument.Nameなのに)
[^2]: 注釈の機械翻訳がひどいので、msdn_en-usのRemarksを見たほうがいいか
[^3]: スクリプトで作業中(Active)の概念が必要なときって何だろうか。(GUI操作ならわかるけど)

[rng_delete_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/document-content-property-word
[rng_text_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/range-text-property-word
[doc_rng_msdn]:https://msdn.microsoft.com/ja-jp/VBA/Word-VBA/articles/document-range-method-word

[rng_start_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/range-start-property-word

[rng_end_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/range-end-property-word
[doc_content_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/document-content-property-word

[rng_insaft_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/range-insertafter-method-word

[rng_insbfr_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/range-insertbefore-method-word

[inserting-text-in-a-document]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/inserting-text-in-a-document
[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
[docs_count_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/documents-count-property-word
[docs_open_mdsn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/documents-open-method-word
[doc_close_mdsn]:https://msdn.microsoft.com/ja-jp/VBA/Word-VBA/articles/document-close-method-word
[doc_fullname_msdn]:https://msdn.microsoft.com/ja-jp/VBA/Word-VBA/articles/document-fullname-property-word
[doc_name_msdn]:https://msdn.microsoft.com/ja-jp/VBA/Word-VBA/articles/document-name-property-word
[doc_activate_msdn]:https://msdn.microsoft.com/ja-jp/VBA/Word-VBA/articles/document-activate-method-word
[doc_path_msdn_ja-jp]:https://msdn.microsoft.com/ja-jp/VBA/Word-VBA/articles/document-path-property-word
[doc_path_msdn_en-us]:https://msdn.microsoft.com/en-us/VBA/Word-VBA/articles/document-path-property-word
[docs_add_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/documents-add-method-word
[app_activedoc_msdn]:https://msdn.microsoft.com/ja-jp/vba/word-vba/articles/application-activedocument-property-word
[doc_saveas2_mdsn]:https://msdn.microsoft.com/ja-jp/VBA/Word-VBA/articles/document-saveas2-method-word
[doc_activate_msdn]:https://msdn.microsoft.com/ja-jp/VBA/Word-VBA/articles/document-activate-method-word