みんなのワードマクロ

ワードマクロで、文書作成とオフィス事務を効率化!!


テーマ:


先日紹介したマクロ 。残念ながら間違っていましたね。


おかげさまで、いろいろと弁解するうちにブログの記事が書けました。


今回は、このマクロを作成するにあたって私が考えた方法を紹介します。


どうやって、選択範囲から、英語と日本語とを切り分けるか?です。


順序を入れ替えたい文字列を選択して、その範囲内で文字を選ぶ場合、うまく検索できないことは、「ワードの検索のクセ 」で紹介いたしました。


そして、こんな考え方に至りました。


ちなみに、「ワードマクロの楽しみ方 」の記事でも書いたのですが、プログラムを組むときの処理の流れ(考え方)というのは、いろいろとあります。


今回私が紹介する考え方だけが正解というわけではありません。


一つの例としてご覧ください。


▼考え方


プログラム中の表記


日本語と英語を、以下のように表記します。



みんなのワードマクロ

myString(1)という配列にしてプログラム中で表現しています。


また、(英1)、(日1)などの言葉が、コメント文としてプログラム中に書かれています。


順序を変更するために、(英1)、(日1)、(英2)、(日2)を取得することを目的にしました。



どうやって文字列を取得するのか?




みんなのワードマクロ

CP(1)~CP(5)は、カーソルの位置を記憶するための配列です。


たとえば、(英1)を指定するときには、以下のように表現します。


Selection.SetRange Start:=CP(1), End:=CP(2)


こうすると、CP(1)とCP(2)で囲まれた部分が選択されます。



みんなのワードマクロ

という感じでプログラムを組みました。


プログラムの大半は、CP(1)~CP(5)を取得するためのものです。



▼プログラムの作用

以下は、順序を入れ替えたい部分を選択した状態で実行してください。


(英1)と(英2)の位置を変えて、(日2)を削除します。



みんなのワードマクロ

▼ちょっとした工夫

CP(5)を取得するときに、(日2)の末尾にある「改行」や「タブ」を除外するようにしました。


(日2)の改行やタブを削除してしまうと、文章の構造が変わってしまうので。


▼プログラム


タブ付きのプログラムは、こちら のページをご覧ください。


Sub 順序入れ替えマクロ2()

Dim CP(1 To 5) As Long
Dim myString(1 To 4) As String
Dim mySearch As String '検索する文字列
Dim myReplace As String '置換後の文字列


'文字列が選択されていない場合には終了
If Selection.Start = Selection.End Then End


'▼CP(1)の取得(選択範囲の先頭の取得)
CP(1) = Selection.Start


'▼CP(5)の取得
Selection.Start = Selection.End - 1

Do While Selection.Text = Chr(9) Or Selection.Text = Chr(11) Or _
Selection.Text = Chr(12) Or Selection.Text = Chr(13)
Selection.End = Selection.End - 1
Selection.Start = Selection.End - 1
Loop

CP(5) = Selection.End


'▼CP(4)の取得

'カーソルを選択範囲の先頭に移動
Selection.Start = CP(1)
Selection.End = CP(1)


'検索処理の実行(英1,日1,英2の検索)
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "([ -~]{1,})([! -~]{1,})([ -~]{1,})"
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchFuzzy = False
.MatchWildcards = True
.Execute
End With

If Selection.Find.Found = True And _
Selection.Start >= CP(1) And _
Selection.End <= CP(5) Then
CP(4) = Selection.End
Else
MsgBox "選択範囲が不適切です。"
Selection.Start = CP(1)
Selection.End = CP(5)
End
End If


'▼CP(2)とCP(3)の取得

'カーソルを対象文字の先頭に移動
Selection.Start = CP(1)
Selection.End = CP(1)


'検索処理の実行(日1の検索)
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "([! -~]{1,})"
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchFuzzy = False
.MatchWildcards = True
.Execute
End With

If Selection.Find.Found = True And Selection.Start > CP(1) And Selection.End < CP(4) Then
CP(2) = Selection.Start
CP(3) = Selection.End
Else
MsgBox "選択範囲が不適切です。"
Selection.Start = CP(1)
Selection.End = CP(5)
End
End If

'▼文字列の取得
Selection.SetRange Start:=CP(1), End:=CP(2)
myString(1) = Selection.Text
Selection.SetRange Start:=CP(2), End:=CP(3)
myString(2) = Selection.Text
Selection.SetRange Start:=CP(3), End:=CP(4)
myString(3) = Selection.Text
Selection.SetRange Start:=CP(4), End:=CP(5)
myString(4) = Selection.Text


'▼置換処理
'検索する文字列の作成
mySearch = myString(1) & myString(2) & myString(3) & myString(4)


'置換後の文字列の作成
myReplace = myString(3) & myString(2) & myString(1)


'カーソルを選択範囲の先頭に移動
Selection.Start = CP(1)
Selection.End = CP(1)


'置換処理の実行
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = mySearch
.Replacement.Text = myReplace
.Forward = True
.Wrap = wdFindStop
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
.Execute Replace:=wdReplaceOne
End With


'カーソルを、「置換後の文字列の末尾」へ移動
Selection.Collapse direction:=wdCollapseEnd


'▼検索・置換条件の初期化
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = ""
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = True
.Execute
End With


End Sub



▼関連記事

日本語と英語の順序入れ替えマクロ  

ワードの検索のクセ

日本語と英語の順序入れ替えマクロ(2) ←現在地



いいね!した人  |  コメント(0)  |  リブログ(0)

新田順也☆ワードプログラマーさんの読者になろう

ブログの更新情報が受け取れて、アクセスが簡単になります