• ベストアンサー

VBAにおける、たし算の自動作問プログラムについて

二列目に、二桁の整数の足し算を出題することができるたし算の作問プログラムを以下のように作ったのですが、続いて三列目に、足し算の解答をして、それの正誤を確かめるプログラムを作りたいのですがどのようにすればよいでしょうか? ↓作問のプログラム Sub test() Columns("B:F").Clear n = InputBox("問題数は?") ReDim ans(n) 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 以下のような感じで採点のプログラムを作りたいのですが、上のプログラムの変数ans(i)を参照する場合、下のプログラムのans(i)はどのように定義すればよいのでしょうか? Sub saiten() For i = 1 To n If Cells(i, 3) = ans(i) Then Cells(i, 4) = "○" Else: Cells(i, 4) = "×" Next i End Sub

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

Public ではなく Dimですね。すみません。 出題数であるnもモジュール全体で使用できるようにしなければなりませんね。 Dim Ans() As Long Dim n As Variant Sub Test()  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 Sub Saiten()  Dim i as Long  For i = 1 To n   If Cells(i, 3) = ans(i) Then    Cells(i, 4) = "○"   Else    Cells(i, 4) = "×"   End If  Next i End Sub

uenao1
質問者

お礼

二度のご回答どうもありがとうございます。nもモジュール全体で使えるようにすること、その具体的なやり方もおかげさまで理解することができました。また、ご丁寧に説明していただいてありがとうございます。

その他の回答 (3)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

既回答の様に、モジュールレベルで dim ans() と宣言すれば、プロシージャ間で共通で使えますが、何らかの原因で消えてしまう事がありえますので、自分なら不可視化したワークシート上に保管します。

uenao1
質問者

お礼

なるほど、モジュールレベルでdim ans()と宣言すれば上手くいきました。どうもありがとうございます。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

ans,n をプロシージャ外で定義(グローバル変数)しないと無理です。 問題作成後、エクセルを終了させると変数の値は初期化されるので、このまままではベストは方法とは言えません。 -------------------------------------------- Option Explicit Dim ans() Dim n Sub test() Dim i, x, y Columns("B:F").Clear n = InputBox("問題数は?") ReDim ans(n) 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 Sub saiten() Dim i For i = 1 To n If Cells(i, 3) = ans(i) Then Cells(i, 4) = "○" Else Cells(i, 4) = "×" End If Next i End Sub

uenao1
質問者

お礼

どうもご丁寧な回答ありがとうございます。大変参考になりました。

回答No.1

VBA画面の一番上に Public ans() と入れてこのモジュール全体で使えるようにしてはいかがですか? Public ans() Sub test()   Columns("B:F").Clear   n = InputBox("問題数は?")   ReDim ans(n)    ・    ・    ・ と以下に続きます。

関連するQ&A