【最大10000ポイント】当たる!!質問投稿キャンペーン!

なんどもすいません。二列目に、二桁の整数の足し算を出題することができるたし算の作問プログラムと、続いて三列目に、足し算の解答をして、それの正誤を確かめるプログラムを、それぞれフォームで”問題”、”採点”とした時、一回フォームのウィンドウを閉じてしまうと”採点”のコマンドを押しても、うまく実行されません。
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はフォームのテキストボックスのオブジェクト名です。

A 回答 (3件)

すみません。

。#1 の参考コードで saiten_Click() 内の

> lLastRow = Cells(1, "B").End(xlDown).Row

は問題数1のとき失敗します。問題数1があり得るなら、

 lLastRow = Cells(Rows.Count, "B").End(xlUp).Row

に変更して下さい。では。
    • good
    • 0
この回答へのお礼

どうもご丁寧に何度も御回答していただきありがとうございます。おかげさまで疑問点が解決できました。

お礼日時:2008/07/23 22:31

#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 ではあまり使われないようです)などの特殊な
ものもあります。調べてみて下さい。
    • good
    • 0

こんにちは。



> 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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング