そろばん先生日誌

こだわりより新しいものを

昨日、ようやく作りたかった問題作成が終わりました。
なんでこんなに時間がかかったのかなぁと振り返ってみると、変なこだわりがあったんだろうと思うので、今回は自分への戒めも含めて書いていきます。

私が書いた作問のコード

とりあえず、誰にも教わらないで勝手に作問のコードを素人が書くとこうなりますっていうのを見せますね。あ、メチャメチャ長いのでお気を付けください。

Sub ichi()

Sheets(“見取り算自動生成3”).Select
Range(“C5”).Select
ActiveCell.FormulaR1C1 = “6”
Range(“C6”).Select
ActiveCell.FormulaR1C1 = “10”

Dim セル番号 As Integer

For セル番号 = 44 To 46

Sheets(“4-6”).Select
Do Until Range(“l3”).Value = 1
Calculate
DoEvents

Loop

Range(“j3:j12”).Select

Selection.Copy

Sheets(“み”).Select

Cells(43, セル番号).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Next セル番号

End Sub
Sub ni()

Sheets(“見取り算自動生成”).Select
Range(“C5”).Select
ActiveCell.FormulaR1C1 = “6”
Range(“C6”).Select
ActiveCell.FormulaR1C1 = “10”

Sheets(“4-6-“).Select
Do Until Range(“w3”).Value = 1
Calculate
DoEvents
Loop

Range(“u3:u12”).Select

Selection.Copy

Sheets(“み”).Select

Cells(43, 47).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

End Sub
Sub san()

Sheets(“見取り算自動生成3”).Select
Range(“C5”).Select
ActiveCell.FormulaR1C1 = “7”

Dim セル番号 As Integer

For セル番号 = 48 To 50

Sheets(“4-7”).Select
Calculate
Do Until Range(“l3”).Value = 1
Calculate
DoEvents
Loop

Range(“j3:j12”).Select

Selection.Copy

Sheets(“み”).Select

Cells(43, セル番号).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Next セル番号

End Sub
Sub yon()

Sheets(“見取り算自動生成”).Select
Range(“C5”).Select
ActiveCell.FormulaR1C1 = “7”

Sheets(“4-7-“).Select
Do Until Range(“w3”).Value = 1
Calculate
DoEvents
Loop

Range(“u3:u12”).Select

Selection.Copy

Sheets(“み”).Select

Cells(43, 51).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

End Sub
Sub gou()

Sheets(“見取り算自動生成3”).Select
Range(“C5”).Select
ActiveCell.FormulaR1C1 = “8”

Dim セル番号 As Integer

For セル番号 = 44 To 46

Sheets(“4-8”).Select

Calculate

Do Until Sheets(“4-8”).Range(“l3”).Value = 1
Calculate
DoEvents
Loop

Range(“j3:j12”).Select

Selection.Copy

Sheets(“み”).Select

Sheets(“み”).Cells(57, セル番号).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Next セル番号

End Sub
Sub roku()

Sheets(“見取り算自動生成”).Select
Range(“C5”).Select
ActiveCell.FormulaR1C1 = “8”

Sheets(“4-8-“).Select
Do Until Range(“w3”).Value = 1
Calculate
DoEvents
Loop

Range(“u3:u12”).Select

Selection.Copy

Sheets(“み”).Select

Cells(57, 47).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

End Sub
Sub nana()

Dim セル番号 As Integer

For セル番号 = 48 To 50

Sheets(“4-9”).Select
Calculate
Do Until Range(“n3”).Value = 1
Calculate
DoEvents
Loop

Range(“l3:l12”).Select

Selection.Copy

Sheets(“み”).Select

Cells(57, セル番号).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Next セル番号

End Sub
Sub hachi()

Sheets(“4-9-“).Select
Do Until Range(“v3”).Value = 1
Calculate
DoEvents
Loop

Range(“t3:t12”).Select

Selection.Copy

Sheets(“み”).Select

Cells(57, 51).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

End Sub
Sub kyu()

Dim セル番号 As Integer

