エクセルではマクロを使って、エクセル標準で装備されていない関数を自分で作って利用することが可能です。自分でマクロを利用して作成する関数を「ユーザー定義関数」と呼んでいます。
今回は、1から50までの数字を丸数字に変更する「ユーザー定義関数」を作成してみます。
数字を丸数字に変更するユーザー定義関数
まずは、「Microsoft Visual Basic for Applications」(VBA)を開きます(キーボードのAlt+F11キーでも起動します)。
Visual Basicの画面で、「挿入」「標準モジュール」をクリックして、新しい「ユーザー定義関数」を記述していきます。
これで、「ユーザー定義関数」を記述する準備ができました。
まずは関数を記述してみよう
上記のような何もない状態で、「function circlenumber(数字 as Integer)」と記述し、Enterキーを押します。必要な部分は自動的に大文字になり、下記のようになります。
マクロは先頭に「Sub」と記述する必要がありましたが、「ユーザー定義関数」は先頭に「関数」を表す「Function」と宣言します。そして今回は「ユーザー定義関数」名である、「Circlenumber」と続けています。
また、「ユーザー定義関数」は「引数」が必要になります。今回は「数字」という引数を一つだけ利用しますので、()内に「数字 as Integer」を記述する必要があります。「Integer」とは整数を意味し、使用する引数が整数であることをVBAに宣言しているということになります。
そしてまずは下記のコードを入力します。
Function circlenumber(数字 As Integer) myNumber = 数字 myCode = myNumber + 9311 circlenumber = ChrW(myCode) End Function
変数の宣言「Function」の下の2行目、「myNumber」は自分で作成した引数です。関数「circlenumber」が受け取った引数「数字」を「myNumber」に受け渡しています。
そしてさらに「myCode = myNumber + 9311」で、丸数字のUNICODE番号を計算しています。例えば、「引数」の「数字」が「3」であれば「myCode」は「3+9311=9314」と「③」のUNICODE番号を取得します。
そして、「End Function」の直前の「circlenumber = ChrW(myCode)」は、取得したUNICODE番号から「ChrW」(エクセルの関数ではUNICHAR関数に相当)で文字に変換し、「ユーザー定義関数」である「circlenumber」に渡しています。
Function circlenumber(数字 As Integer) myNumber = 数字 myCode = myNumber + 9311 If myCode > 9331 Then myCode = myCode + 3549 End If circlenumber = ChrW(myCode) End Function
これで①~⑳に変換する「ユーザー定義関数」は一旦完成しました。
㉑以上と㊱以上の数字への対応が必要 「If」「Then」「End If」構文
実は、「⑳」の文字コードが「9331」、「㉑」のコードが「12881」と「⑳」と「㉑」の間でコード番号が飛びます。
同様に、「㉟」と「㊱」の間も連番ではなくなります。
そこで、条件分岐をするために「If」「Then」「End If」構文が必要になります。
下記のコードをご覧ください。
Function circlenumber(数字 As Integer) myNumber = 数字 myCode = myNumber + 9311 If myCode > 9331 Then myCode = myCode + 3549 End If If myCode > 12895 Then myCode = myCode + 81 End If circlenumber = ChrW(myCode) End Function
上記のコードでは、2つの条件分岐をしています。「もしmyCodeが9931を超えるなら、㉑以上になるのでコード番号をコードの差-1をプラス」、また「もしmyCodeが12895を超えるなら、㊱以上になるのでコード番号にコードの差-1をプラス」しています。
さらに条件分け 「Else」「ElseIf」構文
今回の「ユーザー定義関数」は50以上になると丸数字が対応しません。ですから、50を超える数字が引数として入力された場合にエラーコードを返す必要があります。
そこで利用するのが「Else」構文です。
Function circlenumber(数字 As Integer) myNumber = 数字 myCode = myNumber + 9311 If myCode > 9331 Then myCode = myCode + 3549 End If If myCode > 12895 Then myCode = myCode + 81 End If If myCode > 12991 Then circlenumber = CVErr(xlErrValue) Else circlenumber = ChrW(myCode) End If End Function
上記の例では、「もしコード番号が1291を超えるならばエラー表示を、そうでないなら通常通りに丸数字を返す」という構文になっています。
今回は利用しませんが、「ElseIf」構文もあります。下記のようなコードになります。
If Aならば Then 一つ目の処理 ElseIf Bならば Then 二つ目の処理 Elseif Cならば Then 三つ目の処理 ・ ・ ・ End If
また、「CVErr(xlErrValue)」の部分は、エラーを返す構文です。
「CVErr(定数)」で表示できます。「定数」は下記のようになります。よく見るエクセルのエラーですよね。今回は「VALUE!」を表示させるように設定しています。
定数 | 表示されるエラーメッセージ |
xlErrDiv0 | #DIV/0! |
XlErrNA | #N/A |
xlErrName | #NAME? |
XlErrNull | #NULL! |
XlErrNum | #NUM! |
XlErrRef | #REF! |
XlErrValue | #VALUE! |
以上で今回の数字を丸数字に変換する「ユーザー定義関数」、「circlenumber」は完成です。
順位を表す際にも便利な丸数字に変更する関数です。
コードをコピペするだけで利用できますので、ぜひご利用ください。
もしご利用いただき、便利だと感じられたらコメントいただけると嬉しいです。
「ユーザー定義関数」をエクセルに登録するマクロ
最後に、なくても大丈夫なのですが、自分で作成した「ユーザー定義関数」をエクセルに登録するマクロの紹介です。コピペで利用できますが、変更しなければならない部分には赤アンダーラインを引いておきます。
Sub Registercirclennumber() Application.MacroOptions Macro:="circlenumber", _ Description:="1~50まで の数字を丸数字に変換する関数です。", _ Category:="文字列操作", _ ArgumentDescriptions:=Array("1~50の整数", "引数 2 : 文字列"), _ HelpFile:="http://www.microsoft.com/help/helpPage.html" End Sub
このように「ユーザー定義関数」をエクセルに登録しておくと、「関数の挿入」ダイアログボックスや、「関数の引数」ダイアログボックスで表示することが可能です。
このように、エクセルに標準で搭載されていない関数も、工夫次第では簡単に作成することが可能です。
今回の記事で分かりにくい点がありましたらコメントいただけたらご回答いたします。
追記:自分で作成した関数を、どのエクセルファイルでも利用できる方法を下記の記事で紹介しています。
コメント