Excelが大好きだ!

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


スポンサードリンク

丸数字ジェネレーターの出力範囲を改良した

以前に任意の範囲の丸数字を出力できるアドインを作成しました。

www.excellovers.com

ところが使っている内に縦方向だけでなく、横方向にも出力したいという思いが出てきました。

と思った時に改良できるのが自作マクロの良いところ。
サクッと改良してみました。

完成品

改良したマクロの挙動をご紹介。

追加した機能は『選択範囲に丸数字を出力』する機能です。


構成

丸数字ジェネレーターはユーザーフォームとモジュールから構成されています。
今回変更したのは『ufm_丸数字作成』のみです。


コード

改良前のコードは下記のとおりです。

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

以下が改良後のコードになります。

Option Explicit

Private Sub CheckBox1_Change()
    If Me.CheckBox1.Value Then
        Me.TextBox1.Enabled = False
        Me.TextBox2.Enabled = False
        Me.TextBox1.BackColor = &HE0E0E0
        Me.TextBox2.BackColor = &HE0E0E0
        Me.Label3.Caption = "※選択範囲に丸数字を入力します"
    Else
        Me.TextBox1.Enabled = True
        Me.TextBox2.Enabled = True
        Me.TextBox1.BackColor = vbWhite
        Me.TextBox2.BackColor = vbWhite
        Me.Label3.Caption = "※1~50までの整数を入力" & vbCrLf & "アクティブセルから下方向に丸数字を入力します"
    End If
End Sub


Private Sub CommandButton1_Click()
    Dim z開始数 As Long
    Dim z終了数 As Long
    
'--実行前チェック
    If Me.CheckBox1.Value = False And Not (IsNumeric(Me.TextBox1.Value) And IsNumeric(Me.TextBox2.Value)) Then
        MsgBox "テキストボックスには1~50の整数を入力してください", vbCritical + vbOKOnly, "入力エラー"
        Exit Sub
    End If
    
'--作成数チェック
    If Me.CheckBox1.Value = False Then
        z開始数 = Me.TextBox1.Value
        z終了数 = Me.TextBox2.Value
    Else
        z開始数 = 1
        z終了数 = WorksheetFunction.Min(50, Selection.Count)
    End If
    
'--丸数字作成
    Dim var As Variant
    var = kf丸数字作成(z開始数, z終了数)
    
'--丸数字転記
    Dim myRng As Range
    Dim i As Long: i = 1
    If Me.CheckBox1.Value = False Then
        ActiveCell.Resize(UBound(var), 1).Value = var
    Else
        For Each myRng In Selection
            myRng.Value = var(i, 1)
            i = i + 1
            If i = 51 Then Exit For
        Next
    End If
End Sub

だいぶ増えてしまいましたが、ユーザーフォーム上のチェックボックスの状態で処理を分岐させるために増えたもので、丸数字を作成するメインにロジックに関しては何も変わっていません。


解説

CheckBoxで処理を変更

ユーザーフォームを呼び出し時には新しく追加したCheckBoxにチェックが付いた状態になっています。
この状態の時に新しい機能『選択範囲に丸数字を入力する機能』が実行されます。
CheckBoxのチェック状態によってユーザーフォームの表示を変更しています。

Private Sub CheckBox1_Change()
    If Me.CheckBox1.Value Then
        Me.TextBox1.Enabled = False
        Me.TextBox2.Enabled = False
        Me.TextBox1.BackColor = &HE0E0E0
        Me.TextBox2.BackColor = &HE0E0E0
        Me.Label3.Caption = "※選択範囲に丸数字を入力します"
    Else
        Me.TextBox1.Enabled = True
        Me.TextBox2.Enabled = True
        Me.TextBox1.BackColor = vbWhite
        Me.TextBox2.BackColor = vbWhite
        Me.Label3.Caption = "※1~50までの整数を入力" & vbCrLf & "アクティブセルから下方向に丸数字を入力します"
    End If
End Sub


Command Button

作成ボタンを押したときの処理です。
今回の一番大きな変更箇所です。

ここでの処理は以下の2つを実行しています。 1. 丸数字を作成する範囲の決定 2. 決定した範囲をメインロジックである『kf丸数字作成』に渡す。 3. 配列で返ってきた丸数字リストをセルに転記

1の処理についてはチェックボックス状態で処理を分けています。

チェック無し:ユーザーフォームのテキストボックスの値を取得して範囲を決定
チェック有り:シート上の選択範囲から決定

チェックなしの場合は作成範囲に任意の数字を選択可能ですが、チェック有りの場合は1から始まる範囲を自動で算出します。

Private Sub CommandButton1_Click()
    Dim z開始数 As Long
    Dim z終了数 As Long
    
'--実行前チェック
    If Me.CheckBox1.Value = False And Not (IsNumeric(Me.TextBox1.Value) And IsNumeric(Me.TextBox2.Value)) Then
        MsgBox "テキストボックスには1~50の整数を入力してください", vbCritical + vbOKOnly, "入力エラー"
        Exit Sub
    End If
    
'--作成数チェック
    If Me.CheckBox1.Value = False Then
        z開始数 = Me.TextBox1.Value
        z終了数 = Me.TextBox2.Value
    Else
        z開始数 = 1
        z終了数 = WorksheetFunction.Min(50, Selection.Count)
    End If
    
'--丸数字作成
    Dim var As Variant
    var = kf丸数字作成(z開始数, z終了数)
    
'--丸数字転記
    Dim myRng As Range
    Dim i As Long: i = 1
    If Me.CheckBox1.Value = False Then
        ActiveCell.Resize(UBound(var), 1).Value = var
    Else
        For Each myRng In Selection
            myRng.Value = var(i, 1)
            i = i + 1
            If i = 51 Then Exit For
        Next
    End If
End Sub

まとめ

『選択範囲に丸数字を入力機能』を備えたことでより柔軟に丸数字を利用することが出来るようになりそうです。