• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAでフォームにおけるコマンドが実行されません。)

VBAでフォームにおけるコマンドが実行されません。

このQ&Aのポイント
  • VBAでフォームにおけるコマンドが実行されません。
  • フォームのウィンドウを閉じてしまうと、採点のコマンドがうまく実行されません。
  • 問題の作成と採点を行うVBAプログラムについて説明します。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

すみません。。#1 の参考コードで saiten_Click() 内の > lLastRow = Cells(1, "B").End(xlDown).Row は問題数1のとき失敗します。問題数1があり得るなら、 ↓  lLastRow = Cells(Rows.Count, "B").End(xlUp).Row に変更して下さい。では。

uenao1
質問者

お礼

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

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答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_1.html 他にも、Friend (VBA ではあまり使われないようです)などの特殊な ものもあります。調べてみて下さい。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答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