GEN MUTO'S HOMEPAGE  エクセル大事典  エクセルVBAを極める

エクセルExcel大事典 エクセル大事典TOPページへ
 ■ エクセルVBA中級編−VBAでいろんなテクニック
  定数と列挙体(列挙型)を活用しよう!
 
■ 定数と列挙体(列挙型)

プログラムの中で文字や数値のリテラル(値)を使用する場合、値をそのまま記述することを決め打ちと呼びます。決め打ちされたリテラルは、後から管理が大変です。

例えば消費税計算用の数値リテラルを「1.05」で決め打ちしてしまうと、将来消費税率が変更になった場合、該当する箇所の「1.05」を全て変更しなければなりません。
数値リテラルなら、VBEの置き換え機能を使って一括置き換えを行うことも可能でしょうが(あまりお勧めしませんが…)、文字リテラルの場合、表記のゆれによって置き換えしそこなう可能性も考慮に入れる必要があります。
例えば、「出力先プリンター一覧表」と「出力先プリンタ一覧表」のような文字リテラルを、プログラミング内に直接記述することはナンセンスです。

保守のしやすいプログラムでは、必ずこれらのリテラル値をユーザー定数で定義しています。
例えば、先ほどの例ならば、

Public Const CstSyohizei As Long = 1.05
Public Const LstAllPrinter As String = "出力先プリンタ一覧表"
このように定義します。

これならば、消費税やリストの表題を変更する必要が発生した場合、ユーザー定数の定義を変更するだけで、すべての該当箇所に変更を反映させることが可能です。

この他にも、呼び出すファイルのフルパスとか、管理用のパスワード、データベースへの接続文字列など、さまざまな箇所に、ユーザー定数を利用することができます。

例:
Const UserPassword As String = "hoge"
If InputBox("Please Enter User Password") = UserPassword Then
  ' パスワードが合致した場合の処理
End If

上記の例では、入力された文字列がユーザー定数UserPasswordに合致した場合のみ、Ifブロック内の処理が実行されます。

定数は変数と違い、値を代入することができません。ですので、定数は定義された時点で与えられたリテラル値がプログラム中変更されることなく保持されます。(ユーザーによって書き換えられる心配がありません)
またリテラルをそのまま使用するのに比べて、ユーザー定数は定義された定数名で参照されます。これは、コードの可読性を高め、コード内のマジックナンバー(識別子として用いられる数値リテラル)を減らします。

※なおVBAでは定数配列を定義する(配列の要素を定数として定義する)ことはできません。
※他の定数を参照して定数を定義することができます。その場合は定数の循環参照に注意してください。

例:
Const AdminPassword As String = SuperPassword
Const SuperPassword As String = AdminPassword & "x"

上記の例では、定数がお互いを参照しあっているため循環参照が発生し、コンパイルエラーになります。

列挙体(ユーザー定義列挙型)

ユーザー定数の中には、同じグループの中にまとめることができるものも多く存在します。
例えば、次の定数はグループでひとまとめにしたほうが、より開発・保守がしやすいでしょう。

Public Const BusyoHonsya As Long = 0
Public Const BusyoAomori As Long = 1
Public Const BusyoNagoya As Long = 2
Public Const BusyoOsaka As Long = 3
Public Const BusyoMiyazaki As Long = 4

部署コードをユーザー定数で定義しています。これを、列挙型で定義してみましょう。

Public Enum Busyo
  Honsya = 0
  Aomori = 1
  Nagoya = 2
  Osaka = 3
  Miyazaki = 4
End Enum

このようになります。
列挙型のすばらしいところは、インテリセンス(自動入力補完機能)が使用できるところです。
Busyo.まで記述したところで、Aomori,Honsya,Miyazaki…と入力候補が表示されるので、目的のメンバをクリックまたはカーソル移動+TABで選択してやればOKです。

列挙型も定数と同じく、値を代入することはできません。
列挙型の値は内部的に長整数型の値として保持されます。ですので、列挙体の各メンバ(列挙定数)に割り当てられる値は整数のみになります。文字列などを割り当てることはできません。

