↑この表を定数化して扱う場合、
' 列番号の定数化 Public Enum CNo売上データ 品物 = 2 価格 個数 売上 End Enum ' セルの指定サンプル Cells(R, CNo売上データ.売上) = _ Cells(R, CNo売上データ.価格) * Cells(R, CNo売上データ.個数)
このように、Enum(列挙型)の定数にして扱うと便利です。
Enum(列挙型)の詳しい説明はこちら
さてこの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しても、すごく便利です。
他に流用するのも、簡単にできますので、
よく使うコードがあれば、こんな風にマクロにしてみてください。
コーディングが捗ると思いますので是非。
おまけ:併せて使ってほしいシートオブジェクト自動設定
シートのオブジェクト名を自動設定する
このマクロと、是非一緒に使ってください。
共に「シート名」をベースとした変数名になるので、
WSくだもの売上データ.Cells(R, CNoくだもの売上データ.価格)
と、「シートオブジェクト名とEnum名の一致」をもって、
バグのないコーディングを支援します。
シートごとにショートカットを2回ずつ実行するだけで、
定数定義が勝手に終わり、いきなりコーディングから始められるのは、
なかなか気持ちがいいです。
ぜひ使ってみてください。