For セル番号 = 44 To 46

Sheets(“見取り算自動生成3”).Select
Range(“C5”).Select
ActiveCell.FormulaR1C1 = “9”

Do Until Range(“c20”).Value = 1
Calculate
DoEvents
Loop

Range(“b8:b17”).Select

Selection.Copy

Sheets(“み”).Select

Cells(72, セル番号).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Next セル番号

End Sub
Sub jyu()

Sheets(“見取り算自動生成3”).Select
Range(“C5”).Select
ActiveCell.FormulaR1C1 = “9”

Do Until Range(“c20”).Value = 1
Calculate
DoEvents
Loop

Range(“b8:b17”).Select

Selection.Copy

Sheets(“9”).Select

Cells(3, 6).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Range(“k3:k12”).Select

Selection.Copy

Sheets(“み”).Select

Cells(72, 47).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

End Sub
Sub jyuichi()

Dim セル番号 As Integer

For セル番号 = 44 To 45

Sheets(“見取り算自動生成20”).Select
Range(“C5”).Select
ActiveCell.FormulaR1C1 = “4”

Do Until Range(“c30”).Value = 1
Calculate
Loop

Range(“b8:b15”).Select

Selection.Copy

Sheets(“み”).Select

Cells(12, セル番号).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Next セル番号

End Sub
Sub jyuni()

Sheets(“4”).Select

Do Until Range(“m3”).Value = 1
Calculate
Loop

Range(“k3:k10”).Select

Selection.Copy

Sheets(“み”).Select

Cells(12, 46).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

End Sub
Sub jyusan()

Dim セル番号 As Integer

For セル番号 = 47 To 48

Sheets(“見取り算自動生成20”).Select

Do Until Range(“c30”).Value = 1
Calculate
Loop

Range(“b8:b17”).Select

Selection.Copy

Sheets(“み”).Select

Cells(10, セル番号).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Next セル番号

End Sub
Sub jyuyon()

Sheets(“42”).Select

Do Until Range(“m3”).Value = 1
Calculate
Loop

Range(“k3:k12”).Select

Selection.Copy

Sheets(“み”).Select

Cells(10, 49).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

End Sub
Sub jyugo()

Dim セル番号 As Integer

For セル番号 = 50 To 51

Sheets(“見取り算自動生成20”).Select

Do Until Range(“c30”).Value = 1
Calculate
Loop

Range(“b8:b19”).Select

Selection.Copy

Sheets(“み”).Select

Cells(8, セル番号).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Next セル番号

End Sub
Sub jyuroku()

Dim セル番号 As Integer

For セル番号 = 52 To 53

Sheets(“43”).Select

Do Until Range(“m3”).Value = 1
Calculate
Loop

Range(“k3:k14”).Select

Selection.Copy

Sheets(“み”).Select

Cells(8, セル番号).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Next セル番号

End Sub
Sub jyunana()

Dim セル番号 As Integer

For セル番号 = 44 To 45

Sheets(“見取り算自動生成20”).Select
Range(“C5”).Select
ActiveCell.FormulaR1C1 = “5”

Do Until Range(“c30”).Value = 1
Calculate
Loop

Range(“b8:b14”).Select

Selection.Copy

Sheets(“み”).Select

Cells(31, セル番号).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Next セル番号

End Sub
Sub jyuhachi()

Sheets(“51”).Select

Do Until Range(“m3”).Value = 1
Calculate
Loop

Range(“k3:k9”).Select

Selection.Copy

Sheets(“み”).Select

Cells(31, 46).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

End Sub
Sub jyukyu()

Dim セル番号 As Integer

For セル番号 = 47 To 48

Sheets(“見取り算自動生成20”).Select

Do Until Range(“c30”).Value = 1
Calculate
Loop

Range(“b8:b17”).Select

Selection.Copy

Sheets(“み”).Select

Cells(28, セル番号).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Next セル番号

End Sub
Sub nijyu()

Sheets(“52”).Select

Do Until Range(“m3”).Value = 1
Calculate
Loop

