ざっくり説明
数字を渡すと丸囲み数字(丸付き数字/丸数字)にしてくれます。
ex.
ConvertToCircledNumber (15) → "⑮"
ConvertToCircledNumber (43) → "㊸"
コード
Function ConvertToCircledNumber(ByVal num As Long) As String
'================================
'用途 :数字の丸囲み数字への変換
'--------------------------------
'第一引数:数字 (Long型)
'戻り値 :丸囲み数字 (String型)
'================================
Dim circledNumber As String
Select Case num
Case 0
circledNumber = ChrW(&H24EA)
Case 1 To 20
circledNumber = ChrW(&H2460 + num - 1)
Case 21 To 35
circledNumber = ChrW(&H3251 + num - 21)
Case 36 To 50
circledNumber = ChrW(&H32B1 + num - 36)
Case Else
circledNumber = "(" & num & ")"
End Select
ConvertToCircledNumber = circledNumber
End Function
使用方法
第一引数に0以上の整数を渡す
仕様等
- 0~50については丸文字に変換します (ex. ㉔, ㉝, ㊼, ⓪)
- 51以上に関しては「(51)」のように括弧で囲み、代替としています
注意点
- ⓪と、㉑~㊿は、MsgBoxやローカルウィンドウで「?」表示となってしまいます
- 小数を渡すと四捨五入された値が処理されて返ってきます (※1 厳密には違う)
- マイナスの値を渡すと「(-3)」のような表記になります
→ 0以上の整数を渡すように呼び出し元で調整してください。 -
セルに入力されている括弧で囲まれた数字はマイナスの数値として扱われるので
マクロ実行前に入力対象セルの書式を文字列にしておく/
出力文字列の先頭にシングルクォーテーションを付ける、等の対処をお願いします
→ 後者ならElseで実行される部分を「circledNumber = "'(" & num & ")"」にするだけ
その他
小数を受け付けない/マイナスを処理しない、という仕様にできるけれど、
呼び出し元のサブルーチンなり関数なりが困っちゃうと思うのでやめました。
If文よりCase文の方が可読性が高いと思います
※1 小数の丸め処理について
エクセルVBAでは、マクロ内で小数をLong型に渡した場合は切り捨てられますが、
セルの値などを取得して渡した場合などに偶数丸め(銀行丸めとも)という処理が走ります。
偶数丸めとは基本的に四捨五入と似た動きをするのですが、
x.5 という値の場合は偶数側に丸められます。
例えば2.5を偶数丸めすると2となります。
x.5の場合でしか起きないため、2.500000001は3になります。
この動きは(VBAの)Round関数にも働きます。
1点面白いことがあり、エクセルにはワークシート関数とVBAの関数があり
丸め処理をするRound関数は各々動きが違います。
WorksheetFunction.Round(2.5, 0) → 3
Round(2.5, 0) → 2
という挙動です。
いつか「なんか想定の値と違う!」という事が起こりそうだなって感じてます。