
なんどもすいません。二列目に、二桁の整数の足し算を出題することができるたし算の作問プログラムと、続いて三列目に、足し算の解答をして、それの正誤を確かめるプログラムを、それぞれフォームで”問題”、”採点”とした時、一回フォームのウィンドウを閉じてしまうと”採点”のコマンドを押しても、うまく実行されません。
im Ans() As Long
Dim n As Variant
Private Sub monndai_Click()
Dim x As Long, y As Long
Columns("B:F").Clear
n = InputBox("問題数は?")
If Not IsNumeric(n) Then Exit Sub
If n <= 0 Then Exit Sub
ReDim Ans(n) As Long
For i = 1 To n
Randomize
x = Int(Rnd * 100)
Randomize
y = Int(Rnd * 100)
Ans(i) = x + y
Cells(i, 2) = "(" & i & ") " & x & " + " & y & " = "
Next i
End Sub
Private Sub saiten_Click()
t = 0
Dim i As Long
For i = 1 To n
If Cells(i, 3) = Ans(i) Then
Cells(i, 4) = "○": t = t + 1
Else
Cells(i, 4) = "×":
End If
Next i
tokutenn = "貴方の正答率は" & Int(t / n) & "%です"
End Sub
(注)tokutennはフォームのテキストボックスのオブジェクト名です。
No.2
- 回答日時:
#1 です。
今前回のレスが目に入り、読んでみました。
モジュールレベル変数という話がでてきてますね。あるプロシージャの
終了後も変数の値を保持するという点で、モジュールレベル変数を使う
というのは一つの手段ですが、その書き方、書く場所で効果が異なります。
1. Dim n As Long
2. Private n As Long
3. Public n As Long
お調べになるキーワードとしては、「変数の有効期間、スコープ」です。
また、プロシージャ内で宣言することになりますが、スタティック変数
というものがありますよ。
4. Static n As Long
Google で検索してみて最初にヒットしたページです。簡潔に良くまとめ
られていますので、参考になると思います。
http://www.mccoy.jp/chie/zaitaku/excel/vba/vba4_ …
他にも、Friend (VBA ではあまり使われないようです)などの特殊な
ものもあります。調べてみて下さい。
No.1
- 回答日時:
こんにちは。
> Dim Ans() As Long
> Dim n As Variant
の答えや問題数を保持する変数の宣言までフォームに書いているのでは?
だとすれば、フォームを閉じてしまうとこの変数の中身は消去されて
しまいますから、
> Private Sub saiten_Click() ~(略)~ End Sub
は実行できませんよ。簡単に直すなら、この変数の宣言部を標準モジュール
に下記のように移します。
Public Ans() As Long
Public n As Variant
余談になりますが。。
> tokutenn = "貴方の正答率は" & Int(t / n) & "%です"
これでは、正答率が100%でも 1% と表示されてしまいますよ。
それから、ご掲載いただいたコードではちょっとした事で変数 Ans や n
の中身が失われますから、採点時に問題数の取得、検算をする仕組みの方
が良い気がします。
ご掲載いただいたコードをベースに手を加えてみたサンプルコードを掲載
しておきますのでご参考までに。(セルの位置は多少変更しました)
' // 全てフォームモジュール
Private Const MAX_NUM As Long = 100
Private Sub monndai_Click()
Dim vMondaiSu As Variant
Dim n1 As Long
Dim n2 As Long
Dim s1 As String
Dim s2 As String
Dim i As Long
Columns("B:F").Clear
vMondaiSu = InputBox("問題数は?")
If Not IsNumeric(vMondaiSu) Then Exit Sub
If vMondaiSu <= 0 Then Exit Sub
Randomize Now()
For i = 1 To Int(vMondaiSu)
n1 = Int(Rnd * MAX_NUM)
n2 = Int(Rnd * MAX_NUM)
s1 = Space$(Len(CStr(MAX_NUM)) - Len(CStr(n1))) & CStr(n1)
s2 = Space$(Len(CStr(MAX_NUM)) - Len(CStr(n2))) & CStr(n2)
Cells(i, "B").Value = "[" & CStr(i) & "]"
Cells(i, "C").Value = s1 & " + " & s2 & " = "
Next i
End Sub
Private Sub saiten_Click()
Dim sMondai As String
Dim vAnswer As Variant
Dim t As Long
Dim i As Long
Dim lLastRow As Long
lLastRow = Cells(1, "B").End(xlDown).Row
Application.ScreenUpdating = False
For i = 1 To lLastRow
sMondai = Cells(i, "C").Text
sMondai = Replace$(sMondai, "=", "")
vAnswer = Evaluate(sMondai)
If Cells(i, "D").Value = vAnswer Then
Cells(i, "E").Value = "○"
t = t + 1
Else
Cells(i, "E").Value = "×"
End If
Next i
tokutenn.Text = "貴方の正答率は " & Format$(t / lLastRow, "0.0%") & " です" & _
" (" & CStr(t) & "/" & CStr(lLastRow) & ")"
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するQ&A
- 1 【VBA】コマンドボックスと検索のコマンドボタンを作成し、コマンドボックスと同じ文字の列に色をつける
- 2 Excel2013 VBA A列とB列の文字をA列とB列とC列に移動させる方法
- 3 VBAでDOSコマンドを実行する について いつもお世話になっております 今回の問題点はVBAでDO
- 4 エクセルでユーザーフォームにコンボボックスを作っていますが シート1のA列とD列、H列など 複数の列
- 5 Excel VBA F列の特定値が100、M列の値がゼロの時にX列の値に◎を付け加えたいのですが
- 6 VBA ユーザーフォームのテキストから列を判別
- 7 エクセルVBA フォーム内のコマンドボタンを有効にする
- 8 EXCEL VBAのユーザーフォームのコマンドボタンでBSキーと同様の役割を持たせる方法について
- 9 (初心者です)VBAでA列がBかつC列がDならE列がF
- 10 次のケースでのVBAマクロコードを教えて下さい。 A列 B列 C列 1 項目コード 項目名 備考 2
関連するカテゴリからQ&Aを探す
おすすめ情報
人気Q&Aランキング
-
4
EXCEL VBAのユーザーフォームに...
-
5
VBAフォームのテキストボックス...
-
6
VBAでユーザーフォームを再表示...
-
7
ExcelVBAでセルをクリックして...
-
8
エクセルのVBAでユーザーフォー...
-
9
ユーザーフォームに今の時間を表示
-
10
Access 更新キャンセルするには?
-
11
サブフォームのコントロールの...
-
12
ワードで、グレーの部分しか入...
-
13
ユーザーフォームで数字にカン...
-
14
タスクバーにフォーム名を表示...
-
15
MS Accessでフォームの「開く時...
-
16
エクセルでフォームのDropDown...
-
17
リストボックスをクリックする...
-
18
アクセスのレポートに、フォー...
-
19
「フォームを作成できませんで...
-
20
ACCESSのフォーム、開くんです...