自分でエクセルの関数を作ってみよう! 数字を丸数字に変換 ユーザー定義関数と「If」「Else」「ElseIf」「End If」構文 土日でマスター エクセルVBA講座④

エクセルではマクロを使って、エクセル標準で装備されていない関数を自分で作って利用することが可能です。自分でマクロを利用して作成する関数を「ユーザー定義関数」と呼んでいます。

今回は、1から50までの数字を丸数字に変更する「ユーザー定義関数」を作成してみます。

エクセルで丸数字を連番で ①から㊿まで連続入力する方法 「UNICODE関数」と「UNICHAR」関数と「IFS」関数で実現! 365・2019・2016・2013対応
エクセルの丸数字(①)などは、数値として扱われません。ですから、①をドラッグしても連番にすることはできません。そのためには、「UNICODE関数」と「UNIC...
スポンサーリンク

数字を丸数字に変更するユーザー定義関数

まずは、「Microsoft Visual Basic for Applications」(VBA)を開きます(キーボードのAlt+F11キーでも起動します)。

Visual Basic(Alt+F11)を開く

Visual Basicの画面で、「挿入」「標準モジュール」をクリックして、新しい「ユーザー定義関数」を記述していきます。

「挿入」「標準モジュール」

これで、「ユーザー定義関数」を記述する準備ができました。

Module編集画面
スポンサーリンク

まずは関数を記述してみよう

上記のような何もない状態で、「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番号を取得します。

「①」のUNICODE番号は「9312」

そして、「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」と「⑳」と「㉑」の間でコード番号が飛びます。

⑳と㉑でコード番号が連番ではなくなる

同様に、「㉟」と「㊱」の間も連番ではなくなります。

エクセルで丸数字を連番で ①から㊿まで連続入力する方法 「UNICODE関数」と「UNICHAR」関数と「IFS」関数で実現! 365・2019・2016・2013対応
エクセルの丸数字(①)などは、数値として扱われません。ですから、①をドラッグしても連番にすることはできません。そのためには、「UNICODE関数」と「UNIC...

そこで、条件分岐をするために「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を超える数字が引数として入力された場合にエラーコードを返す必要があります。

51以上はエラー表示に

そこで利用するのが「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

このように「ユーザー定義関数」をエクセルに登録しておくと、「関数の挿入」ダイアログボックスや、「関数の引数」ダイアログボックスで表示することが可能です。

「関数の挿入」ダイアログボックス
「関数の引数」ダイアログボックス

このように、エクセルに標準で搭載されていない関数も、工夫次第では簡単に作成することが可能です。

今回の記事で分かりにくい点がありましたらコメントいただけたらご回答いたします。

スポンサーリンク
エクセルVBA
スポンサーリンク
リーダーの独り言をフォローする
リーダーの独り言

コメント

タイトルとURLをコピーしました