[[20171211134604]] 『別フォームへのコード記述』(ここ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『別フォームへのコード記述』(ここ)

VBAのユーザーフォームで、クイズを出題するシステムを作っています。
問題の科目をシートごとに分けて、問題番号、問題、正誤判定、解説をそれぞれセルに記述しています。
解説画面を作っているのですが、問題を出題するフォームからそのまま解説画面のフォームのコードを記述したいと考えています。

問題を生成するところでは

Public Sub setQuizData()

LastRow = Cells(Rows.Count, 1).End(xlUp).Row
rowNo = Int((LastRow - 1 + 1) * Rnd + 1)

If S = 4 Then
quizText.Text = Sheet1.Cells(rowNo, 2)
Else
Set ws = Worksheets("Sheet" & S)
quizText.Text = ws.Cells(rowNo, 2)
End If

科目を選ぶ画面で科目に応じた変数を使用してシート名を選ぶようにし、ランダムに問題番号を選び、問題を記述したセルをテキストボックスに表示するコードを作りました。

quizText.Text = ws.Cells(rowNo, 2)の部分をそのまま利用して解説画面に持っていきたいのですがどうすればよいのかわかりません。
よろしくお願い致します。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


そのまま動きそうなコードに見えますが、何に困っているのかがピンときません。
こっちのフォームからあっちのフォームに値をセットするのではなく、どちらもシートのセル値を見に行けば良いだけではないでしょうか?
(???) 2017/12/11(月) 14:14

ランダムに選ばれる問題番号を変数にしてみたのですが、型が一致しませんと出ます...
rowNoをAとして標準モジュールに「Public A As String」と宣言してみたのですがうまくいきませんでした。

(ここ) 2017/12/11(月) 14:51


足りない宣言を補って、そのままのコードで普通に動いたのですが、宣言か環境に問題がありそうですね。ブレークポイントを張って途中で止めて、そこからF8キーでステップ実行し、エラーの出る行を特定してみてください。

あと、気になるのが、問題数を数えるのがA列なのに、問題を取り出すのはB列になっている点。両方共B列(2列目)を使えば良さそうに見えるのですが…。(まぁ、間違えていたとしても、常に先頭しか表示されない、となるだけなので、これが原因ではなさそう)
(???) 2017/12/11(月) 15:12


エラーの出る行は解説をテキストボックスに表示する行の「TextBox1 = ws.Cells(A, 4)」でした。
アプリケーション定義またはオブジェクト定義のエラーと出るので、標準モジュールで宣言している変数型をいろいろ変えてみましたがうまくできません...

(ここ) 2017/12/12(火) 10:30


そのエラーになる行は、最初のコードには存在しないようですが? Cellsに指定しているAは、行を表す数値でないといけませんが、文字になっていませんかね?

(???) 2017/12/12(火) 11:54


TextBox1が他フォームに貼ってあるものならば、他フォーム名.TextBox1 とか?
(???) 2017/12/12(火) 12:00

解説のテキストボックスを表示するコードは解説のフォームに記述するようにしてみました。
そのため問題番号をランダムに生成したものを変数Aとし、問題を表示するフォーム内では変数Aでうまく動作するのですが、解説フォームに持っていくと判断してくれないようでです...


問題を表示するフォーム

Dim A

Public Sub setQuizData()
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
A = Int((LastRow - 1 + 1) * Rnd + 1)

If S = 4 Then
quizText.Text = Sheet1.Cells(A, 2)
Else
Set ws = Worksheets("Sheet" & S)
quizText.Text = ws.Cells(A, 2)
End If

End Sub

Private Sub UserForm_Initialize()
Randomize
setQuizData

End Sub
Private Sub ans1_Click()

If Sheet1.Cells(A, 3) = 1 Then
Sheet4.Cells(1, 2) = "〇"
Else
Sheet4.Cells(1, 2) = "×"
End If

End Sub

Private Sub ans2_Click()

If Sheet1.Cells(A, 3) = 2 Then
Sheet4.Cells(1, 2) = "〇"
Else
Sheet4.Cells(1, 2) = "×"
End If

End Sub

Private Sub CommandButton3_Click()
Me.Hide
解説0.Show
End Sub


解説を表示するフォーム

Public Sub setTextBox()

Set ws = Worksheets("Sheet" & S)
TextBox1 = ws.Cells(A, 4)

End Sub

Private Sub UserForm_Initialize()

setTextBox

End Sub

Private Sub CommandButton2_Click()
Me.Hide
解説1.Show
End Sub


標準モジュール
Public S As String
Public A As String

(ここ) 2017/12/12(火) 14:09


標準モジュールに書いた変数は、Long型に変えてみてください。文字列にしているせいで、エラー停止していそう。
(???.) 2017/12/12(火) 15:05

Long型に変えてみましたがうまくいかなかったので、問題を出題するフォームからそのまま解説のテキストボックスに表示するようにしたらうまくできました!

(ここ) 2017/12/13(水) 11:17


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.