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日間、頑張ります。