t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA 性別をBooleanで表すのはちょっと気が引けるので…

f:id:t-hom:20150927103401p:plain


個人情報を扱うプログラムを作成しているといつも悩むのが性別をプログラム内部で扱う際のデータ型だ。

文字列型で"男"・"女"としたり、Int型で1・2とするやり方もあるが、これだと他にいろんな値を取りうるので、バグの元になりかねない。

そこで2値をとるBooleanをつかうという選択肢を考えるのだが、、、

どうも男女をTrueとFalseで表すのは気が引ける。

まあ、アメリカじゃあるまいしプログラムの内部実装ごときで「男女差別だ」などと訴えられたりはしないだろう。
それでも、男が真(True)で女が偽(False)とか、感じが悪いではないか。
逆にしたらしたで、フェミニストを気取っているみたいで嫌だ。

それで考えたのが列挙型の使用である。

宣言セクションで次のように定義する。

Enum 性別
    男
    女
End Enum

そして変数を性別型で宣言すると、代入ステートメントの記入時に自動で「定数の一覧」が表示される。(下図)

f:id:t-hom:20150927094805p:plain

列挙型を引数にとるプロシージャも作成してみた。
これは、私がときどき行くスパワールドのフロア案内をシミュレートしたもの。
偶数月と奇数月で男女のフロアが入れ替わる。

Sub フロア案内(Gender As 性別)
    Select Case Gender
    CaseIf Month(Now) Mod 2 = 0 Then
            MsgBox "4階でございます"
        Else
            MsgBox "6階でございます"
        End If
    CaseIf Month(Now) Mod 2 = 0 Then
            MsgBox "6階でございます"
        Else
            MsgBox "4階でございます"
        End If
    End Select
End Sub

これも呼び出し時に定数の一覧が表示される。
f:id:t-hom:20150927100753p:plain

今回は性別型で変数を作っているので、そのまま変数を渡した。

Sub test()
    Dim a As 性別
    a = 男
    フロア案内 a
End Sub

すると、「6階でございます」と表示される。

列挙型は何も値を書かない場合は0から始まる連続したLong型になる。
したがって内部では男は0、女は1という値なのであるが、列挙型を直接やりとりすることで、内部の数値を意識しなくてよくなる。
性別型の宣言部に具体的な値を設定しても、順番を入れ替えても、メインコードには何も影響を与えない。

昨今では性別の在り方も多様化しているが、列挙型ならいくつでも定義できるのでその点でもBooleanより優れている。

近い将来、プログラムで男女以外の性別を扱うのがふつうになる日が来るかもしれない。
そうでなくても、こうしたテクニックはいろいろと使いまわしがきくので、覚えておくと良いと思う。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。