- ベストアンサー
マス計算問題を作るプログラムを教えてください
- VBAで簡単にマス計算問題を作ることができます。以下は重複の無い乱数発生のVBAサンプルです。
- 作成するマス計算問題は10×10の表で、数字は0から9まで使用します。乱数を用いて値を割り当てることで重複を避けます。
- VBAコードを実行することで、10×10のセルに乱数が割り当てられたマス計算問題が表示されます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> さしあたって必要なのが、6×10の60マスで、数字は0から9までです。そのあと、7×10の70マスと進んでいきたいです。その後は、10×5の50マスの引き算で、10から19の2けたから0から9のひとけたを引く表を作りたいと思っています。 No1-2 merlionXXです。 すべてに対応できるようにしてみました。 Sub 任意行10列表() Dim ans As Integer, i As Integer, r As Integer, c As Integer Dim e As String Dim myDic As Object Dim gyo, myAr ans = MsgBox("加算でいいですか?" _ & vbCr & "「はい」なら、1桁同士の加算" _ & vbCr & "「いいえ」なら、2桁から1桁の減算とします。)", vbYesNo + vbQuestion) If ans = vbYes Then e = "+" Else e = "-" End If gyo = InputBox("何行×10列 にしますか?") If gyo = "" Then Exit Sub If gyo * 1 > 10 Then MsgBox "行数超過です。", vbCritical Exit Sub End If Range("A1").CurrentRegion.ClearContents Set myDic = CreateObject("Scripting.Dictionary") Do Until myDic.Count = gyo * 1 i = Int((10 * Rnd) + 1) If Not myDic.Exists(i) Then myDic.Add Key:=i, Item:="" End If Loop Range("A2").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.Keys) myDic.RemoveAll Do Until myDic.Count = 10 i = Int((IIf(e = "+", 10, 90) * Rnd) + IIf(e = "+", 1, 10)) If Not myDic.Exists(i) Then myDic.Add Key:=i, Item:="" End If Loop Range("B1").Resize(, myDic.Count).Value = myDic.Keys ans = MsgBox("解答も表示しますか?", vbYesNo + vbQuestion) If ans = vbNo Then Exit Sub myAr = Range("A1").CurrentRegion.Value For r = 2 To UBound(myAr, 1) For c = 2 To UBound(myAr, 2) myAr(r, c) = Evaluate(myAr(1, c) & e & myAr(r, 1)) Next c Next r Range("A1").Resize(UBound(myAr, 1), UBound(myAr, 2)).Value = myAr Range("A1").Value = e Set myDic = Nothing End Sub
その他の回答 (2)
- merlionXX
- ベストアンサー率48% (1930/4007)
> 1行目と1列目にだけ数字をいれたいのです。 では一例です。 Sub test_6行10列() Set myDic = CreateObject("Scripting.Dictionary") 'Dictionaryオブジェクト Do Until myDic.Count = 6 '登録数が6になるまでループ(行のデータ) i = Int((10 * Rnd) + 1) '1~10までの整数で乱数発生 If Not myDic.Exists(i) Then '重複しなければ myDic.Add Key:=i, Item:="" '追加 End If Loop '繰り返し Range("A2").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.Keys) '転記 myDic.RemoveAll 'myDicをクリア Do Until myDic.Count = 10 '登録数が10になるまでループ(列のデータ) i = Int((10 * Rnd) + 1) '1~10までの整数で乱数発生 If Not myDic.Exists(i) Then '重複しなければ myDic.Add Key:=i, Item:="" '追加 End If Loop '繰り返し Range("B1").Resize(, myDic.Count).Value = myDic.Keys '転記 End Sub
- merlionXX
- ベストアンサー率48% (1930/4007)
百ます計算とは縦10×横10のますの左と上にそれぞれ0から9の数字をランダムに並べそれぞれ交差するところに指定された加法、減法、乗法、除法などの答えを記入する計算シートですよね? でもご提示のマクロは100個のセルに重複しない1~100までの整数を入れるもののようです。 ご要望はどちらなのでしょうか?(重複しない整数で満たすのか、それとも1行目と1列目にだけ数字をいれたいのか?)
補足
1行目と1列目にだけ数字をいれたい のです。 前の回答を応用し、中身を削除して使っています。