現在のWordマクロの仕事で、特定箇所の編集ができないように文書を保護する必要がありました。その中で、文書保護に関するマクロを調べていたときに思いついたマクロです。
今までは、私は「Wordマクロでは、複数の箇所を同時選択できない。Selectionオブジェクトは常に1つだから。もし複数箇所を選択するのであれば[検索と置換]ダイアログボックスを使うしかない!」と思っていました。
【Word】[検索と置換]ダイアログボックスにて複数箇所の文字列を選択する
でも、Wordマクロでも複数箇所を同時に選択する方法がありました!
サンプルコードとして文書中の表を同時に選択するマクロを紹介します。応用すれば、図や特定の文字列を複数箇所を同時に選択できます。
<目次>
このマクロでできること
文書中のすべての表を同時に選択します。
(マクロ実行前)
(マクロ実行後)
注:マクロ実行前に、文書が保護されていない状態にしてください。 また、[例外処理(オプション)] で編集可能な領域として設定された範囲が [ ] で表示されますので、[ ] も解除してください。 こちらの記事の最後に保護の解除方法がわかりやすく解説されています。 決められた場所以外は編集できないようにするには(外部リンク:クリエのちょこテク)
マクロの解説
For Each ... Next ステートメントを用いて、文書中のすべての表に対して処理をします。おきまりのパターンです。
このときの処理として、表1つ1つを「編集可能な領域」として設定するのです。(14行目)
Wordマクロには、「編集可能な領域」を同時に選択するというメソッド(20行目のSelectAllEditableRanges)があるので、これを使うための前処理なのです。
そして、表をすべて選択したら、「編集可能な領域」として設定された範囲を解除します。(24行目~27行目)
このような処理をしているのでEditorオブジェクトを用いてややこしいコードになっています。
Editorオブジェクトは使いづらい(文書中に何カ所Editorオブジェクトがあるのか数えられないみたい。。。)ので、おすすめの使い方ではありませんが、こんなこともできるというサンプルです。
マクロ
Sub 文書中のすべての表を選択する() Dim myDoc As Document Dim myTable As Table Dim myEditor As Editor 'オブジェクト変数の設定 Set myDoc = ActiveDocument '表を編集可能な領域に設定する For Each myTable In myDoc.Tables myTable.Range.Editors.Add wdEditorEveryone Next '編集可能な領域をすべて選択する With myDoc .Protect wdAllowOnlyReading .SelectAllEditableRanges End With '編集可能な領域と設定された箇所の解除 Set myEditor = myDoc.Tables(1).Range.Editors(1) myEditor.DeleteAll myDoc.Unprotect 'オブジェクト変数の解放 Set myEditor = Nothing Set myDoc = Nothing End Sub