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

notebook IT

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

スポンサーリンク

完成品イメージ

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

データベース作成

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

以上です。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 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
      に修正していただくと改善するかもしれません。

モバイルバージョンを終了