Excel人工知能?エクセルは英語を理解することができますか?その2
今日もエギング行った
釣れないからプログラミングの勉強することにした
前回記事の続きですのでその点はご了承くださいませ
先ずは前回作成したコードのガバガバな箇所を修正していきましょう
対象はココ!
InStr関数を使って日本語を単語帳から検索し、ヒットしたら除外していくというコードですが、問題があります
InStr関数は日本語に対して単語帳からヒットした場合、ヒットした場所を数値Nとして返します。ヒットしなかった場合0を返す
1文字目でヒットした場合N=1、4文字目でヒットした場合N=4という形になります
If N <> 0 then ~ Else ~ End if
上記If文だと、「私は人間です」という文字列に対して、「私は」より「人間」という文字が先にヒットした時に「私は人間」を文字列として除外してしまうため問題が起こります
なので、コードを下記の通りになおしましょうねー
If N <> 0 then を If N = 1 then となおします
たったこれだけですが、コードとしての意味合いはまったく異なりますね
If N <> 0 thenだと、単語帳にヒットしたか?してないか?の判定に対し、If N = 1 thenだと、文字列の先頭でヒットしたか?してないか?の判定となります
ヒットしなかったとき+先頭以外でヒットしたときは次の単語検索をするーという構文になるためこれにて解決です
次に単語までばらした日本語を「文法」+「英単語」として理解させていきます
ここで使えそうなのがVBAのDictionaryオブジェクトである「連想配列」でございます
普通の配列と違い「Key」に対して「Item」を格納することができるので、例えば"主語"というKeyに対して"She"という単語を格納させることが可能です
さっそくコードで書いていくと
If N = 1 then でヒットした単語に対して「Key」と「Item」をそれぞれ連想配列を使って格納していきます
こうして作成したコードを実行するとこうなります
画像が小さくて見にくいかもしれませんが、、、
「私は人間です」という文字列に対して
主語:i
名詞:human
動詞:am
が配列に格納されています( *´艸`)
大きい画像も用意しました
あとやらなければいけないこととして、
・日本語の文法「主語+名詞+動詞」→英語の文法「主語+動詞+名詞」への変換
・英文への再構築
このへんになりそうですね
また近いうちに実装します!
※以下ここまでのコード全文
Sub English()
Dim Japanese As String
Japanese = Cells(3, 3).Value
If Japanese = "" Then
MsgBox "日本語が入力されていません"
Exit Sub
End If
Dim N As Long, M As Long
Dim FindStartRow As Long, FindStartColumn As Long
Dim LoopCnt As Long
FindStartRow = 13
FindStartColumn = 3
LoopCnt = 1
Dim GramDic As Object
Set GramDic = CreateObject("Scripting.Dictionary")
Do Until Japanese = ""
LoopCnt = LoopCnt + 1
N = InStr(Japanese, Cells(FindStartRow, FindStartColumn).Value)
If N = 1 Then
Cells(FindStartRow, FindStartColumn).Interior.Color = RGB(0, 255, 0)
GramDic.Add Cells(11, FindStartColumn).Value, Cells(FindStartRow, FindStartColumn + 1).Value
M = Len(Cells(FindStartRow, FindStartColumn).Value)
Japanese = Mid(Japanese, M + 1)
FindStartRow = 13
FindStartColumn = 3
LoopCnt = 1
Else
FindStartRow = FindStartRow + 1
If Cells(FindStartRow, FindStartColumn).Value = "" And _
Cells(13, FindStartColumn + 2).Value <> "" Then
FindStartRow = 13
FindStartColumn = FindStartColumn + 2
End If
End If
If LoopCnt > 10000 Then
MsgBox "検索結果が見つかりませんでした"
Exit Sub
End If
Loop
Dim str As String
For Each Var In GramDic
str = str & Var & ":" & GramDic.Item(Var) & vbCrLf
Next Var
MsgBox str
End Sub