和風スパゲティのレシピ

日本語でコーディングするExcelVBA

列番号のEnum定数コードを自動生成するマクロ

サンプル表

↑この表を定数化して扱う場合、
 

' 列番号の定数化
Public Enum CNo売上データ
    品物 = 2
    価格
    個数
    売上
End Enum

' セルの指定サンプル
Cells(R, CNo売上データ.売上) = _
    Cells(R, CNo売上データ.価格) * Cells(R, CNo売上データ.個数)

このように、Enum(列挙型)の定数にして扱うと便利です。


Enum(列挙型)の詳しい説明はこちら

www.limecode.jp


さてこのEnumですが、毎回書くのは面倒なので、
マクロをマクロに書いてもらいましょう。


今回紹介するのは、見出し範囲を選択して実行すると、
Enum定義コードを生成して、イミディエイトウィンドウに出力するマクロです。


実行型の便利マクロですので、
Excel起動時に裏で開かれる「個人用マクロブック」などに搭載して使ってください。

Ctrl + Shift + E とかに設定するのがおすすめです。

 

使い方

実行エリア

ここを選択してマクロを実行すると、
 

Public Const R1stくだもの売上データ =  3 
Public Enum CNoくだもの売上データ
    品物 = 2
    価格
    個数
    売上
End Enum

これがイミディエイトウインドウに表示されます。
あとはこれをどこかのモジュールににコピペすればOK。

「くだもの売上データ」という列挙体本体の名前は、
シート名から取得しています。


1行目だけを列挙体にするので、表全体を選択しての実行も可能です。
CurrentRegion「Ctrl + Shift + :」と連続起動するためですね。


ついでに、オートフィルターのある表であれば見出しは明確なため、
単独セルから実行時は、フィルター見出しを対象に実行します。


マクロを書き始めるときの準備ですごい楽ができるので、
列番号にEnumを使う方には超おすすめしたいマクロです。

ソースコード

Sub 列見出しのEnum定数コードをイミディエイトウィンドウに出力する()
    On Error Resume Next

    ' 選択エリアの第1行を見出しとして実行
    Dim Range見出し As Range
    Set Range見出し = Selection.Rows(1)

    ' フィルター付シートで単セル・単行から実行時は、オートフィルター見出しを使用
    If Range見出し.Cells.Count = 1 And ActiveSheet.AutoFilterMode = True Then
        Set Range見出し = ActiveSheet.AutoFilter.Range.Rows(1)
    End If

    ' Enumの本体名はシート名を使用
    Dim シート名 As String: シート名 = Replace変数用整形(ActiveSheet.Name)

    ' Enum本体と初項を出力(ついでに第1行も)
    Debug.Print "Public Const R1st" & シート名 & " = " & Range見出し.Row + 1
    Debug.Print "Public Enum CNo" & シート名
    Debug.Print "    " & Replace変数用整形(Range見出し.Cells(1).Text) _
                              & " = " & Range見出し.Column
    
    ' 見出しをループしてイミディエイトウインドウに出力
    If Range見出し.Cells.Count > 1 Then
        Dim i As Long
        For i = 2 To Range見出し.Cells.Count
            Debug.Print "    " & Replace変数用整形(Range見出し.Cells(i).Text)
        Next
    End If
    
    Debug.Print "End Enum"
End Sub

Private Function Replace変数用整形(元テキスト As String) As String

    ' (○○)を_○○に
    Replace変数用整形 = 元テキスト
    Replace変数用整形 = Replace(Replace変数用整形, "(", "_")
    Replace変数用整形 = Replace(Replace変数用整形, "(", "_")
    Replace変数用整形 = Replace(Replace変数用整形, ")", "")
    Replace変数用整形 = Replace(Replace変数用整形, ")", "")

    ' 改行とスペースは消す
    Replace変数用整形 = Replace(Replace変数用整形, vbLf, "")
    Replace変数用整形 = Replace(Replace変数用整形, " ", "")
    Replace変数用整形 = Replace(Replace変数用整形, " ", "")
    
    ' 数値始まりはとりあえず置換しやすい様に"XX"を接頭
    If IsNumeric(Left(Replace変数用整形, 1)) Then
        Replace変数用整形 = "XX" & Replace変数用整形
    End If
    
End Function

コードの解説

超単純な処理ですね(笑)

見出しのRangeオブジェクトを1セルずつループして、
愚直に「Debug.Print」しているだけです。


この「Debug.Print」を連打するマクロは、
マクロにマクロを書かせる、一番簡単な方法です。

カスタマイズもとても簡単。


例えば、書き手の好みが出やすい「テーブル」については触れませんでしたが、
「テーブル」をよく使う方は、対象テーブルのオブジェクトを返すFunctionのコードも含めてDebug.Printしても、すごく便利です。


他に流用するのも、簡単にできますので、
よく使うコードがあれば、こんな風にマクロにしてみてください。


コーディングが捗ると思いますので是非。

おまけ:併せて使ってほしいシートオブジェクト自動設定

シートのオブジェクト名を自動設定する

www.limecode.jp

このマクロと、是非一緒に使ってください。


共に「シート名」をベースとした変数名になるので、

WSくだもの売上データ.Cells(R, CNoくだもの売上データ.価格)

と、「シートオブジェクト名とEnum名の一致」をもって、
バグのないコーディングを支援します。


シートごとにショートカットを2回ずつ実行するだけで、
定数定義が勝手に終わり、いきなりコーディングから始められるのは、
なかなか気持ちがいいです。


ぜひ使ってみてください。