Range(“k3:k12”).Select

Selection.Copy

Sheets(“み”).Select

Cells(28, 49).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

End Sub
Sub nijyuichi()

Dim セル番号 As Integer

For セル番号 = 50 To 51

Sheets(“見取り算自動生成20”).Select

Do Until Range(“c30”).Value = 1
Calculate
Loop

Range(“b8:b22”).Select

Selection.Copy

Sheets(“み”).Select

Cells(23, セル番号).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Next セル番号

End Sub
Sub nijyuni()

Dim セル番号 As Integer

For セル番号 = 52 To 53

Sheets(“53”).Select

Do Until Range(“m3”).Value = 1
Calculate
Loop

Range(“k3:k17”).Select

Selection.Copy

Sheets(“み”).Select

Cells(23, セル番号).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Next セル番号

End Sub
Sub mitori()

Call ichi
Call ni
Call san
Call yon
Call gou
Call roku
Call nana
Call hachi
Call kyu
Call jyu
Call jyuichi
Call jyuni
Call jyusan
Call jyuyon
Call jyugo
Call jyuroku
Call jyunana
Call jyuhachi
Call jyukyu
Call nijyu
Call nijyuichi
Call nijyuni

Sheets(“み”).Select
Range(“a1”).Select

End Sub

コードの説明

簡単にいうと、「みとり算の問題を作れ!」っていう文章です。
ただし、1番~3番はこんな感じで、4番はこんな感じね、という指示をしています。

そんでもって結論を言えば、うまく動かなかったということですね。
一応Geminiに「1番目のプログラムがうまくいかないんだけどどこが悪いの?」という形で1つ1つ検証していって、「ここで一旦再計算(Calculate)するといいよ」とか「ここはちょっと休憩してリセットさせてあげよう(DoEvents)」みたいなものを付け足しながらやっていくのですが、やっぱり期待通りの結果にならず修正を繰り返す、というようなことを延々と続けてきた訳です。

『そんなことしてないで、全部丸投げすればいいじゃないか』

そうなんですよ、そう。私だってやってみました。でもね、全く別物で返ってきます。完全に知らないコードで書かれてしまったら、次にその知識を活かして新しいものを生み出せないじゃないですか!

だから、『変わりすぎてて自分で修正するのが難しいので、原型を留めたまま最低限の修正を行ってください』という指令を出すわけです。でも結局うまくいかないし、元々のコードの書き方がエラーが出やすい仕組みだからだよって怒られたりもして、いやいやオレは原因を突き止めたいんだって返して延々と時間を溶かしていくのでした。

目的はなんだっけ?

空いた時間も休みの日もやるだけやってふと我に帰る。

『オレは何がしたいんだっけ』

そう、本来の目的はみとり算の問題を作るってこと。
全部丸投げして、その時に分からないコードやエラーの原因を探ればいいだけで、問題を完成させるのが最優先!

それでGeminiが書いてくれたコードが短いのなんの。(元データにくらべればね)

たとえば「20番目」のコードがコレ。

Sub nijyu()
WaitAndCopy “52”, “M3”, “K3:K12”, 28, 49
End Sub

はい素晴らしい。
だって元はコレですよ。

Sub nijyu()

Sheets(“52”).Select

Do Until Range(“m3”).Value = 1
Calculate
Loop

Range(“k3:k12”).Select

Selection.Copy

Sheets(“み”).Select

Cells(28, 49).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

End Sub

そんなに短くなるもんかね、とショックを受けます。

出来上がったコード

‘ — 全体を管理するメインのボタン —
Sub mitori()
On Error GoTo ErrorHandler ‘ エラーが起きたら最後へ飛ばす
Application.ScreenUpdating = False ‘ 画面更新停止(高速化・安定化)
Application.Calculation = xlCalculationAutomatic ‘ 自動計算モードに

