こんにちは。
>Visual Basicを使って単語帳をつくらなければならい
宿題か何かですか?私も作ったことがあるのですが、なるべく本人が作ったようにしなければならないのですか?(汗……)
ここのカテゴリは、あくまでも、Office 関連ですから、VBAの範疇でお答えします。
X = Int(Rnd * 5) + 6
これは、6単語しかないのに、6~10までを探してしまいます。
それと、全体的にコードが複雑のようです。
最初のコードでは、少し直してみました。
'-------------------------------------------
'Excel VBA
'-------------------------------------------
Sub French2()
Dim i, j, X, Z, Y '←変数の宣言をしてください。
For i = 1 To 4
Randomize
X = Int(Rnd * 4) + 1
Z = Cells(X, 1).Value & "は?"
Y = InputBox(Z)
If Y = "" Then
Exit Sub
ElseIf Trim(Y) = Cells(X, 2).Value Then
Z = "当たり!"
Else
Z = "はずれ"
End If
MsgBox (Z)
For j = 5 To 6
X = Int(Rnd * 2) + 5
Z = Cells(X, 1).Value & "は?"
Y = InputBox(Z)
If Y = "" Then
Exit Sub
ElseIf Trim(Y) = Cells(X, 2).Value Then
Z = "その調子!"
Else
Z = "残念!"
End If
MsgBox (Z)
Next
Next
End Sub
'-------------------------------------------
Sub FlashCard1()
Dim colWords As Collection
Dim colTrWords As Collection
Dim rng As Range
Dim c As Variant
Dim n As Variant
Dim i As Long
Dim j As Long
Dim k As Long
Set colWords = New Collection 'コレクションオブジェクトを使う
Set colTrWords = New Collection
With ActiveSheet
Set rng = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp))
For Each c In rng
colWords.Add c.Value
colTrWords.Add c.Offset(, 1).Value
Next c
End With
k = colWords.Count
'乱数ジェネレータの初期化
Randomize
Do
i = Int(Rnd * k) + 1
n = Application.InputBox(colWords.Item(i) & " の意味は?", Type:=2)
'キャンセルボタンで解除
If VarType(n) = vbBoolean Then Exit Sub
'フラッシュカードの比較では、訳は文字が3文字程度入っていれば、合っているとします。
If Trim(n) Like "*" & Mid(colTrWords.Item(i), 3) Then
MsgBox colWords.Item(i) & " : " & colTrWords.Item(i) & vbCrLf & _
"正解です!", vbInformation
'正解したらリストから消す
colWords.Remove i
colTrWords.Remove i
k = colWords.Count
Else
MsgBox colTrWords.Item(i) & vbCrLf & _
"は違っています。", vbExclamation
End If
Loop Until k = 0
End Sub
お礼
回答ありがとうございます!