Excelは誤記の検出が苦手
Excelで仕事用の資料を作成する際に、どうしてもやらないといけないのが、誤字・誤記・脱字のチェックです。そして、それ以外にも業務特有のチェックがあったりします。
1ページ程度の分量であれば対した話ではないですが、設計書など分量が多い資料の場合はチェック自体に結構な時間が掛かります。
Excelでは標準のスペルチェック機能はありますが、英単語にしか使えず、日本語のチェックは行えません。そのためほとんど役に立ちません。
そこで解決方法として3つを紹介します。
解決方法1 Wordの文章校正機能を使う
Excelのスペルチェック機能は日本語のチェックが出来ない点がいまいちですが、Wordの「スペルチェックと文章校正」機能は日本語の表記ゆれの検出が出来ます。
方法は、シートの内容をWordの新規ページに貼り付けて、「スペルチェックと文章校正」機能でチェックする、という方法も結構ありです。「サーバー」と「サーバ」のような長音の有無の表記ゆれなどは検出してくれます。
単純にExcelのシートを全部コピーしてWordに貼り付けるとセルの表形式でそのまま貼り付けてしまうため、それを避けたい場合はExcelのシートを全部コピーしたあとにテキストエディタに貼り付けてから、テキストエディタを全コピーしてWordに貼り付けることで、文章のみになります。
あとは、Wordの「校閲」メニュー→「スペルチェックと文章校正」を選択すると、チェックが行われます。ただ、望んでいるチェックが全て出来るかというと、おそらく出来ないこともあるでしょう。
本質的にチェックしたいのは、「誤字がないか」「サーバー、サーバ、のように長音”ー”があったりなかったりしないか」「下さい、ください、のように漢字有無がないか」などの表記のゆれもそうですが、人の目で見たときにどうか、という話がほとんどです。Wordのチェックルールに引っかからなかった文章は結局は上から下まで目で探すしかありません。
Wordでのチェックの問題は、「チェックに引っかからないものは結局は人の目で探すしかない」という点です。
ただ、単純な誤字などのかなりの部分はWordでチェックできるので、一次チェックとして利用するのは有効です。
解決方法2 正規表現を扱えるエディタを使う
マクロを解決方法3に後述していますが、私自身はこっちのエディタの方法がラクなのでこの方法を使うことが圧倒的に多いです。
正規表現を扱えるエディタであれば、シートの全文をコピーして新規エディタに貼り付けを行い、以下の正規表現の置換を行うことでチェックが出来ます。フリーであればサクラエディタをお勧めします。ここではサクラエディタを使って説明しています。マクロじゃねーじゃん、って話は置いておきます。
- シートの全文をコピーします。
- エディタの新規ページに貼り付けます。
- 置換ダイアログで以下のように置換します。
検索 → 置換後
「\t」→「\r\n」(タブ文字を改行文字に置換)
「\b」→「\r\n」(単語区切りで改行文字に置換)
「([ァ-ヴー]+)」→「\r\n$1\r\n」(カタカナ単語の前後に改行文字を追加) - そのあとで、昇順ソートと重複除去を行います。
サクラエディタの場合はCtrl+Aで全てを選択し、そのあとに、Alt+Aで昇順ソート、Alt+Mで重複除去を行うと、シートの文章が重複がない状態で列挙されます。
この状態で上から順にチェックしていけば、文章のチェックがシートを上から見ていくよりも短時間で行えます。上の検索と置換のセットをサクラエディタのマクロ(VBAのマクロではないので注意)として登録しておけば、いつでも使えるようになります。
解決方法3 シートの文章を分解して重複を除去する
解決方法2で紹介したエディタを使った方法は正規表現を使って文章を分割したりしていますが、これをマクロで行います。
完全にチェックしたい場合は、やはりある程度、人の目でのチェックは必要になるのはしょうがないです。ただ、シートの文章を全て上から下まで読んでいくのは手間が掛かりますし、見落としの問題も考えられます。
そこで、マクロを使って、シートの文章を分解した上で重複を除去することで、シートの文章を構成する単語や短い文章のみにしてしまい、そこに間違いがないかのチェックを行うことで、時間短縮と見落としの軽減を行います。
以下のマクロはRegExpオブジェクトを使って正規表現を利用しています。そのため、事前にVBAの画面でツールメニュー→参照設定 で「Microsoft VBScript Regular Expressions 5.5」にチェックを付けます。
正規表現の詳細については「VBAで正規表現(RegExp)を利用する」をご参照ください。
ちょっとコードが長いですが、概要はシートに入力されているセルの文章を全て抽出し、文章の区切りとカタカナ単語を分解して、新規シートに出力します。新規シートの名前はSheet1などExcelで新規シートを作成したときと同じような名前になります。
前半の40行ぐらいがやりたいことの本体処理で、それ以降は分解結果を新規シートに貼り付けを行う処理です。
VBAの正規表現は解決方法2のサクラエディタとは正規表現の扱いが少し違うため、新規シートに追記される内容が異なりますが、やりたいこと(文章のチェック)自体には支障はありません。
正規表現が分かるのであれば、15行目の正規表現パターンを変えることで、文章の区切りを変えられます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
Sub BreakDownSheetText() Dim dic As New Dictionary '// セルの文章の分解結果 Dim r As Range '// セル Dim sht As Worksheet '// シート Dim reg As New RegExp '// 正規表現クラスオブジェクト Dim sBreakDown As String '// 分解後文字列 Dim v As Variant '// 分解後文字列を分解した配列 Dim s As Variant '// ループ中の文字列 '// 検索範囲(True:文字列の最後まで検索、False:最初の一致まで検索) reg.Global = True '// 大文字小文字の区別(True:区別しない、False:区別する) reg.IgnoreCase = False '// 検索パターン(ここでは連続する数字を検索条件に設定) reg.Pattern = "([ァ-ヴー]+)|\b|[「」、。()\(\)]" Set sht = ActiveSheet '// シートの文章を全て抽出 For Each r In sht.UsedRange '// セル未設定時は処理せず次のセルへ If r.Value = "" Then GoTo CONTINUE End If '// セルの値を単語ごとに分解 sBreakDown = reg.Replace(r.Value, vbTab & "$1" & vbTab) v = Split(sBreakDown, vbTab) For Each s In v '// 分解結果に未登録の場合のみ登録する If dic.Exists(s) = False Then Call dic.Add(s, s) End If Next CONTINUE: Next Dim shtNew As Worksheet Dim i As Integer '// チェック対象シートの右に新規シートを追加 Set shtNew = Worksheets.Add(after:=sht) i = 1 For Each s In dic.Keys Debug.Print s '// 新規シートのA列の上から順に単語を追加 shtNew.Cells(i, 1).Value = s i = i + 1 Next '// 新規シートに書き込まれているA列の単語をソート shtNew.Sort.SortFields.Add2 key:=Range("A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With shtNew.Sort .SetRange Range("A:A") .Header = xlNo .MatchCase = True .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub |
実行例
マクロ実行前のシートの状態がこんな感じだとします。このページの上の方を例にしてます。
マクロ実行後は、右に新規シートを追加して、A列に単語を重複を除去して列挙します。あとは1行目から順に見ていって、おかしな部分がないかをチェックします。