仕事でこのような資料を作成することがある。
丸数字を使用して項目の関連性を表示するようにしている。
ただ丸数字を記入するのって案外めんどくさい。
そんな隙間需要を満たすことが出来るのも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関数で指定するUnicodeはIMEパッド上で表示される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移動数
まとめ
効率化の効果としてはさほど大きいものではないですが、作業のストレスが軽減されますし、こういうことアイデアを実現できるようになっていると、普段の作業で 効率化出来ないかな? という気づき精度の向上に繋がります。
自分の手の届く範囲内であれば誰に遠慮することなくマクロを作っていきましょう。