‘ 各Subを順番に実行
Call ichi: Call ni: Call san: Call yon
Call gou: Call roku: Call nana: Call hachi
Call kyu: Call jyu: Call jyuichi: Call jyuni
Call jyusan: Call jyuyon: Call jyugo
Call jyuroku: Call jyunana: Call jyuhachi
Call jyukyu: Call nijyu: Call nijyuichi: Call nijyuni

Sheets(“み”).Select
Range(“a1”).Select
Application.ScreenUpdating = True
MsgBox “すべての作成が完了しました!”
Exit Sub

ErrorHandler:
Application.ScreenUpdating = True
MsgBox “エラーが発生しました。シート名や数式を確認してください。”
End Sub

‘ — 共通パーツ(これがあるからエラーが出なくなります) —
‘ 使い方:WaitAndCopy(計算するシート, 条件セル, コピー元範囲, 貼り付け先行, 貼り付け開始列, [終了列])
Private Sub WaitAndCopy(srcSheet As String, condCell As String, srcRange As String, targetRow As Long, startCol As Long, Optional endCol As Long = 0)
Dim wsSrc As Worksheet, wsMi As Worksheet
Dim c As Integer, timeout As Long

Set wsSrc = Sheets(srcSheet)
Set wsMi = Sheets(“み”)
If endCol = 0 Then endCol = startCol ‘ 1列だけの場合は開始列と同じにする

For c = startCol To endCol
timeout = 0
wsSrc.Calculate ‘ ループ前に一度計算

‘ 条件が1になるまでループ(1万回で強制終了する安全装置付き)
Do Until wsSrc.Range(condCell).Value = 1
Calculate
DoEvents
timeout = timeout + 1
If timeout > 10000 Then Exit For ‘ 1万回やってもダメなら次の列へ
Loop

‘ 転記処理(コピー&ペーストを使わず直接代入するのでエラーが出ない)
Dim rCount As Long: rCount = wsSrc.Range(srcRange).Rows.Count
wsMi.Cells(targetRow, c).Resize(rCount, 1).Value = wsSrc.Range(srcRange).Value
Next c
End Sub

‘ — 以下、各個別処理(中身をスッキリ整理) —

Sub ichi()
Sheets(“見取り算自動生成3”).Range(“C5:C6”).Value = Application.Transpose(Array(6, 10))
WaitAndCopy “4-6”, “L3”, “J3:J12”, 43, 44, 46
End Sub

Sub ni()
Sheets(“見取り算自動生成”).Range(“C5:C6”).Value = Application.Transpose(Array(6, 10))
WaitAndCopy “4-6-“, “W3”, “U3:U12”, 43, 47
End Sub

Sub san()
Sheets(“見取り算自動生成3”).Range(“C5”).Value = 7
WaitAndCopy “4-7”, “L3”, “J3:J12”, 43, 48, 50
End Sub

Sub yon()
Sheets(“見取り算自動生成”).Range(“C5”).Value = 7
WaitAndCopy “4-7-“, “W3”, “U3:U12”, 43, 51
End Sub

Sub gou()
Sheets(“見取り算自動生成3”).Range(“C5”).Value = 8
WaitAndCopy “4-8”, “L3”, “J3:J12”, 57, 44, 46
End Sub

Sub roku()
Sheets(“見取り算自動生成”).Range(“C5”).Value = 8
WaitAndCopy “4-8-“, “W3”, “U3:U12”, 57, 47
End Sub

Sub nana()
WaitAndCopy “4-9”, “N3”, “L3:L12”, 57, 48, 50
End Sub

Sub hachi()
WaitAndCopy “4-9-“, “V3”, “T3:T12”, 57, 51
End Sub

Sub kyu()
Sheets(“見取り算自動生成3”).Range(“C5”).Value = 9
WaitAndCopy “見取り算自動生成3”, “C20”, “B8:B17”, 72, 44, 46
End Sub

Sub jyu()
‘ jyuだけ特殊な動き(一度シート「9」を経由)
Sheets(“見取り算自動生成3”).Range(“C5”).Value = 9
Do Until Sheets(“見取り算自動生成3”).Range(“C20”).Value = 1: Calculate: DoEvents: Loop
Sheets(“9”).Range(“F3:F12”).Value = Sheets(“見取り算自動生成3”).Range(“B8:B17”).Value
Sheets(“み”).Cells(72, 47).Resize(10, 1).Value = Sheets(“9”).Range(“K3:K12”).Value
End Sub

