「Wordの「検索と置換」について」の版間の差分

Notion-MW
Notion-MW
タグ: 手動差し戻し
 
(同じ利用者による、間の3版が非表示)
18行目: 18行目:
文書全体の置換のためには、簡潔にいえば、①文書内の必要なRangeを全て取得する②取得した全てのRangeごとに検索や置換を実行する、という2ステップが必要である。このうち難しいのは①のほうで、②は割と簡単である。とりあえず②を担当する関数の名前を<code>My_Find_and_Replace()</code>としておこう。そうすると、①の部分については、前述の英語サイトを参考に結論からいえば、以下のように書けばいいということになる。
文書全体の置換のためには、簡潔にいえば、①文書内の必要なRangeを全て取得する②取得した全てのRangeごとに検索や置換を実行する、という2ステップが必要である。このうち難しいのは①のほうで、②は割と簡単である。とりあえず②を担当する関数の名前を<code>My_Find_and_Replace()</code>としておこう。そうすると、①の部分については、前述の英語サイトを参考に結論からいえば、以下のように書けばいいということになる。


<syntaxhighlight lang="visual basic">Sub Macro0()
<syntaxhighlight lang="vb.net">Sub Macro0()
   Set objUndo = Application.UndoRecord
   Set objUndo = Application.UndoRecord
   objUndo.StartCustomRecord ("Replace All With VBA")
   objUndo.StartCustomRecord ("Replace All With VBA")
55行目: 55行目:
②の部分である<code>My_Find_and_Replace</code>の例は以下のようなものになるだろう。
②の部分である<code>My_Find_and_Replace</code>の例は以下のようなものになるだろう。


<syntaxhighlight lang="visual basic">Sub My_Find_and_Replace(r As Range)
<syntaxhighlight lang="vb.net">Sub My_Find_and_Replace(r As Range)
     With r.Find
     With r.Find
         .ClearFormatting
         .ClearFormatting
90行目: 90行目:
例えば有名な「pͪoͣnͬpͣoͥnͭpͣa͡inͥ」の最初の「pͪ」は、内部的には普通のローマ字のpと合字用の上付きアルファベットのhという2文字で表現されているが、カーソルを移動させる限りではまとめて1文字のように扱われる(メモ帳などにコピペすれば確認できる)。従って、「pͪoͣnͬpͣoͥnͭpͣa͡inͥ」の「p」を全て削除しようと思ってWordの置換でpを””に置換しても、<strong>書記素クラスタとしては「p」に一致するものがない</strong>ので何も起こらない。「pͪ」と書記素クラスタごと入れれば正しく置換される。「pの上に合字用アルファベットが乗ったもの」を全て消したりフォントを変えたりしたければ、以下のように合字用の文字をあわせてワイルドカード指定することになる(合字用の文字を入れているので奇妙な見た目になっているが問題なく動作する)。
例えば有名な「pͪoͣnͬpͣoͥnͭpͣa͡inͥ」の最初の「pͪ」は、内部的には普通のローマ字のpと合字用の上付きアルファベットのhという2文字で表現されているが、カーソルを移動させる限りではまとめて1文字のように扱われる(メモ帳などにコピペすれば確認できる)。従って、「pͪoͣnͬpͣoͥnͭpͣa͡inͥ」の「p」を全て削除しようと思ってWordの置換でpを””に置換しても、<strong>書記素クラスタとしては「p」に一致するものがない</strong>ので何も起こらない。「pͪ」と書記素クラスタごと入れれば正しく置換される。「pの上に合字用アルファベットが乗ったもの」を全て消したりフォントを変えたりしたければ、以下のように合字用の文字をあわせてワイルドカード指定することになる(合字用の文字を入れているので奇妙な見た目になっているが問題なく動作する)。


<syntaxhighlight lang="visual basic">p[ͣ-ͯ]</syntaxhighlight>
<syntaxhighlight lang="vb.net">p[ͣ-ͯ]</syntaxhighlight>
Wordの置換では正規表現のグループは使えないので「上付きアルファベットはそのままでpだけをbに変えてbͪoͣnͬbͣoͥnͭbͣa͡inͥにする」などはおそらく単一の「検索と置換」の実行では不可能である。もちろんマクロで場合分けしてやればできるはず。
Wordの置換では正規表現のグループは使えないので「上付きアルファベットはそのままでpだけをbに変えてbͪoͣnͬbͣoͥnͭbͣa͡inͥにする」などはおそらく単一の「検索と置換」の実行では不可能である。もちろんマクロで場合分けしてやればできるはず。


187行目: 187行目:
例えば筆者が公開している[https://github.com/ge9/NazonoMincho 謎乃明朝](文字数が多いため「謎乃明朝」「謎乃明朝+」の2フォントに分かれている)がサポートしている全ての文字で使われるように置換する場合は以下のようになる。与えられたRangeに対して置換するという前述の②の部分だけ載せるので適宜①の部分と組み合わせること。
例えば筆者が公開している[https://github.com/ge9/NazonoMincho 謎乃明朝](文字数が多いため「謎乃明朝」「謎乃明朝+」の2フォントに分かれている)がサポートしている全ての文字で使われるように置換する場合は以下のようになる。与えられたRangeに対して置換するという前述の②の部分だけ載せるので適宜①の部分と組み合わせること。


<syntaxhighlight lang="visual basic">Sub SearchAndReplaceInStory(myStoryRange As Range)
<syntaxhighlight lang="vb.net">Sub SearchAndReplaceInStory(myStoryRange As Range)
     Dim CJK As String
     Dim CJK As String
     Dim CJKComp As String
     Dim CJKComp As String