スポンサーリンク
プログラムをちょっと勉強すれば、ある数が素数かどうか判定するプログラムとかいうのくらいは、割と早い段階で書けるようになる。
まあ、素数かどうかを判定するというだけではつまらないので、入力された整数の約数を書き出すというマクロを、戯れにExcel VBAで書いてみた。
なるべくスマートに、無駄のないコードにしたつもり。
仕様としては
- 3以上の正の整数について、チェックする。
- チェックの結果、素数だったら、素数である旨のメッセージを出す。
- 素数でなかったら、その数の約数を一覧にし、何と何を掛け合わせるパターンがあるか書き出す。
といったもの。言葉で説明してもしょうがないので、動画とソースコードを示す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
Option Explicit Sub outputMultiplication() '入力された自然数の約数を求める 'Application.InputBoxのType '0:数式 '1:数値 '2:文字列 '8:セル参照 Dim var As Variant var = Application.InputBox("約数を求めたい正の整数(2以上)を何か入力して下さい。", Title:="整数を入力", Type:=1) '数値形式(Type:=1)のInputBoxでは、キャンセルが押されたときも「0」が入力されたときも '数字的には0が返される。 'ただしキャンセルが押されたときは、正確に言うとBoolean型の「False」値というものが返される。 'それを元に、0が入力されたのとキャンセルとを判別する。 If VarType(var) = vbBoolean Then Exit Sub Dim msg As String Select Case var Case Is < 2 msg = "2以上の正の整数を入力して下さい。" Case 2, 3 msg = var & "は素数です。" Case Else If Int(var) <> var Then msg = "2以上の正の整数を入力して下さい。" End Select If msg <> "" Then MsgBox msg, vbExclamation, "処理中断" Exit Sub End If Application.ScreenUpdating = False '描画省略 Dim i As Long Dim s As Long 'ループの増分 'var Mod 2 = 0 → 偶数なので増分1ずつ。ループ開始値2 'var Mod 2 = 1 → 奇数なので増分2ずつ。ループ開始値3 s = (var Mod 2) + 1 Dim arr As Variant Dim r As Long ReDim arr(1 To 2, 1 To 1) 'iは最大で、varの平方根までループ For i = (s + 1) To Sqr(var) Step s If var Mod i = 0 Then '割り切れるなら r = r + 1 ReDim Preserve arr(1 To 2, 1 To r) arr(1, r) = i arr(2, r) = var / i Else End If Next i If r = 0 Then '最後までrが増えなかったなら MsgBox var & "は素数です。", vbInformation, "素数" Exit Sub End If Workbooks.Add With ActiveSheet .Cells(1, 1).Resize(r, 2).Value = WorksheetFunction.Transpose(arr) .Cells(1, 3).Resize(r, 1).FormulaR1C1 = "=RC[-2]*RC[-1]" End With End Sub |
お遊び程度のマクロなのであまり解説はしないけど、ソースコードで使われてるInputBoxというやつについては、こちらを参照。
スポンサーリンク