Excelが大好きだ!

Excel大好き経理マンがExcelの事を書き綴っていきます。


スポンサードリンク

丸数字ジェネレーター

仕事でこのような資料を作成することがある。

丸数字を使用して項目の関連性を表示するようにしている。
ただ丸数字を記入するのって案外めんどくさい。

そんな隙間需要を満たすことが出来るのもVBAの強み。
丸数字ジェネレーターを作成してみました。


完成品

まずはどのような機能なのかご紹介します。

丸数字ジェネレーター

指定した数値の範囲で丸数字を作成する機能です。
始まりの数値は1だけでなく任意の数値を指定することができます。
50までなのは丸数字が用意されているのが50までのため。

丸数字増減

指定した範囲の丸数字を増減させる機能です。
下記の例のように作成途中で要素を追加・削減した際に使用します。
下記の例の場合「④以上の丸数字に1加算」しています。
④以上を条件にしていますので、③は変換されていません

構成

当アドインは2つのユーザーフォームと1つのモジュールで構成されています。
ユーザーフォームはリボンから機能を呼び出す用です

モジュール内には5つのプロシージャから構成されています。 - kf丸数字作成 - kf丸数字増減 - 数値to丸数字 - 丸数字to数字 - 丸数字変換数字

ユーザーフォームとプロシージャの関連性は以下の通りです。

※上記CallTree画像は「踊るVBEアドイン」の機能で作成いたしました


ユーザーフォーム・プロシージャ

ufm_丸数字作成

このユーザーフォームは「kf丸数字作成」プロシージャへ渡す引数の設定と実行を担当しています。
記載されているコードも上記機能と入力ルールのチェックを行っているだけになります。

Option Explicit

Private Sub CommandButton1_Click()
    Dim z開始数 As Long
    Dim z終了数 As Long
    
    If IsNumeric(Me.TextBox1.Value) And IsNumeric(Me.TextBox2.Value) Then
        Dim var As Variant
        var = kf丸数字作成(Me.TextBox1.Value, Me.TextBox2.Value)
        ActiveCell.Resize(UBound(var), 1).Value = var
        
    Else
        MsgBox "テキストボックスには1~50の整数を入力してください", _
            vbCritical + vbOKOnly, "入力エラー"
    End If
End Sub


ufm_丸数字増減

このユーザーフォームも「kf丸数字増減」プロシージャへの引数の設定と実行のみの役割です。

Option Explicit

Private Sub CommandButton1_Click()
    If IsNumeric(Me.TextBox1.Value) And IsNumeric(Me.TextBox2.Value) Then
        Dim var As Variant
        var = kf丸数字増減(Selection, Me.TextBox1.Value, Me.TextBox2.Value)
        Selection.Value = var
    End If
End Sub


kf丸数字作成

こちらは丸数字を作成するためのメインプロシージャです。
Functionプロシージャとすることでマクロ内だけでなく、シート上からユーザー定義関数として呼び出すことができます。

Public Function kf丸数字作成(z開始数 As Long, z終了数 As Long) As Variant
    Dim z作成数 As Long
    z作成数 = z終了数 - z開始数 + 1

    Dim z丸数字配列 As Variant
    ReDim z丸数字配列(1 To z作成数, 1 To 1)

    Dim i As Long
    For i = 1 To z作成数
        z丸数字配列(i, 1) = 数値to丸数字(i + z開始数 - 1)
    Next
    kf丸数字作成 = z丸数字配列
End Function

こちらのプロシージャでは引数z開始数と引数z終了数から作成する丸数字の個数を判定し、その数の要素数を持つ配列を作成しています。

z開始数からz終了数までの数値範囲を順番にサブプロシージャ数値to丸数字へ渡しています。
数値to丸数字の結果をz丸数字配列に順番に格納していきます。

作成する配列「z丸数字配列」を2次元配列にしているのは、最終的にシートにそのまま貼り付けることを考慮しているためです。


数値to丸数字

こちらは引数に与えられた数値を丸数字に変換する関数です。

Private Function 数値to丸数字(z数値) As String
    Dim ans As String
    Select Case z数値
        Case 1 To 20
            ans = WorksheetFunction.Unichar(z数値 + 9311)
        Case 21 To 35
            ans = WorksheetFunction.Unichar(z数値 + 12860)
        Case 36 To 50
            ans = WorksheetFunction.Unichar(z数値 + 12941)
        Case Else
            ans = "<" & z数値 & ">"
    End Select

    数値to丸数字 = ans
End Function

丸数字は1~50まで用意されていますが、Unicodeは1~50までずっと繋がっておらず、3か所に分断されています。



UnicodeからUnicode文字列を作成するためにUNICHAR関数を利用します。
UNICHAR関数で指定するUnicodeIMEパッド上で表示される16進数を10進数に変換した値を指定すれば良いようです。

上記例では「①」のUnicodeは「UTF-16:0x2460」となっています。
この数値は16進数のため10進数に変換した値を算出します。

