- ベストアンサー
VBAでフォームにおけるコマンドが実行されません。
- VBAでフォームにおけるコマンドが実行されません。
- フォームのウィンドウを閉じてしまうと、採点のコマンドがうまく実行されません。
- 問題の作成と採点を行うVBAプログラムについて説明します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
すみません。。#1 の参考コードで saiten_Click() 内の > lLastRow = Cells(1, "B").End(xlDown).Row は問題数1のとき失敗します。問題数1があり得るなら、 ↓ lLastRow = Cells(Rows.Count, "B").End(xlUp).Row に変更して下さい。では。
その他の回答 (2)
- KenKen_SP
- ベストアンサー率62% (785/1258)
#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_1.html 他にも、Friend (VBA ではあまり使われないようです)などの特殊な ものもあります。調べてみて下さい。
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。 > 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
お礼
どうもご丁寧に何度も御回答していただきありがとうございます。おかげさまで疑問点が解決できました。