- ベストアンサー
Excel VBA 足し算の問題を自動生成したい
子供のために、「1+2」のような単純な足し算の問題をひたすら大量生成したいのですが、どう組むのが一番良いでしょうか。 A B C D 1 乱数 + 乱数 = 2 乱数 + 乱数 = 3 乱数 + 乱数 = 私の頭で考える限りは、こんな感じのものを何行にも渡り繰り返させれば良いのかなあとぼんやり考えているのですが、乱数を使うプログラムが私にはなかなか難しく、うまくできません。 それと・・・ ・「まったく同じ問題が二行続けて出る」事だけは避けたいのですが、 その他の重複はまったく構わないという場合はどう組めば良いでしょうか。 ・「1桁+1桁」「2桁+1桁(と、2桁+1桁)」「2桁+2桁」それぞれのシートを1枚ずつつくりたいのですが、生成される数字の桁を指定する事はできるのでしょうか。 わからない事だらけで申し訳ないのですが、教えていただけると幸いです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Dictionaryを使ってみました。1+2と2+1は同じとしてますので、出ないようにしました。工夫の余地はあるでしょうが、まず使用してみてください。 Sub xxx() Dim s1 As Integer, s2 As Integer Dim c As Integer, n As Integer Dim f1 As Integer, f2 As Integer Cells.ClearContents Set dic = CreateObject("Scripting.Dictionary") n = InputBox("何問作りますか?") t1 = InputBox("1桁×1桁は1 2桁×1桁は2 2桁×2桁は3") c = 1 Do Until c > n z1: Select Case t1 Case 1 f1 = Rnd() * 8 + 1 f2 = Rnd() * 8 + 1 Case 2 f1 = Rnd() * 90 + 9 f2 = Rnd() * 8 + 1 Case 3 f1 = Rnd() * 90 + 9 f2 = Rnd() * 90 + 9 End Select s3 = f1 & "+" & f2 & "=" s4 = f2 & "+" & f1 & "=" If dic.Exists(s3) = True Or dic.Exists(s4) = True Then GoTo z1 dic.Add s3, s3 Cells(c, 1).Value = s3 c = c + 1 Loop Set dic = Nothing End Sub
その他の回答 (3)
- nac03056
- ベストアンサー率48% (203/419)
すでに答えが出ているようなので、蛇足としてVBAなしで出来ないかと考えてみました。役に立つかどうかわかりませんが、一応仕様は満たしていますのでご笑覧ください。^^ A列 B列 C列 =rand() 1 1 =rand() 1 2 =rand() 1 3 =rand() 1 4 =rand() 1 5 (省略) =rand() 9 7 =rand() 9 8 =rand() 9 9 という問題文のためのテーブルを作り、A列でソートをかけます。するとランダムに数字が並びますので上から10問を問題分として引っ張ってくれば当然同じ問題が出ることもなく完成です。もちろんソートの度に問題も変わります。 E列 F列 G列 H列 =B1 '+ =C1 '= (以下あと9問分下へ複写) もちろん2桁対応も長くなりますができますし、10+3のような問題は簡単過ぎるから入れたくないというならこのテーブルから消せばいいだけです。また繰り上がりが苦手というならそういう数字だけ残せば、苦手問題の特訓も可能です。 かなり力技っぽい感じもありますが一応動作はしています。
- tarinko_06
- ベストアンサー率24% (15/62)
>・「まったく同じ問題が二行続けて出る」事だけは避けたいのですが、 >その他の重複はまったく構わないという場合はどう組めば良いでしょうか。 乱数で作ったひとつ前の問題の値を変数で持って判定してあげればいいだけ。 >・「1桁+1桁」「2桁+1桁(と、2桁+1桁)」「2桁+2桁」それぞれのシートを1枚ずつつくりたいのですが、生成される数字の桁を指定する事はできるのでしょうか。 1の位、10の位をそれぞれ乱数で作るか、桁数チェックしてその桁になる様修正してあげればいいです。 あと、前乱数使ってた事あるんですがやりすぎると似通った結果になった気がするんで、何かしら工夫しないと駄目かもしれません。
- imogasi
- ベストアンサー率27% (4737/17069)
質問振りから、VBA、関数の初心者と思うが、この問題をこなすだけの勉強をしてないと思われる。 現在では、質問者の身に過ぎた問題でしょう。 全面的に、1から10まで回答者がコードを書いてくれという形に結果的になる。 このコーナーは質問者の下請けをするものではない。 乱数なども、乱数であって、重複しないことを保証するものでは全く無い。 ーーーー 当面はエクセルで人間が操作を行って、作ってこなすのはどうかな。 2項演算なら ・1桁数の演算の場合 A列、B列で0-9までをエクセルの連続データで作成。 (A列は被加数、むしろB列は演算子、加数などをC列が良いかも) ・2桁数の演算の場合 A列、B列で10-99までをエクセルの連続データで作成。 ・3桁以上も同じ 3桁ぐらいなら選択したければ、ここで連番振って 乱数に当たる連番の行を抜き出すとか。VLOOUP関数などで。 演算子は約4種類自由に変えられるでしょう。 被加数、加数の順序が小ー>大になっていかにも機械作成というカタチに見えるので、乱数を振って乱数で並べ直す。 ーー もし乱数で同数が出てきたら、人間が適当に修正する覚悟で、自動化に拘って、難しくして、時間をいたずらにかけないように。 このコーナーへの質問などもそうだ。回答までに時間がかかる。 ーー 乱数はエクセル関数ではRAND、RANBETWEENで、関数の本か、WEBを調べれば、解説が腐るほど沢山出るでしょう。 そこまで踏み込んでから質問してください。
お礼
ありがとうございます。 まず、投稿してみたら質問文の字間が、意図と違ってしまって、わかりづらくなってしまったのをお詫びいたします。 おっしゃる通り、 A列 数字 B列 演算子 C列 数字 の配置にしたら良いのではないか、という内容の事を質問文には書いてありました。 私はおっしゃる通りの初心者でございます。 不勉強はそうなのですが、全面的にコードを書いてくれというつもりはなく、No.3様のように、断片的な情報でいっこうにありがたいのです。 もちろん自力で調べてはみたのですが、どう情報を拾って良いかわからない状態でしたので、ここでお返事をいただければ、もう少し詳しく調べる糸口がつかめるかと思いました。直接の答えでなくとも、わかりやすい解説サイトなどを示してくださったりでも良いのです。 手動でという案ですね。 確かにVBAをつくった方がコストがかかる場合もあると思います。 勉強にと思っても、今の私にはステップが違うという事なのかも知れませんが、もうしばらく調べてみたいと思います。
お礼
皆様大変ありがとうございます。 質問をしてからまったく時間がとれなくなってしまい、不本意ながら今日まで見られませんでした。 まだゆっくり読めていないのですが、立ててからかなり時間が経ってしまいましたので、ご迷惑を避けるためとりあえず締め切らせていただきます。 VBAを実際に書いてくださった方、VBAなしで行った方がこの際良いのではないかという方、両方いらっしゃいましたが、とてもよくわかりました。参考にさせていただきます。