Excel関数を利用するのであればDECIMAL関数を利用することで10進数を求めることが可能です。

「16進数」の「2460」を10進数に変換すると9312になります。

9312をUNICHAR関数で変換すると①になります。

三分割されているそれぞれの数値、①・㉑・㊱のUnicodeを調べてSelect Case内で指定しています。

1~50以外の数値は丸数字に変換することができませんので「<>」付きの数値に変換しています。

作成した丸数字を関数の結果として返します。


kf丸数字増減

ufm_丸数字増減から呼び出される、丸数字を増減させるための関数です。
指定したセル範囲の丸数字を増減させます。
こちらもワークシート上からユーザー定義関数として呼び出すことができます。

'対象範囲: 指定したセル範囲の丸数字を増減させます
'z増減数:  指定した数値分、丸数字を増減させます
'z下限数:  指定した値以上の丸数字のみ増減させます
Public Function kf丸数字増減(対象範囲 As Range, z増減数 As Long, z下限数 As Long) As Variant
    Dim z変換後文字列 As Variant
    Dim z丸数字範囲 As Variant
    z丸数字範囲 = 対象範囲.Value
    ReDim z変換後文字列(1 To UBound(z丸数字範囲), 1 To 1)
    
    Dim myVal As Variant
    Dim z文字数 As Long
    Dim z判定文字 As String
    Dim z回答文字列 As String
    Dim i As Long
    Dim n As Long
    
    For Each myVal In z丸数字範囲
        n = n + 1
        z文字数 = Len(myVal)
        
        For i = 1 To z文字数
            z判定文字 = Mid(myVal, i, 1)
            If Not IsNumeric(z判定文字) Then
                z判定文字 = 丸数字to数字(z判定文字)

                If IsNumeric(z判定文字) Then
                    z判定文字 = 丸数字変換数字(z判定文字, z増減数, z下限数)
                    z判定文字 = 数値to丸数字(z判定文字)
                End If
            End If
            z回答文字列 = z回答文字列 & z判定文字
        Next
        z変換後文字列(n, 1) = z回答文字列
        z回答文字列 = ""   ' 回答文字列をクリアして次のセルの処理に備える
    Next
    kf丸数字増減 = z変換後文字列
End Function



プロシージャに与えられた引数の対象範囲の大きさの配列を用意します。
これは変換結果を蓄積するためです。

ReDim z変換後文字列(1 To UBound(z丸数字範囲), 1 To 1)


引数対象範囲で指定したセル範囲の一文字ずつ抽出して判定・処理を行っていきます

For i = 1 To z文字数
    z判定文字 = Mid(myVal, i, 1)


まず抽出した文字が数字かどうかを判定しています
数字であった場合に後続の処理に回すと丸数字のみ増減させたいのに、普通の数値まで増減の対象になってしまうため、対象から場外するために行っています。

If Not IsNumeric(z判定文字) Then


次にサブプロシージャ丸数字to数字に対象文字列を与えます。
このプロシージャは丸数字を一旦普通の数字に変換して返す機能です。
丸数値以外は処理をせず元の値を返します。

z判定文字 = 丸数字to数字(z判定文字)


返ってきた文字列が数値がどうかを判定します。
ここの判定で数値であった場合のみ後続の処理回します。

If IsNumeric(z判定文字) Then


数値をサブプロシージャ丸数字変換数字数値to丸数字で続けて処理を行います。
丸数字変換数字は与えられた数値を増減させます。
数値to丸数字は与えられた数値を丸数字に変換します。

z判定文字 = 丸数字変換数字(z判定文字, z増減数, z下限数)
z判定文字 = 数値to丸数字(z判定文字)


変換した文字列は順次結合し、変換後の1セル分の文字列を作成します

z回答文字列 = z回答文字列 & z判定文字


1セル分の文字列が完成した後、回答用の配列に順次保存します

z変換後文字列(n, 1) = z回答文字列


この配列を最終的にプロシージャの解として返します。


丸数字変換数字

与えられた数字を増減させます

Private Function 丸数字変換数字(z数値 As Variant, z移動数 As Long, z下限数 As Long) As Long
    Dim ans As String
    
    If z数値 >= z下限数 Then
        ans = z数値 + z移動数
    Else
        ans = z数値
    End If
    
    丸数字変換数字 = ans
End Function

引数z数値の値がz下限数以上の場合のみ処理を継続します。
z下限数未満の場合は処理をスキップしz数値の値をそのまま返します

If z数値 >= z下限数 Then

z数値の値にz移動数の値だけ増減させます

ans = z数値 + z移動数

まとめ

効率化の効果としてはさほど大きいものではないですが、作業のストレスが軽減されますし、こういうことアイデアを実現できるようになっていると、普段の作業で 効率化出来ないかな? という気づき精度の向上に繋がります。
自分の手の届く範囲内であれば誰に遠慮することなくマクロを作っていきましょう。