質問編集履歴

1

修正したコードを追記。

2023/09/21 06:28

投稿

koburon
koburon

スコア31

test CHANGED
File without changes
test CHANGED
@@ -203,3 +203,120 @@
203
203
  回答となるコードを丸ごといただければ勿論うれしいですが、それだけでは今後の勉強にならないので、考え方やヒントをいただければ幸いです。
204
204
  よろしくお願いいたします。
205
205
 
206
+ ### 追記
207
+ いただいた回答を元にコードをいくつか修正しました。途中までの重複しない出題は達成できましたが、全問を出題した後の処理が進まない状態です。
208
+
209
+ ```VBA
210
+ Private Sub ToggleButton5_Click()
211
+ Dim end_flag As Boolean
212
+ Call setQuizData(end_flag)
213
+
214
+ '保存用シートへのデータ貼りつけ用の最終列取得の次の列i
215
+ Dim i
216
+ i = Sheet3.Cells(1, Columns.Count).End(xlToLeft).Column
217
+ If Sheet3.Cells(1, i).Value <> "" Then i = i + 1 'A1が空白ならiを1とする
218
+
219
+ '記録用シートに日付を入力する
220
+ Sheet2.Range("A1").Value = Date
221
+ Sheet2.Range("B1").Value = "%" '後に正答率を入力する
222
+
223
+ Do
224
+ While Info.Visible = False
225
+ DoEvents
226
+ Wend
227
+
228
+ Dim nextQuiz
229
+ nextQuiz = MsgBox("次の問題に進みますか?", vbInformation + vbYesNo)
230
+ If nextQuiz = vbYes Then
231
+ Info.Visible = False
232
+ Call setQuizData(end_flag)
233
+
234
+ ElseIf end_flag = True Then
235
+ Exit Do
236
+
237
+ Else
238
+ Exit Do
239
+ End If
240
+
241
+ Loop
242
+ Sheet2.Range("A1").CurrentRegion.Copy 'Sheet2のデータをコピー
243
+ 'Sheet3に貼りつけ
244
+ Sheet3.Cells(1, i).PasteSpecial Paste:=xlPasteValues, _
245
+ Operation:=xlNone, SkipBlanks:=False, Transpose:=False
246
+ Sheet3.Cells(1, i).NumberFormatLocal = "mm/dd" '表示形式を00月00日へ
247
+ Sheet3.Cells(1, i + 1).NumberFormatLocal = "0%" '表示形式をパーセントへ
248
+ Sheet2.Cells.Clear '記録用シートの初期化
249
+
250
+ Call getAverage(i)
251
+
252
+ MsgBox "問題集を終了します", vbInformation + vbOKOnly
253
+ Unload Me
254
+
255
+ End Sub
256
+ ```
257
+
258
+ ```VBA
259
+ Private Sub setQuizData(ByRef end_flag As Boolean)
260
+ end_flag = True
261
+
262
+ '空いている行をrowNoに設定する。空き行がない場合は、-1をrowNoに設定する。
263
+ Dim rowNo As Long
264
+ Call get_row_number(rowNo)
265
+
266
+ 'すべて
267
+ If rowNo = -1 Then
268
+ Exit Sub
269
+ End If
270
+
271
+ quizText.Text = Sheet1.Cells(rowNo, 2)
272
+ CmntText.Text = ""
273
+
274
+ 'rowNoは問題の行数
275
+ '解説を表示するためにrowNoを記録しておく
276
+ CmntRow = rowNo
277
+
278
+
279
+ '問題ナンバーを入力する行番号mを定義
280
+ Dim m
281
+ m = Sheet2.Cells(Rows.Count, "A").End(xlUp).Row + 1
282
+
283
+ ans1.Value = False
284
+ ans2.Value = False
285
+ ans3.Value = False
286
+ ans4.Value = False
287
+
288
+
289
+ ans1.Caption = ""
290
+ ans2.Caption = ""
291
+ ans3.Caption = ""
292
+ ans4.Caption = ""
293
+
294
+ '変数の説明
295
+ 'ansFlag: いくつ選択肢を設定したのかを記憶しておく箱
296
+ 'ansNo: 1から4の間で発生させた乱数の値を記憶しておく箱
297
+ 'colNo: Sheet1の3列目から6列目に格納されている選択肢の、何番目までを設定したのかを記憶しておく箱
298
+
299
+ Dim ansFlag, ansNo, colNo
300
+ ansFlag = 0
301
+ ansNo = 0
302
+ colNo = 3
303
+ While ansFlag < 4 'ansFlagが4より小さいあいだ処理をくり返す
304
+ ansNo = Int(Rnd * 4 + 1) '0~1までの乱数Rnd に4をかけ、1を足し、小数点以下を切り捨てるInt
305
+ If UserForm1.Controls("ans" & ansNo).Caption = "" Then
306
+ UserForm1.Controls("ans" & ansNo).Caption = Sheet1.Cells(rowNo, colNo)
307
+ ansFlag = ansFlag + 1
308
+
309
+ Sheet2.Range("A" & m).Value = Sheet1.Cells(rowNo, 1) '記録シートに問題番号を入力
310
+
311
+ '正答(Sheet1の3列目)がどのトグルボタンに設定されたかをCorrectAnsに記憶
312
+ If colNo = 3 Then
313
+ CorrectAns = ansNo
314
+ End If
315
+ colNo = colNo + 1
316
+ End If
317
+ Wend
318
+
319
+ end_flag = False
320
+ End Sub
321
+ ```
322
+