名前、定数、列挙体(Excel)

名前、定数、列挙体

f:id:akashi_keirin:20180818185706j:plain

ちょっと、PINK FLOYDっぽいタイトルだったのでつい……。

名前、定数、列挙体に同じ文字列を使ってみる

ワークシートのA1、A2、A3セルに、それぞれ「aho」、「baka」、「kasu」と名前をつけておく。

f:id:akashi_keirin:20180818185714j:plain

f:id:akashi_keirin:20180818185723j:plain

f:id:akashi_keirin:20180818185732j:plain

んで、次のように定数と列挙体を定義しておく。

リスト1 標準モジュール宣言セクション
Option Explicit

Private Const kasu As String = "カス"    '……(1)'

Private Enum Hoge
  aho = 1
End Enum
Private Enum Hage
  aho
  baka
  kasu
End Enum

そして、次のようなコードを用意する。

スト2 標準モジュール
Public Sub testNameConstEnum()
  Debug.Print aho    '……(2)'
  Debug.Print Hoge.aho
  Debug.Print Hage.aho
  Debug.Print Sheet7.Range("aho").Value
  Debug.Print Sheet7.Range("baka").Value
  Debug.Print Sheet7.Range("kasu").Value
  Debug.Print baka
  Debug.Print kasu
End Sub

これを実行してみる。

すると、いきなり

f:id:akashi_keirin:20180818185744j:plain

定数名が不適切である旨、エラーが出る。

仕方がないので、(1)の

Private Const kasu As String = "カス"

コメントアウトして再度実行。すると、今度は

f:id:akashi_keirin:20180818185755j:plain

と、(2)の

Debug.Print aho

のところでエラー。

これは当り前。単に「aho」としたのでは、列挙体Hogeの方なのか、Hageの方なのかが解決できないのだから。

よって、(2)もコメントアウトして三度実行。

f:id:akashi_keirin:20180818185812j:plain

今度はエラーが出ずに完走し、

1
0
ち~んw
( ´,_ゝ`)プッ
(゚Д゚)ハァ?
1
2

と出力された。

結論

定数と列挙体が被るのはアウト

最初にいきなりエラーが出たことからも分かるように、定数名と列挙体の要素名が被るのはダメみたい。

実は、こないだこれでしばらくハマった。

名前と列挙体は被ってもよい

Debug.Print Sheet7.Range("baka").Value

の「baka」はセルに付けた名前、

Debug.Print baka

の「baka」は、列挙体の要素名として、ちゃんと区別されている。

kasu」についても同じ。

定数と名前は被ってもよい

定数「kasu」のコメントアウトを解除し、列挙体「Hage」の要素「kasu」をコメントアウト、つまり、

Private Const kasu As String = "カス"
Private Enum Hoge
  aho = 1
End Enum
Private Enum Hage
  aho
  baka
End Enum

Public Sub testNameConstEnum()
  Debug.Print Hoge.aho
  Debug.Print Hage.aho
  Debug.Print Sheet7.Range("aho").Value
  Debug.Print Sheet7.Range("baka").Value
  Debug.Print Sheet7.Range("kasu").Value
  Debug.Print baka
  Debug.Print kasu
End Sub

この状態で実行すると、

f:id:akashi_keirin:20180818185822j:plain

このとおり、意図どおりに出力された。

Debug.Print Sheet7.Range("kasu").Value

の「kasu」はセルの名前、

Debug.Print kasu

の「kasu」は定数として、ちゃんと区別されている。

おわりに

名前、定数、列挙体をうまく使い分けましょう。