エクセルVBAでシートの列の挿入も簡単に対応できちゃう列挙体の使い方

★気に入ったらシェアをお願いします!

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAで請求データ一覧から請求書を自動で作成する方法をシリーズでお伝えしています。

前回はこちらの記事。

宣言もセットも不要!エクセルVBAでワークシートをオブジェクト名で取り扱う方法
エクセルVBAで頻繁に取り扱うワークシート。実はオブジェクト変数を使わずに「オブジェクト名」を使って操作する方法があります。プロジェクト全体で定数のように使うことができ便利ですので、その使い方をお伝えします。

ワークシートをオブジェクト名で取り扱う方法についてお伝えしました。

請求書作成ツールとしては、既に機能はしている状態ではあるのですが、ツールのメンテナンスを超絶楽ちんにする便利なテクニックがあるのでお伝えしたいと思います。

その名も列挙体です。

VBAではエクセルシートに列の挿入があった場合、セルの指定をしている箇所をいちいち変更しなくてはいけなくなったりしますよね?

しかし、列挙体を上手に使うと、エクセルシートに列の挿入があっても、簡単に対応ができるようになります。

では、エクセルVBAでシートの列の挿入も簡単に対応できちゃう列挙体の使い方です。

行ってみましょう!

シートで列の挿入があったらどうなる?

請求書を作成する元データが、このようなシートに記録されているとします。

エクセルの請求データシート

本ツールでは、この「請求データ」シートを「wsData」というオブジェクト名で取り扱っており、取引先ごとのデータを集めてそれぞれの請求書を作ります。

プログラムとしては

とか

といったように、様々な形でシートの列やセルを指定しているんですね。

ですが、ツールを運用する上で、列の挿入をしたくなるときがあります。

例えば、こんな感じです。

エクセルの請求データシートに列を挿入

A列に「No」というフィールド列が挿入されちゃったんですね。

こうなってしまうと、さあ大変。

プログラム内の列指定をいちいち変更するのは大変

先ほど紹介したプログラムの一部もそれぞれ

というように、列番号をそれぞれプラス1の値に修正したり

「”A:A”」は「”B:B”」、「”F:F”」は「”G:G”」…といったように、列範囲の指定も変更します。

ちまちま、ちまちま、とっても面倒です!

また、面倒なだけでなく、修正ミスや修正忘れが発生しちゃいそうです。

列挙体の使い方

もし、そんなことが発生しそうなのであれば、列の指定を列挙体でしておくのがおすすめです。

Enumステートメントで列挙体を定義する

列挙体は、変更がない数値をグループとして扱う場合に使うことができる便利なもので、以下のようにEnumステートメントで定義します。

Enum 列挙体名
メンバー名1[ = 値1]
メンバー名2[ = 値2]

End Enum

列挙体名は変数名のように、任意の文字列で指定します。

値1,値2,…は整数値を指定します。値1を省略すると0が入り、値2以降を省略すると、直前のメンバーの値にプラス1した整数が入ります。

また、列挙体の宣言はプロシージャ内ではなく、モジュールレベルで行います。

例えば、以下のような列挙体eDataを定義しましょう。

これで、それぞれのメンバーに値が定数のように格納された状態となります。

列挙体の値を取り出す

そして、列挙体の任意のメンバーの値を取り出す場合は

列挙体名.メンバー名

で取り出すことができます。

例えば、前述のEnumステートメントによるeDataの定義をした上で

こんなプロシージャを実行すると

エクセルVBAで列挙体の値を出力

こんなふうに出力されるわけですね。

シートの列を列挙体として定義する

もうおわかりですよね。

列挙体の各メンバーに列番号を割り当てておくんです。

先ほどの列挙体eDataを定義しておき、冒頭のプログラムの一部を

であったり

というように、列番号の指定を「列挙体.メンバー名」で指定しておきます。

もしA列に「No」という列が挿入されたとしても、列挙体eDataの定義の箇所を

このように変更するだけで、列挙体の各メンバーに格納されている列番号が変更されてくれるので、プロシージャ内は一切変更をしなくても対応ができるようになるわけです。

便利ですよね!

列挙体を使用した請求書作成プログラム

では、請求書プログラムを、列挙体を使用して書き換えてみましょう。

文字数は若干増えた感じはありますが、列の指定がただの数値から、意味のある列挙体名とメンバー名の組み合わせになっていますので、コードの可読性も上がっていますよね。

まとめ

以上、エクセルVBAでシートに列挿入があっても列挙体で簡単に対応ができるよ、ということをお伝えしました。

お伝えしてきた通り、列挿入があっても列挙体の定義の修正だけで済むようになりますので、その際の作業効率やミスを減らす意味でもメリットがあります。

加えて、可読性も上がりますしね。

列を列挙体で定義する…オススメです!

連載目次:データ一覧から請求書を自動で作る

お仕事において特定のデータ一覧から必要な情報を抽出するということは頻繁にありうると思います。ここではデータ一覧から請求書を作るということを目標に、実務で使えるスキルをまっすぐに身に着けることを目的としています。
  1. 【初心者向けエクセルVBA】データ一覧から請求書を自動で作る
  2. 【初心者向けエクセルVBA】For~Next文で簡潔にプログラムを書く
  3. 【初心者向けエクセルVBA】行の数をカウントする&不要な行を隠す
  4. 【初心者向けエクセルVBA】文字列の連結&Format関数での書式変更
  5. 【初心者向けエクセルVBA】If~Thenを使った条件分岐の超入門
  6. 【初心者向けエクセルVBA】Public変数の宣言とSubプロシージャの呼び出し
  7. 【初心者向けエクセルVBA】InputBoxでの日付入力と月末日の自動算出
  8. 【初心者向けエクセルVBA】Worksheetのコピーを活用して複数の請求書を作る
  9. 【初心者向けエクセルVBA】ファイルのコピーを使って取引先別の請求書を作る
  10. エクセルVBAでDateAdd関数を使って年月を条件としてSumIfs関数を使う方法
  11. 宣言もセットも不要!エクセルVBAでワークシートをオブジェクト名で取り扱う方法
  12. エクセルVBAでシートの列の挿入も簡単に対応できちゃう列挙体の使い方

コメント

  1. よぶびえ より:

    いつも参考にさせていただいております。ありがとうございます。
    ひとつお伺いなのですが、今回の例ですと挿入した「no」列は一番左に位置するわけですが、間に挿入された列でも対応できるのでしょうか?例えば、今回のvbaを社内に公開した後、現場担当者が「取引先名の右に『取引先担当者名』列を入れたいんだよね。勝手に列挿入しちゃえ!」というような場合です。理想としては、列挿入されたとしてもコードは変えなくて済むことだと思ってはいるのですが…。自分でも試してみようと思いますが、もしお時間ございましたらご教授ください。

    • よぶびえ様

      コメントありがとうございます!

      そんなときのために、列挙体をお使いくださいませ。

      とすれば対応できるかと思います。