Excel VBAで英語学習ツールをつくってみる

## はじめに

エンジニアたるもの英語はやっぱり習得したい。という思いで1か月前から英会話を始めてみました。
ただレッスンの回数を重ねてみても、自分の言いたいことが言えない。
単純な文章のはずなのに出てこない。

そう悩んでいるときに次の書籍に出会いました。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130234/8fac4f62-79fb-6c0c-b305-5b53ec6ed9eb.jpeg">
30パターンの型とフレーズを組み合わせるとなんでも英語で言えちゃうよ！
ということが書かれており、30パターンであればなんとかマスターできるのでは？
これで英語をすらすら話せるようになるのでは？と思った私は早速実践することにしました。



ただ実際にやってみると、そもそも練習のために言う文章が思いつかないんですよね。
本当になんでもいいのですが適当な文章もなかなか思いつきません。。



代わりに適当な文章を沢山作ってくれるソフトがあったらいいなぁ。
という訳で、ExcelのVBAで作ってみることにしました。


## できたもの

![できたもの.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130234/bfb1bc8a-83f0-96c5-481d-bf798c312b01.png)
学習したい型とフレーズを記載してVBAを実行すると文章がランダムに生成されます。
日本語としておかしかったり、これどこで使うの？みたいな文章ができてることもありますが、そのインパクトで頭に残るという効果も期待できるんじゃないかなと思います。



## コード

以下全文です。

```vb

Sub CreateQuestion()

    Const GRAMMER_START As String = "A2"    '文法(en)の開始セル
    Const WORD_START As String = "C2"       '単語(en)の開始セル
    Const OUTPUT_START As String = "F2"     '出力開始セル
    

    '文法のリストを取得する
    Dim grammerRange As Range
    Set grammerRange = Range(Range(GRAMMER_START).Cells, Range(GRAMMER_START).End(xlDown))

    '単語のリストを取得する
    Dim wordRange As Range
    Set wordRange = Range(Range(WORD_START), Range(WORD_START).End(xlDown))
    
    
    '文法の並び順をランダムにしたいためシャッフルしたインデックス配列を作成する
    shuffledGrammerIndexArr = Shuffle(CreateRange(1, grammerRange.Count))
    
    Dim i As Variant
    For i = 0 To UBound(shuffledGrammerIndexArr)
        '単語をランダムに1つ選択する
        Dim wordIndex As Integer
        wordIndex = (wordRange.Count - 1) * Rnd + 1
        
        Dim wordEn As String
        Dim wordJa As String
        wordEn = wordRange(wordIndex).value
        wordJa = wordRange(wordIndex).Offset(0, 1).value
        
        '文法をランダムに1つ選択する（事前にシャッフルしておいた配列により）
        Dim grammerIndex As Integer
        grammerIndex = shuffledGrammerIndexArr(i)
        
        Dim grammerEn As String
        Dim grammerJa As String
        grammerEn = grammerRange(grammerIndex).value
        grammerJa = grammerRange(grammerIndex).Offset(0, 1).value
        
        '問題と回答の文字列を作成
        Dim question As String
        Dim answer As String
        question = Replace(grammerJa, "～", "[" + wordJa + "]")
        answer = Replace(grammerEn, "~", "[" + wordEn + "]")
        
        Cells(Range(OUTPUT_START).row + i, Range(OUTPUT_START).Column).value = question
        Cells(Range(OUTPUT_START).row + i, Range(OUTPUT_START).Column + 1).value = answer
    Next i
End Sub


'指定した範囲の配列を生成して返す
Private Function CreateRange(ByVal valueFrom As Integer, ByVal valueTo As Integer) As Variant
    Dim buf() As Integer
    ReDim buf(valueTo - valueFrom)
    
    Dim i As Integer
    For i = 0 To (valueTo - valueFrom)
        buf(i) = valueFrom + i
    Next i
    
    CreateRange = buf
End Function

'配列をシャッフルする
Private Function Shuffle(list)
    For i = 1 To UBound(list)
        Randomize
        rn = Int(UBound(list) * Rnd + 1)
        tmp = list(i)
        list(i) = list(rn)
        list(rn) = tmp
    Next
    Shuffle = list
End Function
```



## おわりに

VBAの文法が全然分からない状態で臨んだのですが、数時間で欲しかったものができたので満足です。
これを活用して英語力を伸ばしていこうと思います。

Excelで動くので気になった方は是非使ってみてください。