マス計算問題を作るプログラムを教えてください

このQ&Aのポイント
  • VBAで簡単にマス計算問題を作ることができます。以下は重複の無い乱数発生のVBAサンプルです。
  • 作成するマス計算問題は10×10の表で、数字は0から9まで使用します。乱数を用いて値を割り当てることで重複を避けます。
  • VBAコードを実行することで、10×10のセルに乱数が割り当てられたマス計算問題が表示されます。
回答を見る
  • ベストアンサー

マス計算問題を作るプログラムを教えてください。

100ます計算を作るマクロとしての次の回答がありました。 10×5で、一桁の整数だけをつかうなど、アレンジ方法を教えてください。 さしあたって必要なのが、6×10の60マスで、数字は0から9までです。そのあと、7×10の70マスと進んでいきたいです。その後は、10×5の50マスの引き算で、10から19の2けたから0から9のひとけたを引く表を作りたいと思っています。 よろしくお願いします。 以下が、以前の回答です。 VBAでやるのが簡単です。以下は重複の無い乱数発生のVBAサンプルです。 【手順】 1. [Alt]+[F11]で Visual Basic Editor(以下VBE)起動 2. [挿入]-[標準モジュール]クリック 3. 下記VBAコードをコピー&ペースト 4. VBEを閉じる 5. [ツール]-[マクロ]-[マクロ]で実行 【VBAコード】(次行から終わりまで) '10×10の重複しない乱数表 Sub Sample()   Dim NumberBuf%(1 To 10, 1 To 10)   Dim intNum%, i%, j%, ItemNum%   Dim tmpBuf   Dim Dic As Object   'Dictionaryオブジェクト生成   Set Dic = CreateObject("Scripting.Dictionary")   'Dictionaryの登録数が100になるまでループ   Do Until Dic.Count = 100     '1~100までの整数で乱数発生     intNum = Int((100 * Rnd) + 1)     'Dictionaryに登録されているか?     If Not Dic.Exists(intNum) Then       '登録されていなければ追加       Dic.Add Key:=intNum, Item:=Empty     End If   Loop   tmpBuf = Dic.Keys   '乱数を10×10の配列に代入   ItemNum = 0   For i = 1 To 10     For j = 1 To 10        NumberBuf(i, j) = tmpBuf(ItemNum)        ItemNum = ItemNum + 1     Next j   Next i   '転記先を変えるにはRange("A1")のA1の部分を変更   '10×10のセル範囲左上角のセルになります   Range("A1").Resize(10, 10).Value = NumberBuf End Sub 以上、引用終わり。

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.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)
回答No.2

> 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)
回答No.1

百ます計算とは縦10×横10のますの左と上にそれぞれ0から9の数字をランダムに並べそれぞれ交差するところに指定された加法、減法、乗法、除法などの答えを記入する計算シートですよね? でもご提示のマクロは100個のセルに重複しない1~100までの整数を入れるもののようです。 ご要望はどちらなのでしょうか?(重複しない整数で満たすのか、それとも1行目と1列目にだけ数字をいれたいのか?)

tarokawa20
質問者

補足

1行目と1列目にだけ数字をいれたい のです。 前の回答を応用し、中身を削除して使っています。

