この記事を読むのに必要な時間は約 6 分です。
VBAでのEnumのメリットと使い方を紹介します。
帳票に表示する値を配列に入れたり、配列から取り出したりするときなど重宝します。
帳票の例として、下図のような領収書を用意してみました。
「〇〇株式会社 御中」のように顧客名が入っていないですし、少々直さないといけません。
どうやってこの領収書に項目を追加したり入れ替えたりするのかを例に、Enumを紹介していきます。
目次(リンク)
VBAでの、Enumの使い方
まずはEnumの説明から。
Enumは列挙型とも呼ばれ、定数をまとめて管理できる型です。
定義する定数は列挙子といいます。
書き方は、SubやFunctionに似ていて
1 2 3 4 5 |
アクセス修飾子 Enum 列挙名 修飾子1 修飾子2 修飾子3 End Enum |
のようになります。
アクセス修飾子はPublicやPrivateなどのことです。
Enumのメリットは、ソースの読みやすさとメンテナンス性の良さ。
定数の単なる数字の一つ一つが、どんな意味を持った値なのかパッと見で分かるんです。
定義する順を変えれば意味する数字も変わりますが、列挙子の文字列自体を変更する必要はありません。
これはホントに便利です。
Enumの使用例
Enumを項目分だけ用意してみました。
説明用に準備した帳票で使うものです。
デバッグプリントを実行し、イミディエイトウインドウにEnumの列挙子の値を表示してみたいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Option Explicit Public Enum testEnum strReceiptNum '領収書番号 strReceiptName '件名 strReceiptDate '発行日 strReceiptAmountSum '合計金額 End Enum Public Sub testDebugPrintEnum() Debug.Print testEnum.strReceiptNum & " 領収書番号" Debug.Print testEnum.strReceiptName & " 件名" Debug.Print testEnum.strReceiptDate & " 発行日" Debug.Print testEnum.strReceiptAmountSum & " 合計金額" End Sub |
0(ゼロ)から順に表示されました。
このEnumを配列の添え字として使うわけです。
例)領収書の帳票の項目に配列で値を格納してみる
Enumを使って、配列の添え字を書く
Enumを添え字にした配列に値を入れ、エクセルシート上のセルに配列の値を格納していきます。
配列に入れる値は、ふつうはDBのテーブルなどから取ってくると思いますが、ここでは簡略化して直接文字列を入れています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Option Explicit Public Enum testEnum strReceiptNum '領収書番号 strReceiptName '件名 strReceiptDate '発行日 strReceiptAmountSum '合計金額 End Enum Public Sub testEnumArray1() Dim vReceiptArray(3) As Variant vReceiptArray(testEnum.strReceiptNum) = "No." & "99999999" vReceiptArray(testEnum.strReceiptName) = "〇〇システム開発" vReceiptArray(testEnum.strReceiptDate) = "2019年03月27日" vReceiptArray(testEnum.strReceiptAmountSum) = "5,555,000円 (税込)" Sheet1.Cells(6, 31) = vReceiptArray(testEnum.strReceiptNum) Sheet1.Cells(11, 18) = vReceiptArray(testEnum.strReceiptName) Sheet1.Cells(7, 31) = vReceiptArray(testEnum.strReceiptDate) Sheet1.Cells(13, 18) = vReceiptArray(testEnum.strReceiptAmountSum) End Sub |
企業向けの領収書には「○○株式会社御中」のような顧客名も必要ですが、上記のソースから漏れてしまっています・・・。
さらに、帳票での上からの順番と、ソース内での順番がズレているので、できれば合わせておきたいところ。
もしも、Enumを使わなかったらどうなってしまうんでしょうか。
Enumが無いと、どれだけ面倒なのか
試しに配列の添え字のところを数字で書いてみました。
書いた後で、順序を入れ替えたり間に項目を挿入したりするわけです。
4項目が5項目になるくらい、そんなの楽勝じゃん!と思いますよね。
これが50項目とか300項目になってくると、数字を1つ繰り上げるだけでもヤバいです。
表示される位置が変わってしまっていないか、全項目テストしないといけません。
この番号はどの項目のものだったかなぁと、毎回確認するのも大変です。
Enumを使わない場合の苦労、お分かりいただけたでしょうか。
帳票用の配列には、Enum(列挙型)を使うとメンテが楽
そんなこんなで、Enumを使った場合で考えていきたいと思います。
Enumに項目追加、順序を入れ替え
Enum内で、顧客名を追加し、件名と発行日を入れ替えました。
配列のほうは、顧客名の1つ分だけ要素数を3から4へ増やし、配列への格納とセルへの格納を1行ずつ増やしました。
既存の配列内のEnumは一切変更していません。
変更したソースで、実行してみたいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Option Explicit Public Enum testEnum strReceiptNum '領収書番号 strReceiptCustomerName '顧客名 strReceiptDate '発行日 strReceiptName '件名 strReceiptAmountSum '合計金額 End Enum Public Sub testEnumArray2() Dim vReceiptArray(4) As Variant vReceiptArray(testEnum.strReceiptNum) = "No." & "99999999" vReceiptArray(testEnum.strReceiptCustomerName) = "テスト株式会社" & " 御中" vReceiptArray(testEnum.strReceiptName) = "〇〇システム開発" vReceiptArray(testEnum.strReceiptDate) = "2019年03月27日" vReceiptArray(testEnum.strReceiptAmountSum) = "5,555,000円 (税込)" Sheet1.Cells(6, 31) = vReceiptArray(testEnum.strReceiptNum) Sheet1.Cells(7, 4) = vReceiptArray(testEnum.strReceiptCustomerName) Sheet1.Cells(7, 31) = vReceiptArray(testEnum.strReceiptDate) Sheet1.Cells(11, 18) = vReceiptArray(testEnum.strReceiptName) Sheet1.Cells(13, 18) = vReceiptArray(testEnum.strReceiptAmountSum) End Sub |
顧客名が表示され、他の項目もズレなく表示されました。
まとめ:メンテが楽!! VBAでEnum(列挙型)を使って配列に文字列を格納する方法
配列にEnumを使うやり方やメリットを紹介しました。
定数を1つにまとめて
項目が大量にあると、ちょっとメンテするだけでも大変です。
もしもEnumが無かったらもっと大変になります。
ホントに便利なので、ぜひ使ってみてくださいね。
最後までお読みいただき、ありがとうございました。