例:
Public Enum Busyo
  Honsya = "本社"
  …
列挙型のメンバに文字列を定義することはできないのでコンパイルエラーになります。

列挙型はメンバに必ずしも値を定義する必要はありません。値を省略した場合、直前のメンバの値に1増分した値が、全く値を指定しない場合、0を開始値とした整数の連番が値としてセットされます。

例:
Public Enum Busyo
  Honsya = 10
  Aomori = 20
  Nagoya
  …
Busyo.Nagoyaには「21」がセットされる。

例:
Public Enum Busyo
  Honsya
  Aomori
  …
Busyo.Honsyaには「0」がBusyo.Aomoriには「1」がセットされる。

列挙型はコンボボックスと併用した使用方法が特に便利です。

  CbBusyo.AddItem "本社"
  CbBusyo.AddItem "青森"
  CbBusyo.AddItem "名古屋"
  …
コンボボックスCbBusyoに部署リストを加えます。これらリストのインデックスは0を開始値とした整数の連番で並びますので、次の列挙体に対応します。

Private Enum Busyo
  Honsya
  Aomori
  Nagoya
  …
あとは、CbBusyoのリストインデックスを使用して処理を分岐させることができます。

Select Case CbBusyo.ListIndex
Case Busyo.Honsya
  ' 本社の場合の処理
Case Busyo.Aomori
  ' 青森の場合の処理
Case Busyo.Nagoya
  ' 名古屋の場合の処理
  …

以上、ユーザー定義列挙型について解説しました。



定数は、コンパイル時に識別子によりチェックされます。また、列挙型は候補の中から選択する形式ですので、基本的に記述ミスをすることはありません。
これらのテクニックは、単にプログラムの可読性を上げるだけでなく、修正に強く、記述ミスをしにくいコードを書くために必須の技術です。
ぜひ、マスターしてあなたのプログラムに応用してください。

最後に、組み込み定数組み込み列挙型について少し触れます。
VBA,VBには、システムによって提供される組み込み定数や組み込み列挙型が多数存在します。
これらの定数はオブジェクトライブラリに記述されていて、オブジェクトブラウザから参照することが可能です。

※ 組み込み定数・組み込み列挙型と同じ名前のユーザー定義定数・列挙型を作成することはできません。
※ 組み込み定数・組み込み列挙型はオブジェクト、メソッド、プロパティで使用可能です。
※ オブジェクトブラウザはVBEのメニューから表示>オブジェクトブラウザを選択するか、F2キー押下で表示させることができます。


>> 次の話にすすむ


サイト内検索ができます

Microsoft Most Valuable Professional

Microsoft MVP Excel
武藤 玄 プロフィール
 

■■■ 執筆した書籍 ■■■
 

EXCEL VBA 業務自動化
 

Excel VBA を5日でマスターする本
 

仕事を速くする Excel VBA 入門
 

Excel VBAと業務改善のポイントがわかる本
 

Access VBA ベーシック スタンダード
 

Excel VBA アクションゲーム作成入門
 

■■■ 連載中の記事 ■■■
 

Excel VBAで業務改善!
 

実務で使うExcel VBA
 


TOPページ


■ エクセルVBA超入門

 ・9ステップで"Hello World!"
  からオブジェクト指向まで!
  1."Hello World!"を表示しよう
  2.基本はデータの入出力
  3.繰り返し処理
  4.シートで簡易データベース
  5.名前をつけよう
  6.構造化プログラムに挑戦
  7.構造体を使ってみよう
  8.フォームを使ってみよう
  9.オブジェクト指向に挑戦

