名簿作りマクロ(2)
文字列をコード番号に置き換えて取得する
前回
のつづき。
VLOOKUPのちょっと邪道な(?)使い方
一覧表の中の文字列をコード番号に変換するのには、VLOOKUPを使うというのが一般的だと思う。
ただ、私は、一覧表にずらずらとVLOOKUPの数式が並んでいるのがどうもイヤなんですよねー。
そこで、VLOOKUPを限定的に使うという方法をよく使う。
まあ、そもそもそんなことしなくて済むようにデータ集めりゃいいんですけどね。
で、どうすんの?
とにかく、対応する値さえ取得できりゃいいんだから、
セルの名前:PrefName
ここには都道府県名を突っ込みます。
セルの名前:PrefNumber
このセルにはVLOOKUPの数式を入れていて、"PrefName"セルの値をセル範囲"PrefTableReverse"で表引きした値がこのセルに返ります。
セルの名前:RacingStyle
ここには戦法名を突っ込みます。
セルの名前:RacingStyleNumber
上と同様、"RacingStyle"セルの値をセル範囲"RacingStyleTableReverse"で表引きした値がこのセルに返ります。
こんなふうに、値取得専用のセルを準備して、参照用のセルに値を突っ込んでは、返り値用のセルで必要な値を取得する(どうでもいいけど分かりにく表現だな、オイ)ことを繰り返すわけです。
コード番号取得用クラス
やはりここでも無駄にクラスモジュールを使いますよ。
例によってクラスモジュールを挿入して、オブジェクト名を「CodeGetter」にする。
リスト1-1 フィールド・アクセサ部分
Option Explicit 'フィールド Private prefNum_ As Integer Private styleNum_ As Integer 'アクセサ Public Property Get prefNum() As Integer prefNum = prefNum_ End Property Public Property Get styleNum() As Integer styleNum = styleNum_ End Property
まあ、何の変哲もないコード。
例によって、コンストラクタはなし。
リスト1-2 メソッド部分
'メソッド Public Sub getCode(ByVal pStr As String, _ ByVal sStr As String) '……(1) Range("PrefName").Value = pStr '……(2) prefNum_ = Range("PrefNumber").Value '……(3) Range("RacingStyle").Value = sStr '……(4) styleNum_ = Range("RacingStyleNumber").Value '……(5) End Sub
リスト1-2の説明
(1)の
Public Sub getCode(ByVal pStr As String, _ ByVal sStr As String)
で引数を2つ設定している。第1引数は都道府県名、第2引数が戦法名。
まず(2)では、
Range("PrefName").Value = pStr
と、引数で受け取った文字列を、"PrefName"セルにセット。
すると、"PrefNumber"セルのVLOOKUP関数が表引きの結果である都道府県コード番号を返すので、
prefNum_ = Range("PrefNumber").Value
と、その値を即クラス内の仮変数prefNum_にセット。prefNum_にセットされた値は、prefNumプロパティが参照されたときにprefNumプロパティの値として呼び出されることになる。
戦法についても、(4)、(5)で同様に戦法コードをクラス内の仮変数styleNum_にセット。
要するに、CodeGetterクラスのインスタンスに都道府県名と戦法名を渡してgetCodeメソッドを実行したら、CodeGetterクラスのインスタンスは都道府県コードと戦法コードの2つの値を保持するようになる、ということだ。
CodeGetterクラスを利用するコード
こちらは、標準モジュールに書く。
リスト2
Dim cdGetter As CodeGetter Set cdGetter = New CodeGetter With gblRacer cdGetter.getCode .belongsTo, .rcStyle '……(1) End With
「gblRacer」は、前回ご紹介したGambleRacerクラスのインスタンス。belongsToプロパティ、rcStyleプロパティには、それぞれ都道府県名、戦法名がセットされている。
だから、(1)は、getCodeメソッドに都道府県名と戦法名を渡して実行しているということ。
(1)の実行後は、CodeGetterクラスのインスタンス「cdGetter」が都道府県番号を戦法番号を保持していることになる。
次回予告
今回のように、一時的なデータの置き場所として目に見えるセルが使える、というのがVBAの強みかも知れない。
それに、そこそこ大規模な表だと、VLOOKUPだらけにするとなんか重たい感じがしてイヤなので、こんなやり方で値だけを転記することが多い。まあ、ちょっとした力技なのかも知れませんが。
さて、次回は、前回作成したGambleRacerクラスと、今回のCodeGetterクラスを用いて、いよいよ名簿作りマクロを完成させます。