質問編集履歴
1
修正したコードを追記。
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
|
+
|