名簿作りマクロ(2)

文字列をコード番号に置き換えて取得する

VLOOKUPのちょっと邪道な(?)使い方

一覧表の中の文字列をコード番号に変換するのには、VLOOKUPを使うというのが一般的だと思う。

ただ、私は、一覧表にずらずらとVLOOKUPの数式が並んでいるのがどうもイヤなんですよねー。

そこで、VLOOKUPを限定的に使うという方法をよく使う。

まあ、そもそもそんなことしなくて済むようにデータ集めりゃいいんですけどね。

で、どうすんの?

とにかく、対応する値さえ取得できりゃいいんだから、

セルの名前:PrefName

f:id:akashi_keirin:20170409210537j:plain

ここには都道府県名を突っ込みます。

セルの名前:PrefNumber

f:id:akashi_keirin:20170409210549j:plain

このセルにはVLOOKUPの数式を入れていて、"PrefName"セルの値をセル範囲"PrefTableReverse"で表引きした値がこのセルに返ります。

セルの名前:RacingStyle

f:id:akashi_keirin:20170409210601j:plain

ここには戦法名を突っ込みます。

セルの名前:RacingStyleNumber

f:id:akashi_keirin:20170409210611j:plain

上と同様、"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クラスを用いて、いよいよ名簿作りマクロを完成させます。

@akashi_keirin on Twitter