15日目 素数を判定する関数を作ろう【30日間1日1本マクロ生活】
30日間1日1本マクロ生活、15日目です。
30日の半分、15日目までたどり着きました。頑張って続けることができています。
マクロを書く準備は、0日目に記事を書きました。
素数の判定
昨日は、2と3以外の素数はすべて6で割って1余る数か5余る数のどちらかだという話をしました。
さらに、自分自身の平方根よりも小さい全ての数で割り切れなければ、その数は素数だという話をしました。
Function
ここまで、マクロを書くときは「Sub」で始まって「End Sub」で終わるというお話をしていました。
今日のマクロはSubの代わりに「Function」で始まります。
「Sub」は書かれているマクロを書かれている通りに実行するタイプのマクロです。
「Function」は新しく関数を作るタイプのマクロです。
さっそくコードを
Function sosu(n)
If n <= 1 Then sosu = False: Exit Function
If n = 2 Or n = 3 Or n = 5 Then
ans = True
ElseIf n Mod 2 = 0 Or n Mod 3 = 0 Then
ans = False
Else
ans = True
k = 5
c = 2
l = n ^ 0.5
Do While k <= l
If n Mod k = 0 Then
ans = False
Exit Do
End If
k = k + c
c = 6 - c
Loop
End If
sosu = ans
End Function
解説します。
1行目の「Function sosu(n)」です。ここから「End Function」までの間に、新しい関数「sosu」の処理を書きます。
「(n)」は、この関数には1つの数を与えますよ、という意味です。
例えば「sosu(13)」で「13が素数なのか調べる」という意味になります。ここで13はnに代入された状態でマクロが進みます。
Exit Function
2行目、nが1以下の数だったら、素数ではありませんね。
そのときは、関数の返り値に「False」を返します。
Exit Functionは、この先のマクロを実行せずに終わるという意味です。
3行目、nが2か3か5ならば素数です。「True」を返します。
ElseIf
「Else」と「If」を合体させた「ElseIf」は便利ですよ。
通常ならば
If ○○ Then
Aの処理
Else
If ○○ Then
Bの処理
Else
If ○○ Then
Cの処理
Else
Dの処理
End If
End If
End If
と、「If」の数だけ「End If」が必要です。
でも、「ElseIf」を使うと
If ○○ Then
Aの処理
ElseIf ○○ Then
Bの処理
ElseIf ○○ Then
Cの処理
Else
Dの処理
End If
というように、End Ifが一つで済みます。
実行結果
「Sub」型のマクロであれば、マクロを記述するウィンドウの「Sub」と「End Sub」の間にカーソルを置いて、画面上方の再生ボタン的なアイコン(右向きの三角形)をクリックするか、[F5]キーを押して実行しますが、「Function」の場合は実際にワークシートにその関数を書くことができます。
Aの列に乱数で10000までの中から適当な数を並べてみました。
Bの列には「=sosu(A1)」と、通常の関数と同じように入力します。
結果です。素数の場合は「TRUE」、素数でない場合は「FALSE」が返されています。
このように、Excelのマクロでは自分でオリジナルの関数を作ることも可能です。
Excelは便利
悔しいですが、Excelは便利です。
Microsoftにお金を払うのは癪でしょうがないんですが、Excelばかりは仕方がない。
マクロを書くようになると、Excelからは離れられないですね。
30日間、頑張ります。