ExcelVBA(マクロ)で英単語学習・暗記ソフトを作る方法

notebook IT

シンプルな学習ソフトの作り方です。やや説明駆け足なので、Excel関数、VBAにある程度慣れている方向けです。
かつ、2007で作ったマクロ入りのファイルを散布するのも問題がある気がするので、添付ファイルはありません。コード見て参考にしていただくなり、自分で作っていただくなり、アレンジしていただくなりという形です。一応マネすれば動くものができます。

スポンサーリンク

完成品イメージ

eng48
こんな感じのものが出来上がります。
eng49
「出題」を押すと問題が更新され、解答が隠されます。
eng50
「OK」または「確認」を押すと解答が表示され、「OK」の場合は習熟度がプラスされます。
eng51
習熟度は0~10で、一回OKを押すたびに1上がり、10になった問題は「整理」を押すと出なくなります。「クリア」を押すと習熟度が全て0になります。
なお、現状問題は全て自分で手打ちする仕様です。

データベース作成

eng1
ここから作り方です。まずxlsmファイルを作り、「単語」タブにナンバー、問題、解答、習熟度の項目を作ります。
eng2
単語数はA列のナンバーをCount関数で数えます。この場合=COUNT(A:A)となります。
eng3
表示単語はRand関数で単語数分のランダムな数字が出るようにしておきます。この場合=INT(RAND()*F2)+1となります。
eng4
タブ「テスト」のほうでは問題と解答を表示し、単語テストはこちらのタブで行います。問題、解答はそれぞれVlookUp関数で求めます。問題が=VlookUp(単語!F3,単語!A2:C100000,2,FALSE)となり、
eng5
解答は=VlookUp(単語!F3,単語!A2:C100000,3,FALSE)となります。数字は適当です。
eng7
数式タブ計算方法の設定で計算方法は手動に設定しておきます。マクロ「出題」を作成し、Application.Calculateと記述します。
これはブック全体に再計算をかけるマクロです。
eng8
開発タブ挿入からボタンを作成します。
eng9
適当なサイズにドラッグしてボタンを作り、さっき作ったマクロを割り当てます。
eng10
ボタンの文字を修正します。
eng12
手頃なサイズに整形し、ホームタブでフォントや文字のサイズを変更します。ボタンはAltを押しながらドラッグするとセルの稜線に合わせることができます。
eng13
これで「ボタンを押すと問題が更新される」状態になりました。
eng14
「解答」に文字が表示されてはテストにならないので、「出題」マクロ実行時はフォントの色を白にします。
コードで言うとRange(“B2”).Font.ColorIndex = 2となります。
eng15
実行すると文字が見えなくなることが確認できました。
eng16
次に「OK」マクロを作ります。
eng17
とりあえず「OK」を押した時は、解答の文字を赤で表示するようにしてみます。コードで言うとRange(“B2”).Font.ColorIndex = 3となります。
eng18
変数question、pointをPublic変数として作ります。Public変数は複数のマクロで共通して使えます。
eng19
Set question = Worksheets(“単語”).Range(“B:B”). Find(Worksheets(“テスト”).Range(“A2”).Value)と記述します。なにかというと、
eng20
「単語」シートの中のB列を検索し、
eng21
その中でA2(問題)と一致したセルの場所を、変数questionに代入しています。このへんの処理は習熟度を使わないなら省略可能です。
eng22
獲得した変数questionの行番号をRowプロパティで取得し、同じ行のD列(Cells(question.Row, 4))の値を変数pointに代入します。
eng23
要するに問題が「cut」の時、OKを押すと、
eng24
変数pointに同じ単語の習熟度がセットされます。
eng25
従って、point.Value = point.Value + 1と記述すると、
eng26
OKを押した単語の習熟度が1上がります。
eng31
If文で10未満という縛りをかけて、習熟度が11以上にならないようにします。
eng30
さらに「確認」というマクロも作りますが、これは文字の色を変えるだけでOKです。
スポンサーリンク
eng32
習熟度の扱いについては、「完了単語」という項目を新たに作ることにします。Countif関数=Countif(D:D,10)と記述し、習熟度マックスの単語数を数えます。
eng33
マクロ「整理」を作り、習熟度をソートできるようにします。習熟度と単語、解答はセットで並べ替えしたいので範囲をB~D列で取り、Worksheets(“単語”).Range(“B2:D10000”).Sort Worksheets(“単語”).Range(“D2”)と記述します。
eng34
このマクロを実行すると、
eng35
習熟度の大きい単語は最下部に下ります。
eng36
単語数は「出題単語数」に修正、単語の総数-完了した単語数として=Count(A:A)-F4を求めます。
これによりRand関数の上限も下がるので、習熟度の高い問題は出題されなくなります。
eng37
出せる問題がなくなったらビープ音を鳴らし、メッセージを出すようにしておきます。
eng41
習熟度マックスも含めた総単語数を別に作ります。
eng40
マクロ「クリア」は習熟度をゼロにしたいので、変数clearnumberに総単語数を代入しておき、
eng42
For Next文で繰り返しながら、D列の値を0にしていきます。開始位置が2行目なので、変数clearnumberも+1します。
なんでFor Nextなのかというと、「値を全て-1する」とかに修正が効くからです。
コードで言うとFor i = 2 To clearnumber + 1
Sheets(“単語”).Cells(i, 4).Value = 0
Next
となります。
eng43
これを実行すると、
eng44
こうなります。
eng45
ボタンを作ります。
eng46
最後に手動計算/自動計算をボタンで切り替えられるようにしておきます。
eng47
それぞれApplication.Calculation = xlCalculationManualおよびxlCalculationAutomaticとなります。
eng48
手動はテスト前、自動はファイル閉じる前に実行します。
ボタンにマクロをセットして、これで完成です。