■ エクセルVBA中級編

 ・VBAでいろんなテクニック
  変数・関数のスコープ
  引数の参照方法を明示
  配列の中身を一気に複写
  識別子がよいコードを作る
  データ定義型をもっと知ろう
  定数と列挙型を活用しよう
  エラー処理の重要性1
  エラー処理の重要性2
  いろいろな条件分岐
  いろいろな繰り返し処理
  演算子について知ろう
  文字列操作 連結 変換 置換
  文字列操作 検索 比較 書式
  日付操作関数を知ろう
  数値操作・評価・その他関数
  並び替えソートをマスター
  いろいろな検索をマスター
  VBEditorを使いこなそう
  マクロの記録を活用しよう1
  マクロの記録を活用しよう2
  VBAからVBEを操作しよう1
  VBAからVBEを操作しよう2
  VBAからVBEを操作しよう3
 ・ワークシートを使いこなす
  セルの参照をマスターしよう
  セルの選択をマスターしよう
  セルの操作をマスターしよう
  セルの書式設定をマスターしよう
  行・列の操作をマスターしよう
  シートの参照をマスターしよう
  シートの操作をマスターしよう
  ブックの操作をマスターしよう
  ウィンドウの操作をマスターしよう
  イベントプロシージャを活用しよう
  ワークシートを印刷しよう1
  ワークシートを印刷しよう2
  音声(読み上げ)機能を操作しよう
  グラフを操作しよう
 ・ユーザーフォームを使いこなす
  ユーザーフォームを使おう
  UserFormsオブジェクト
  Labelコントロール
  TextBoxコントロール
  ComboBoxコントロール
  ListBoxコントロール
  CheckBoxコントロール
  OptionButtonコントロール
  ToggleButtonコントロール
  CommandButtonコントロール
  ScrollBarコントロール
  SpinButtonコントロール
 ・VBA関数の一覧
  Aから始まる関数の一覧
  Cから始まる関数の一覧
  Dから始まる関数の一覧
  Eから始まる関数の一覧
  Fから始まる関数の一覧
  Gから始まる関数の一覧
 
■ エクセルVBAを極める
 VBAスーパーテクニック
 
 ・データベースへ接続してみよう!
  CSVファイルへの接続
  ワークシートへの接続
  mdbファイルへの接続
  SQL Serverへの接続
  ADOレコードセットの操作1
  ADOレコードセットの操作2
 ・ファイルを操作してみよう!
  FileSystemObjectの操作
  Drive File Folderの操作
  TextStream ダイアログ
  ステートメントでファイル操作1
  ステートメントでファイル操作2
 ・他アプリと連携してみよう!
  ActiveXオートメーションの操作
 ・ゲーム技でマクロを超える
  エクセルで音を鳴らす1
  エクセルで音を鳴らす2  
  スクリーン座標を取得
  様々なイベント取得
  リボンUIを制御しよう1
  リボンUIを制御しよう2
  シート上でアニメを動かそう
 
■ 一歩上行くエクセル
 基本操作の完全マスター!

 
 ・あなたはいったい
  エクセルで何をしたいのか?
  エクセルで業務効率化
  エクセル関数を使いこなす
  エクセルの便利技
  エクセルは最高の帳票ツール
 ・エクセル基本操作上級編!
  セル選択、コメント、シリアル値
  オート機能を使いこなそう!
  参照、条件付書式、入力規則
  関数をもっと理解しよう!
  配列数式を有効利用しよう!
  データの正規化をしよう!
  ショートカットキーを利用しよう1
  ショートカットキーを利用しよう2
  Office用アプリを作成しよう!
  PowerPivotとExcelで簡単BI!
 ・世間の誤ったエクセルの
  べからず集
  エクセルで文章を書くべからず
  エクセルで図形を描くべからず
  エクセルでシステムをつくるな
 
■ エクセル関連その他

 ・エクセルコミニュティにあなたも
  参加しませんか?
  Excel関連リンク・コミニュティ
 ・VBの理解がVBAをマスターする
  最短距離!
  VB関連の老舗・大家サイト
 ・エクセルExcel大事典掲示板
 ・プライバシーポリシー

2000アイテムを超えるラベルを販売
送料無料、即納対応の優良ショップ
今買っているラベルより確実に安い!
OAラベルの販売専科グラフトラベル




エクセルExcel大事典ははリンクフリーです エクセル大事典Excel大事典
お問い合わせはこちら gengengen@yahoo.co.jp

Copyright© Gen Muto 武藤 玄 All Rights Reserved,