ユーザが検索した単語をまとめて抜き出すVBAを作ってみた

今まで調べた単語をたくさん記録しているんだけど、後から探すのが大変・・・

そんな語学マニア向けに、一瞬で単語を探せるプログラムを作った。




このVBAでできること

エクセルに入力した単語を探すのが楽になるぞ!

VBAで単語を探すイメージ

シートの様子

私が作ったマクロのシートは以下のようなレイアウトになっている。

こ↑こ↓が調べた単語を追加していくスペースだよ。

ユーザが設定する内容

黄色のセルに単語を検索するキーワードを入れる。

水色のセルは検索オプションの指定。

1,2,3のどれかの数字を入れるだけ。


1:検索文字を「含む」単語を探す
2:検索文字の始まりから探す
3:検索文字の終わりで探す


試しに動かしてみる

「ab」で始まる英単語だけ抜き出したい!

っていう場合はこんな風に入力して、
下の「単語を抜き出す」ボタンをポチっ・・・とな。

すると、一瞬で該当する単語が書き込まれる。

「ab」で始まる単語がずらーっと出てくるよ!


about
able
absolutely
above
abandoned
ability
absolute
・・・(略)





このプログラムの活用例

単語には一定のルールで文字がくっつく

英単語の場合,「接頭辞」と「接尾辞」が付くことがある。

例を以下に上げる。


接頭辞:ab-,ex-,de-,homo-,inter-,ob-,sub,,,
接尾辞:-able,-er,-fy,-ing,-ster,-tion


同じ接頭辞、接尾辞を整理したい時

例えば「homo-」で始まる英単語を知りたい!
その単語をまとめて覚えたい!

っていう場合はこのマクロを使おう!
(提案)

使用頻度の高い英単語10000語の中で「homo-」で始まるのは2個だけだと分かる。


homosexual
homo


逆に「-tion」で終わる単語を整理したい場合は・・・

「-tion」で終わる単語を上位2000位まで整理すると以下になる。


question
situation
information
mention
attention
station
conversation
position
condition
action
connection
investigation


接尾辞ごとに単語をまとめて整理・分析することもできるぞ!

外国語大学の講義のレポートに使って♡

ある文字の組み合わせが存在するかどうか知りたいとき

例えば、英語で「ja」の文字を含む単語はあるのか知りたいとき・・・

検索結果は以下になる。

Benjaminとかhallelujahってなんだよ!(哲学)

こんな風に存在する文字の組み合わせを調べる時にも役に立つ。

このプログラムを動かす方法

拡張子「.xlsm」のエクセルを準備する

エクセルを普通に開いたら、「***.xlsx」になると思う。

左上の「ファイル」をクリックする。

「名前を付けて保存」を選択する。

「Excel マクロ有効ブック(*.xlsm)」を選択して保存する。

これで「***.xlsx」→「***.xlsm」になるよ!

エクセルのシートを編集

シートをは最低でも以下のように入力しておく

詳細を以下に示す。

私が使った単語リストは

Wiktionary:Frequency lists
を参照にしているよ!

単語の意味はgoogle翻訳で一気に翻訳させた。

貼り付けるVBAコード

ソースコードをVBAへ貼り付けてプログラムを動かす方法は以下を参考にして、どうぞ。

「あぁ^~心がぴょんぴょんするんじゃぁ^~」をVBAで表示させてみた

以下のテキストをVBAへコピペすればプログラムが動く・・・ハズ。


Option Explicit ‘このモジュールでは「変数は宣言しないと使えません!」という命令

‘———————————————————
‘ 検索した単語を抜き出して書き並べるマクロ
‘———————————————————
Public Sub extractWords()

Dim searchWord As String
Dim searchCondition As Integer
Dim maxWords As Long
Dim maxItems As Long

startMacro ‘VBA処理速度を上げるためのおまじない

If inputErrorCheck = False Then ‘ユーザ入力にエラーが無ければ本処理を実行
Call Initialize(searchWord, searchCondition, maxWords, maxItems) ‘変数の初期化
Call extractWordsReset(maxWords) ‘前回の単語抜き出し結果をリセット
Call SearchWords(searchWord, searchCondition, maxWords, maxItems) ‘単語を抜き出して書き込む
MsgBox “単語抜き出しの完了”
End If

endMacro ‘VBA処理が終わった後のおまじない

End Sub

‘———————————————————
‘ エラーチェック
‘———————————————————
Private Function inputErrorCheck() As Boolean
inputErrorCheck = False ‘Falseのままなら本処理を実行

If Range(“A1”) = “” Then
MsgBox “セル[A1]に検索したい文字を入力して下さい”
Range(“A1”).Select
inputErrorCheck = True ‘処理を実行しない
Exit Function
ElseIf Range(“A2”) = “” Then
MsgBox “セル[A2]に検索フラグを入力して下さい”
Range(“A2”).Select
inputErrorCheck = True ‘処理を実行しない
Exit Function
‘※検索フラグが1,2,3なっているかどうかの判断は本処理で行う
End If
End Function