関連するQ&A

  • 文字制限方法。

    どなたか知識ある方、教えてください。 ソートプログラムの演習をしているんですが、 どのように書いていいか悩んでます。現在の課題はtextが10個あり、sortボタンをクリックすると左から数字を小さい順に並びます、数字のみ入力可、空白でもエラーなしで(全て空白はエラー)とりあえず数字があれば10個埋めていなくても並べる、文字等はエラーを出したいです。 '配列のインデックス番号の開始に1を設定 Option Base 1 Option Explicit Private Sub cmdCLEAR_Click() '変数の宣言 Dim ans As Integer Dim i As Integer '消去する際の確認事項 ans = MsgBox("消去していいですか?", vbYesNo + vbQuestion) Select Case ans Case vbYes For i = 1 To 10 Step 1 Text(i).Text = "" Next i Case vbNo MsgBox "取り消します", vbInformation End Select End Sub Private Sub cmdSORT_Click() '変数の宣言 Dim intNum(10) As Integer Dim S As Integer Dim j As Integer Dim k As Integer Dim i As Integer '配列の整理 For i = 1 To 10 Step 1 intNum(i) = Int(Text(i).Text) Next i 'バブルソート For k = 1 To 9 Step 1 For j = 1 To 9 Step 1 If intNum(j) > intNum(j + 1) Then S = intNum(j) intNum(j) = intNum(j + 1) intNum(j + 1) = S End If Next j Next k '結果を返して表記する For i = 1 To 10 Step 1 Text(i).Text = intNum(i) Next i End Sub 現在書いたのはここまででどうしてもエラーと文字制限の方法はわからないので教えていただける方、宜しくお願いします。

  • VBA 複数のシートをまたいでの連想配列

    win7、Excelは2013を使用しています。 添付画像の様に、12シートの合計を連想配列に格納しsheet13に書き出したいのですが、プロシージャーの下から6行目のところで、エラーコード451が出ます。 どの様に変更すれば良いか教えて下さい。 Sub 年間集計() Dim Dic Dim i As Integer Dim j As Integer Dim sh As Worksheet Dim rng As Range Dim buf As String Dim num As Integer Set Dic = CreateObject("Scripting.Dictionary") For Each sh In Worksheets For Each rng In sh.Range("J2", sh.Cells(Rows.Count, 10).End(xlUp)) buf = rng.Value num = rng.Offset(, 1).Value If Not Dic.Exists(buf) Then Dic.Add buf, num Else Dic.Item(buf) = Dic.Item(buf) + num End If Next rng Next sh j = 2 With Worksheets("Sheet13") For i = 0 To Dic.Count - 1 .Cells(j, 1) = Dic.Keys(i)   ’エラー箇所 .Cells(j, 2) = Dic.Items(i) j = j + 1 Next i End With End Sub

  • VBスクリプトで未知の文字列を集計したい場合

    以下にプログラムの例と実行結果表示を記します。 2行目 " " 内に決まった(すでにわかっている)文字列を手入力するのではなく、 未知の文字列を区切り文字列で代入したい場合、どのようにすればよいのでしょうか? 例えば、ある図面から抽出した幾つかの文字列を" "内に入れたい場合。 無理である場合、他に手段があればご教示ください。 -------------------------------------------------------------------------------- Dim srcText srcText = "N41 N41 N41 N41 N41 N43 N43 N43 N45 F03" 'Scripting.Dictionaryで集計 Dim srcTextArray Dim dic Dim result Dim i Dim ky srcTextArray = Split(srcText, " ") Set dic = CreateObject("Scripting.Dictionary") For i = 0 To UBound(srcTextArray) If Not dic.Exists(srcTextArray(i)) Then dic.Add srcTextArray(i), 1 Else dic.item(srcTextArray(i)) = dic.item(srcTextArray(i)) + 1 End If Next For Each ky In dic.Keys result = result & ky & " " & dic.item(ky) & vbCrLf Next MsgBox result '結果表示 ------------------------------------------------------------------------------ 以下、実行結果表示 N41 5 N43 3 N45 1 F03 1

  • EXCEL「Dictionaryオブジェクト」宣言

    EXCEL VBAにて Dictionaryオブジェクトを利用しようと思い ネット検索して調べていると・・・ 1)Dim MyDic As Object Set MyDic=CreateObject("Scripting.Dictionary") 2) Dim MyDic As Scripting.Dictionary Set MyDic = New Scripting.Dictionary 3) Dim MyDic Set MyDic=CreateObject("Scripting.Dictionary") 4) Dim myDic As New Scripting.Dictionary 上記の4パターンが出てきました。 いずれも「連想配列」を使うものなのですが、 オブジェクト型、バリアント型、Newキーワードで宣言・・・ 4つの違いがイマイチ理解できません。 違いを教えてください。

  • VBAでこのプログラムの作り方

    最近VBAを勉強し始めた初心者です。 Excel上でコマンンドボタン1つで D18~H18からD22~H22の5×5の25マス(Aシート) と M18~Q18からM22~Q22の5×5の25マス(Bシート) それぞれに1~75の乱数を同時に発生させ一定時間、数字を回転させたあと数字を表示させたいのですがどのようなプログラムを組めばよろしいですか? ただしAシート内での数字の重複、Bシート内での数字の重複は起きないものです。 AシートとBシートの数字の重複はOKです。 数字はAシート25マス、Bシート25マス全て同時に回転させたいです。 乱数を回転させ数字を表示させるプログラムは For = i = 0 To 100  Range("○○").Value = Int(Rnd * 75) + 1 Next i です。 よろしくお願いします。

  • Excel マクロ:変数を複数使う場合

    マクロ初心者です。 For文で、変数を2つ定義し、それぞれが1つずつ増えてくれるような マクロを組みたいのですが、うまくいきません。 例えばA列の並んだ数字を、B列に一個とばしで入力するとして・・・ 例) Dim i As Integer Dim j As Integer For j = 2 To 10 Step 2 For i = 1 To 9 Cells(j, 2).Value = Cells(i, 1).Value Next i, j ではだめですよね。iが1つ増える時に、jも1つ増える、 というようにVBAを組むことが可能なのでしょうか? ど素人な質問ですみませんが、教えてください。

  • 重複データの集約を繰り返す方法について

    エクセルのVBAで質問です。 複数シートのB行に重複したデータがあります。 (複数シートともデータ数は違いますが同じデータがあります) この重複したーデータを集約しA行に横に出力する為下記のマクロを組みました。 '集約する Dim Dic, i As Long, buf As String, Keys Set Dic = CreateObject("Scripting.Dictionary") On Error Resume Next Do Until Cells(i, 2).Value = "" buf = Cells(i, 3).Value Dic.Add buf, buf i = i + 1 Loop '出力 Keys = Dic.Keys For i = 0 To Dic.Count - 1 Cells(1, i + 5) = Keys(i) Next i Set Dic = Nothing これで集約はできたのですが、他のシートも連続して同じ集約作業をさせたいと思っています。 しかし、くり返し作業をさせると1枚目のシートは集約できますが2枚目以降のシートが同じように集約できません。 適切なくり返しができる構文をご教示いただきたくお願い致します。

  • PHPのようにスマートに配列の配列など記述する方法が

    PHPの場合、データ構造ですが以下のようになっています。 $a = array( "test1" => array( array(1,1), array("x", 2) ), "test2" => array( array(3,2), array("y", 1) ), ); これをエクセルVBAの場合、Scripting.Dictionaryを使えば連想配列が 可能ですが、PHPのようにスマートに配列の配列など記述する方法が わかりません。 Dim dic As Scripting.Dictionary set dic = New Scripting.dictionary dic.Add "test1", ???????????????? dic.Add "test2", ???????????????? スマートにデータ構造を実現できる方法が知りたいです。

  • エクセルVBAプログラム質問 リストボックス応用

    エクセルVBAプログラムについて質問です。 リストボックスから結果をリストボックスに表示させる リストボックスを応用した内容です。 (1)今回追加したいのは、チェックボックスにチェックすることで、 期限が今月中に切れるもののみをリストボックスに表示させたいです。 (2)期限更新ボタンを押したら、3カ月プラスして延長させたいです。 期限更新したら、リストボックスの中身も更新したいです。 例(1):今日の日付 2018/9/23だとしたら、期限切れる(9月分すべて)を表示させたい。 例(2):期限(変更前)『2018/9/23』から期限(変更後)『2018/12/23』に変更 下記のプログラムで追加していきたいです。 Dim myData Private Sub UserForm_Initialize() Dim Dic, Keys, buf As String, i As Long Me.ComboBox1.Style = fmStyleDropDownList Me.ListBox1.ColumnCount = 4 Me.ListBox1.ListStyle = fmListStyleOption Me.ListBox1.MultiSelect = fmMultiSelectMulti Me.CommandButton1.Caption = "印刷" Me.CommandButton1.Enabled = False With Worksheets("DATA") myData = .Range("A1:E" & .Cells(.Rows.Count, 1).End(xlUp).Row) End With Set Dic = CreateObject("Scripting.Dictionary") On Error Resume Next For i = 2 To UBound(myData, 1) buf = myData(i, 1) Dic.Add buf, buf Next i Keys = Dic.Keys For i = 0 To Dic.Count - 1 Me.ComboBox1.AddItem Keys(i) Next i Set Dic = Nothing End Sub Private Sub ComboBox1_Change() Dim i As Long, j As Integer With Me.ListBox1 .Clear For i = 2 To UBound(myData, 1) If Me.ComboBox1.Value = myData(i, 1) Then .AddItem "" For j = 2 To 5 .List(.ListCount - 1, j - 2) = myData(i, j) Next j End If Next i End With End Sub Private Sub ListBox1_Change() Dim i As Long, cnt As Long With Me.ListBox1 For i = 0 To .ListCount - 1 If .Selected(i) Then cnt = cnt + 1 End If Next i End With Me.CommandButton1.Enabled = (1 <= cnt And cnt <= 2) End Sub Private Sub CommandButton1_Click() Dim ws As Worksheet, i As Long, j As Integer, cnt As Byte Set ws = Worksheets("印刷") ws.PageSetup.PrintArea = "$I$2:$P$5" ws.Range("J2:L5,N2:P5").ClearContents With Me.ListBox1 For i = 0 To .ListCount - 1 If .Selected(i) Then ws.Range("J2").Offset(0, cnt).Value = Me.ComboBox1.Value For j = 0 To 2 ws.Range("J5").Offset(j * -1, cnt).Value = .List(i, j) Next j cnt = cnt + 2 End If Next i End With Unload Me ws.PrintPreview End Sub

  • Excel VBAにて2の100乗を計算するには

    プログラミングの勉強でVBAを学んでいるものです 以下の様な問題を出されました 2の100乗の値を計算する。この値はLong型で表せる最大の値をはるかに超すので、十分な大きさのInteger型の配列を用意し、その各要素で各けたの値を表す。値を2倍するサブプロシージャ「二倍」を書いてプログラムを完成させ、値を計算せよ。 Option Explicit Sub 二の百乗() Const n As Integer = 200 Dim s(n) As Integer Dim i As Integer, j As Integer s(1) = 1 For i = 2 To UBound(s) 'UBoundは配列の最大の添え字を返す関数 s(i) = 0 Next i For i = 1 To 100 二倍 s Next i For i = UBound(s) To 1 Step -1 If s(i) <> 0 Then Exit For Next i For j = 1 To i Cells(1, j).Value = s(i - j + 1) Next j End Sub セル一つに計算結果を表示させられないことはよく分かるのですが、そのための2の掛け算を全く思いつきません 二倍のサブプロシージャをどのようにすればいいのでしょうか

専門家に質問してみよう