46
47 データ例(1)
単語リスト:テキストの異なる単語リストを作成します。
単語リスト
単語 リスト
:
テキスト の
異なる を 作成 します
。
照合同語検索
上の単語リストの出力を単語.docxとして保存し、これを照合リストとします。「照合 リスト」ボタンをクリックして、この単語.docxを選択してください。これは変更しな い限り一度だけです。
データ例(2)
異なる単語の頻度を計算します。
照合異語検索
異なる単語の頻度を計算します。
照合同語リスト
異なる 単語 の を します
。
照合異語リスト 頻度
48 計算
コード
Sub ■単語()
If chk新文書 Then ●新文書
obj連想配列.RemoveAll '連想配列のキーとアイテムを削除
If opt単語リスト Then ▼単語リスト
If opt照合同語検索 Or opt照合異語検索 Then ▼同語異語検索
If opt照合同語リスト Or opt照合異語リスト Then ▼同語異語リスト
End Sub
同語検索と異語検索の手順はほとんど同じですが、異なる部分(連想配列との照合の 仕方)についてはサブルーチンの中で区別します。同語リストと異語リストについて も同様です。
Sub ●新文書()
Selection.Copy '選択範囲コピー Documents.Add '新文書追加 Selection.Paste 'ペースト
Selection.WholeStory '全範囲選択 End Sub
選択範囲を新文書にコピー&ペーストし、全範囲を選択します。
Sub cmd照合リスト_Click()
●フォーム後面
With Dialogs(wdDialogFileOpen) 'ダイアログボックス .Name = "*.docx": .Display 'ダイアログボックス表示
If InStr(.Name, "*") Or .Name = "" Then Exit Sub '文書名なし→終了 Documents.Open FileName:=.Name '選択した文書を開く
cmd照合リスト.Caption = .Name '文書名をキャプションに代入
End With
If MsgBox("OK、またはキャンセル?", vbOKCancel) = vbCancel Then '確認
49
ActiveDocument.Close: Exit Sub '現文書を閉じる End If
単語配列$ = Split(ActiveDocument.Range.Text, vbCr) '改行でスプリット txt照合リスト = ActiveDocument.Range.Text
ActiveDocument.Close '現文書を閉じる
obj照合配列.RemoveAll '連想配列のキーとアイテムを削除
For Each 単語v In 単語配列$ '単語リストファイル
単語v = 正規表現置換$(単語v, 拡張正規表現$("¥L"), "", False) '単語文字列にトリム
obj照合配列(単語v) = "" '存在の標識 Next
●フォーム前面 End Sub
ダイアログボックスで改行で区切られた単語リストの文書を開き、文書の内容を開業 でスプリットして配列を作成し、その配列のキーを連想配列のキーとしてアイテムに 空白を代入します。
Sub ▼単語リスト()
obj連想配列.RemoveAll '連想配列のキーとアイテムを削除
50
For Each 単語v In Selection.Words '選択範囲の語について
単語v = 正規表現置換$(単語v, 拡張正規表現$("¥L"), "", False) '単語文字列にトリム
If 単語v <> "" And Not obj連想配列.Exists(単語v) Then '連想配列にキーがなければ…
obj連想配列(単語v) = "" '存在の標識 追加文字列$ = 単語v & vbCr '単語&改行 ●高速文字列作成
End If Next
●高速文字列出力 End Sub
For … Nextで選択範囲の語を連想配列に格納します。アイテムは何でもかまいません
が、ここではキーによって格納の有無が判断されます。格納されていない語は新語(異 語)となるので、これに改行コードを加えて高速文字列作成を行います。
Sub ▼同語異語検索() Dim 単語$
For Each 単語v In Selection.Range.Words '選択範囲の語について 単語$ = 正規表現置換$(単語v, 拡張正規表現$("¥L"), "", False) '単語文字列にトリム
If 単語$ <> "" And obj照合配列.Exists(単語$) = opt照合同語検索 Then If chk文字色 Then 単語v.Font.Color = BGR$(txt文字色値)
If chk下線色 Then 単語v.Font.Underline = wdUnderlineWavy
If chk下線色 Then 単語v.Font.UnderlineColor = BGR$(txt下線色値) If chk蛍光色 _
Then 単語v.HighlightColorIndex = Options.DefaultHighlightColorIndex 単語v.Font.Bold = chk太字
End If Next End Sub
51
選択範囲のそれぞれの語について特殊文字を除去し(トリム)、その語の連想配列内 の有無と同語・異語検索のオプションが一致すれば、文字色、下線色、蛍光色、太字 を加えます。
Sub ▼同語異語リスト()
For Each 単語v In Selection.Range.Words '選択範囲の語について 単語v = 正規表現置換$(単語v, 拡張正規表現$("¥L"), "", False) '単語文字列にトリム
If 単語v <> "" And obj照合配列.Exists(単語v) = opt照合同語リスト _ And Not obj連想配列.Exists(単語v) Then
追加文字列$ = 単語v & vbCr '単語と改行の連続 ●高速文字列作成
obj連想配列(単語v) = "" '存在の標識 End If
Next
●高速文字列出力 End Sub
選択範囲のそれぞれの語について特殊文字を除去し(トリム)、その語の連想配列内 の有無と同語・異語検索のオプションが一致し、、出力文字列に未だ存在しない語を 高速文字列作成によって出力文字列に追加し、すべての単語の検索を修了したら、文 字列を出力します。
Sub ●高速文字列作成()
If 出力文字数& + Len(追加文字列$) > Len(出力文字列$) Then
出力文字列$ = 出力文字列$ & Space(99999) '領域超過→領域拡張
End If
Mid$(出力文字列$, 出力文字数& + 1) = 追加文字列$ '追加文字列挿入
出力文字数& = 出力文字数& + Len(追加文字列$) '全文字列の長さ End Sub
文字列の作成を高速化するために次の工夫をします。出力文字数& + Len(追加文字列
$)が出力文字列$の長さを超えたとき、つまり、追加文字列が Mid関数で挿入できなく
なったときに、出力文字列$ に大きなスペースの領域 Space(99999)を追加して拡張し ます。そのようにして適宜拡張した出力文字列の中に追加文字列をMid関数で挿入し
52
ていきます。このサブルーチンの中では出力文字列$だけでは、後部に不要なスペース があるので、その他に出力文字数&の情報も後で必要になります。これは現在の出力 文字数&に追加文字列の長さを加えた数になります。このサブルーチンは呼び出され る度に次のような出力文字列と出力文字数を作ります。
1:
出力文字列-1=追加文字列+スペース 出力文字数-1=追加文字数
2:
出力文字列-2=出力文字列-1+追加文字列+スペース 出力文字数-2=出力文字数-1+追加文字数
3:
出力文字列-3=出力文字列-1+出力文字列-2+追加文字列+スペース 出力文字数-3=出力文字数-1+出力文字数-2+追加文字数
(…)
文字列の作成を高速化するために次の工夫をします。出力文字数& + Len(追加文字列
$)が出力文字列$の長さを超えたとき、つまり、追加文字列が Mid関数で挿入できなく
なったときに、出力文字列$ に大きなスペースの領域 Space(99999)を追加して拡張し ます。そのようにして適宜拡張した出力文字列の中に追加文字列をMid関数で挿入し ていきます。このサブルーチンの中では出力文字列$だけでは、後部に不要なスペース があるので、その他に出力文字数&の情報も後で必要になります。これは現在の出力 文字数&に追加文字列の長さを加えた数になります。このサブルーチンは呼び出され る度に次のような出力文字列と出力文字数を作ります。
1:
出力文字列-1=追加文字列+スペース 出力文字数-1=追加文字数
2:
出力文字列-2=出力文字列-1+追加文字列+スペース 出力文字数-2=出力文字数-1+追加文字数
3:
出力文字列-3=出力文字列-1+出力文字列-2+追加文字列+スペース 出力文字数-3=出力文字数-1+出力文字数-2+追加文字数
53 (…)
単に出力文字列を追加文字列をつなげてていけば簡単な操作になるのですが、そうす ると文字列追加の度にメモリーの確保が必要になるので時間がかかります。それより も、追加文字列が出力文字列の余裕分(スペース)を超えたときにだけ、追加したほ うが時間が節約できるのです。そして、そのスペースをかなり大きくとってあるので
(99999)、If文の中の処理が行われることはあまりありません。それでは、最初からた
くさんスペースをとっておけばよい、とも考えられますが、出力文字列の大きさが最 終的にどのくらいになるのかわからないので、適宜(少数回)増加させる、という方 法をとります。
Sub ●高速文字列出力()
Selection = Left$(出力文字列$, 出力文字数&) '文字列の該当部分を出力
Selection.ClearFormatting '書式クリア End Sub
選択範囲に文字列の該当部分、つまり出力文字列の中の出力文字数分だけを代入しま す。出力文字列をそのまま代入すると余分なスペースも出力されてしまいます。
54