‘———————————————————
‘ 変数の初期化
‘———————————————————
Private Sub Initialize( _
ByRef searchWord As String, _
ByRef searchCondition As Integer, _
ByRef maxWords As Long, _
ByRef maxItems As Long _
)
searchWord = Range(“A1”).Value ‘検索する文字の設定
searchCondition = Range(“A2”) ‘検索方法の設定(1=含む,2=始めの文字だけ探す)
maxWords = 20000 ‘とりあえず単語は二万語まで対応
maxItems = 4 ‘項目はrank,word,means,countの4つ
End Sub

‘———————————————————
‘ [VBAで抜き出した単語リスト]のリセット
‘———————————————————
Private Sub extractWordsReset(ByVal maxWords As Long)
Range(“J3:M” & maxWords + 3).Select
Selection.ClearContents ‘セルの値をクリア
Selection.ClearFormats ‘セルの書式をクリア
End Sub

‘———————————————————
‘ 単語の検索、書き込み
‘———————————————————
Private Sub SearchWords( _
ByVal searchWord As String, _
ByRef searchCondition As Integer, _
ByVal maxWords As Long, _
ByVal maxItems As Long _
)
Dim i As Long
Dim j As Long
Dim extractFlag As Boolean
Dim objectWord As String
Dim hitWords As Long
Dim readRange As String
Dim writeRange As String

hitWords = 0 ‘検索で見つかった単語数をカウントする変数の初期化

For i = 1 To maxWords
If Range(“D” & 2 + i).Value = “” Then ‘項目rankが空の場合・・・
Exit For ‘これ以上検索する単語が無いと判断してループをぬける
End If

objectWord = Range(“E” & 3 + i).Value ‘単語を抜き出す

If InStr(objectWord, searchWord) > 0 Then ‘単語がユーザ検索の単語とヒットした時

‘検索方法によって書きこむか否かを判断
If searchCondition = 1 Then ‘文字を含む場合
extractFlag = True ‘そのまま抽出

ElseIf searchCondition = 2 Then
If InStr(objectWord, searchWord) = 1 Then ‘最初の文字だけ見る
extractFlag = True ‘抽出OK
Else
extractFlag = False ‘抽出ダメ
End If

ElseIf searchCondition = 3 Then ‘最後の文字だけ見る

If InStr(objectWord, searchWord) = Len(objectWord) – Len(searchWord) + 1 Then ‘最初の文字だけ見る
extractFlag = True ‘抽出OK
Else
extractFlag = False ‘抽出ダメ
End If

Else
MsgBox “検索フラグは1,2,3のどれかを入力して下さい”
Range(“A2”).Select
Exit Sub
End If

If extractFlag = True Then ‘抽出フラグが立った場合だけ書き込み
For j = 1 To maxItems
readRange = “D” & 3 + i ‘単語読み込みのアドレス
writeRange = Range(“J3”).Offset(0 + hitWords, j – 1).Address ‘単語書き込みのアドレス
Range(writeRange).Value = Range(readRange).Offset(0, j – 1) ‘抽出した情報の書き込み
If j = 2 Then ‘ヒットした単語の該当する文字だけ赤太字にする
Call changeRedFutoji(writeRange, objectWord, searchWord)
End If
Next j
hitWords = hitWords + 1
End If
End If
Next i

End Sub

‘———————————————————
‘ ヒットした単語の文字を赤太字にする
‘———————————————————
Private Sub changeRedFutoji( _
ByVal writeRange As String, _
ByVal objectWord As String, _
ByVal searchWord As String _
)

Dim charStartPlace As Long ‘赤太字にする文字の開始位置
Dim charLength As Long ‘赤太字にする文字の長さ
Dim redCode As Long

redCode = -16776961 ‘赤文字のコード
Range(writeRange).Select ‘赤太字にするセルを選択
charStartPlace = InStr(objectWord, searchWord) ‘赤文字にする文字の開始番号
charLength = Len(searchWord) ‘赤文字にする文字の長さ

Call setCellInfo(charStartPlace, charLength, “太字”, redCode)

End Sub

‘———————————————————
‘ セル書式の設定
‘———————————————————
Private Sub setCellInfo( _
ByVal charStartPlace As Long, _
ByVal charLength As Long, _
ByVal FontStyle_IN As String, _
ByVal colorCode As Long _
)

With ActiveCell.Characters(Start:=charStartPlace, Length:=charLength).Font
.Name = “MS Pゴシック” ‘フォント
.FontStyle = FontStyle_IN ‘太字等に変える
.Size = 11
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.Color = colorCode ‘文字の色を変更
.TintAndShade = 0
.ThemeFont = xlThemeFontMinor
End With

End Sub

‘———————————————————
‘ マクロ開始時に画面描写を停止させて処理速度を上げる
‘———————————————————
Private Sub startMacro()
Application.ScreenUpdating = False ‘画面描画を停止
Application.EnableEvents = False ‘イベントを抑止
Application.DisplayAlerts = False ‘確認メッセージを抑止
Application.Calculation = xlCalculationManual ‘計算を手動に
End Sub

‘———————————————————
‘ マクロ終了前に画面描写を再開させる
‘———————————————————
Private Sub endMacro()
Application.StatusBar = False ‘ステータスバーを消す
Application.Calculation = xlCalculationAutomatic ‘計算を自動に
Application.DisplayAlerts = True ‘確認メッセージを開始
Application.EnableEvents = True ‘イベントを開始
Application.ScreenUpdating = True ‘画面描画を開始
End Sub


必要であれば各自で修正して、どうぞ。