Sub jyuichi()
Sheets(“見取り算自動生成20”).Range(“C5”).Value = 4
WaitAndCopy “見取り算自動生成20”, “C30”, “B8:B15”, 12, 44, 45
End Sub

Sub jyuni()
WaitAndCopy “4”, “M3”, “K3:K10”, 12, 46
End Sub

Sub jyusan()
WaitAndCopy “見取り算自動生成20”, “C30”, “B8:B17”, 10, 47, 48
End Sub

Sub jyuyon()
WaitAndCopy “42”, “M3”, “K3:K12”, 10, 49
End Sub

Sub jyugo()
WaitAndCopy “見取り算自動生成20”, “C30”, “B8:B19”, 8, 50, 51
End Sub

Sub jyuroku()
WaitAndCopy “43”, “M3”, “K3:K14”, 8, 52, 53
End Sub

Sub jyunana()
Sheets(“見取り算自動生成20”).Range(“C5”).Value = 5
WaitAndCopy “見取り算自動生成20”, “C30”, “B8:B14”, 31, 44, 45
End Sub

Sub jyuhachi()
WaitAndCopy “51”, “M3”, “K3:K9”, 31, 46
End Sub

Sub jyukyu()
WaitAndCopy “見取り算自動生成20”, “C30”, “B8:B17”, 28, 47, 48
End Sub

Sub nijyu()
WaitAndCopy “52”, “M3”, “K3:K12”, 28, 49
End Sub

Sub nijyuichi()
WaitAndCopy “見取り算自動生成20”, “C30”, “B8:B22”, 23, 50, 51
End Sub

Sub nijyuni()
WaitAndCopy “53”, “M3”, “K3:K17”, 23, 52, 53
End Sub

結論

だから結局は、AIが得意な事はAIに任せてしまえばいいんだってこと。

自分のスキルを上げることにこだわりすぎないこと。

目的を見失わないこと。

 

これでようやく1回分のみとり算の問題が完成しました。

えっ、こっからが長そうだって?

一応興味のある方に向けて情報共有しますが、1回分が出来れば10回分でも100回分でも簡単にできます。

わたしは「連続(ren)」というコードで一気に20回分作りましたが、これもGeminiに修正してもらいました。

Sub ren2()
Application.ScreenUpdating = False

‘ メッセージを出さずに実行
Call mitori(False)

Dim myCnt As Long
‘ コピー&ペーストも少しだけスッキリさせました
For myCnt = 90 To 1584 Step 83
Sheets(“み”).Range(“AR7:BA82”).Copy
Sheets(“み”).Cells(myCnt, 44).PasteSpecial Paste:=xlPasteValues

‘ 次の問題を「無言で」作成
Call mitori(False)
Next myCnt

Application.CutCopyMode = False
Application.ScreenUpdating = True

‘ 全部終わった後に、1回だけメッセージを出す
MsgBox “大量の問題作成がすべて完了しました!”
End Sub

これで完成です。

Application.ScreenUpdating = False ってやると画面がチカチカする(※数字が入力されたりシートが変わったりするのを高速でやってくれるので画面がバグっているようになる)のを回避してくれます。もう10年以上も前に宮城で講習会をしてくれた先生(一馬先生)に教えてもらったのが懐かしい。Geminiも「パソコンの負荷を減らして高速化できるからやっておけよ」と教えてくれました。

チャッピーはエクセルのコードを書くのが強いと聞いていましたが、Geminiに変えても全く問題ありませんでした。今話題のClaude Codeもこれから触ってみたいですね。

 

ということで、毎回試行錯誤。

今は生徒がどうやって能動的にそろばんに関われるか、ということを研究・考察しています。次から次とやりたいことが出てくるので大変ですが、楽しんでがんばっていきましょう!