長崎の仙人-時間があれば釣りにいきたい-

佐世保市を中心に釣れない釣りブログをやってます。釣れないので時事ネタなんかも扱ってます。

Excel人工知能?エクセルは英語を理解することができますか?その2

今日もエギング行った

釣れないからプログラミングの勉強することにした

 

というわけで、Excel人工知能プロジェクトその2です

前回記事の続きですのでその点はご了承くださいませ

nagasaki.hateblo.jp

 

先ずは前回作成したコードのガバガバな箇所を修正していきましょう

対象はココ!

f:id:nagasaki_hermit:20190320162034p:plain

InStr関数を使って日本語を単語帳から検索し、ヒットしたら除外していくというコードですが、問題があります

InStr関数は日本語に対して単語帳からヒットした場合、ヒットした場所を数値Nとして返します。ヒットしなかった場合0を返す

1文字目でヒットした場合N=1、4文字目でヒットした場合N=4という形になります

If N <> 0 then ~ Else ~ End if

上記If文だと、「私は人間です」という文字列に対して、「私は」より「人間」という文字が先にヒットした時に「私は人間」を文字列として除外してしまうため問題が起こります

f:id:nagasaki_hermit:20190320162749p:plain

なので、コードを下記の通りになおしましょうねー

f:id:nagasaki_hermit:20190320162805p:plain

If N <> 0 then を If N = 1 then となおします

たったこれだけですが、コードとしての意味合いはまったく異なりますね

If N <> 0 thenだと、単語帳にヒットしたか?してないか?の判定に対し、If N = 1 thenだと、文字列の先頭でヒットしたか?してないか?の判定となります

ヒットしなかったとき+先頭以外でヒットしたときは次の単語検索をするーという構文になるためこれにて解決です

 

 

次に単語までばらした日本語を「文法」+「英単語」として理解させていきます

ここで使えそうなのがVBAのDictionaryオブジェクトである「連想配列」でございます

普通の配列と違い「Key」に対して「Item」を格納することができるので、例えば"主語"というKeyに対して"She"という単語を格納させることが可能です

さっそくコードで書いていくと

f:id:nagasaki_hermit:20190320163752p:plain

If N = 1 then でヒットした単語に対して「Key」と「Item」をそれぞれ連想配列を使って格納していきます

 

こうして作成したコードを実行するとこうなります

 

f:id:nagasaki_hermit:20190320163906p:plain

画像が小さくて見にくいかもしれませんが、、、

「私は人間です」という文字列に対して

主語:i

名詞:human

動詞:am

が配列に格納されています( *´艸`)

 

f:id:nagasaki_hermit:20190320164159p:plain

大きい画像も用意しました

 

あとやらなければいけないこととして、

・日本語の文法「主語+名詞+動詞」→英語の文法「主語+動詞+名詞」への変換

・英文への再構築

このへんになりそうですね

また近いうちに実装します!

 

※以下ここまでのコード全文

 

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