以上です。SheetsとWorksheetsが混在してたりしますが、そのへんはスルーするか、見苦しければどちらかに統一してご利用ください(実行上問題はないです)。

' vba
Option Explicit
Public question
Public point
Public i

Sub 出題()
Application.Calculate
If Worksheets("単語").Range("F2").Value = 0 Then
Beep
MsgBox ("全ての問題が完了しています")
Else
Range("B2").Font.ColorIndex = 2
End If
End Sub

Sub OK()
Range("B2").Font.ColorIndex = 3
Set question = Worksheets("単語").Range("B:B"). _
Find(Worksheets("テスト").Range("A2").Value)
Set point = Sheets("単語").Cells(question.Row, 4)
If point.Value < 10 Then
point.Value = point.Value + 1
End If
End Sub

Sub 確認()
Range("B2").Font.ColorIndex = 3
End Sub

Sub 整理()
Worksheets("単語").Range("B2:D10000").Sort Worksheets("単語").Range("D2")
End Sub

Sub クリア()
Dim clearnumber
Set clearnumber = Worksheets("単語").Range("F5")
For i = 2 To clearnumber + 1
Sheets("単語").Cells(i, 4).Value = 0
Next
End Sub

Sub 計算方法手動()
Application.Calculation = xlCalculationManual
End Sub

Sub 計算方法自動()
Application.Calculation = xlCalculationAutomatic
End Sub
Excel(エクセル):ランダム、乱数
Excelの乱数、ランダム関連操作、関数等まとめです。 乱数の作成 関数で乱数を求める場合、Rand関数(0~1の乱数)またはRandBetween関数(指定範囲の整数)を用います。 もしビンゴで使うような重複...
関数・演算子・メソッド・プロパティ名から探すExcel/VBA(マクロ)使い方・組み合わせ方まとめ
こちらはExcelやメソッドの諸機能を、機能の名称から探せるまとめ記事です。

コメント

  1. JK より:

    すいません、本記事を参考にしてマクロを作成したのですが、
    Set point = Sheets(“単語”).Cells(question.Row, 4)
    の部分がどうしても機能せず、
    「実行時エラー 91: オブジェクト変数、またはブロック変数が設定されていません」
    というメッセージが出てしまいます。
    Setの付け忘れやNothing判定など、疑わしい所をチェックしたのですが、
    見当たりませんでした。因みにquestion.Rowの部分を適当な数字に変えたところ、
    習熟度はプラスされました。他に考えられる原因はあるでしょうか。

    • すなぎつ より:

      大変確認が遅くなり申し訳ございません。
      最初の宣言部分を
      Public question As Range
      Public point As Range
      Public i As Integer
      に修正していただくと改善するかもしれません。