名簿作りマクロ(1)
人物データを元に名簿を作成するマクロ
配置転換で行った先で見たもの
新年度の配置転換で、新しい部署に行くことになった。んで、早速名簿作りをしないといけなくなった。
だいたいこんな感じのものが出てきたと思ってください。
どうやら、
こんな元データを作って、それをいろんな条件で並び替えてコピペすることによって、注目するキーごとの名簿を作っていたみたいだ。あ、もちろん画像はイメージですよ。実際にはもっとたくさんパラメータのある大がかりな表です。
せいぜい200人分ぐらいの名簿だから、大したことないといえば大したことのない名簿作りだけど、よくやるよ、ホントに。
ナマケモノの私は、もちろんマクロでやることを考えましたよ。たとえ1回こっきりでもマクロでやりますね。だって、その方が楽しいから(キリッ
方針
もちろん、クラスモジュール入門者なので、今回も無駄にクラスモジュール使いますよ。
それぞれのワークシートはこんな感じ。
んで、「参照」と名付けたシートのB1~E1セルには、
こんな風に、名前を定義したり、数式を入れたりしている。
処理の手順としては、
- 選手を表すクラスを作る
- 「選手データ」シート1行分のデータを選手クラスのインスタンスに持たせる
- 「戦法別」または「都道府県別」シートにデータを転記する
- 全部転記し終わったらそのシートにふさわしいやり方でデータを並べ替える
とまあ、こんなところか。
選手クラスを作る
リスト1
クラスモジュールを挿入して、オブジェクト名は「GambleRacer」にする。
フィールド
Option Explicit 'フィールド' Private rcName_ As String '……選手名' Private rcPhonetic_ As String '……ふりがな' Private belongsTo_ As String '……都道府県' Private prefNum_ As Integer '……都道府県No.' Private graduateTerm_ As Integer '……卒業期' Private rcGrade_ As String '……級' Private rcClass_ As String '……班' Private rcStyle_ As String '……戦法' Private styleNum_ As Integer '……戦法No.' Private isEliminated_ As Boolean '……失格フラグ'
……とまあ、選手のパラメータです。
アクセサ
'アクセサ' Public Property Get rcName() As String rcName = rcName_ End Property Public Property Get rcPhonetic() As String rcPhonetic = rcPhonetic_ End Property Public Property Get belongsTo() As String belongsTo = belongsTo_ End Property Public Property Get prefNum() As Integer prefNum = prefNum_ End Property Public Property Get graduateTerm() As Integer graduateTerm = graduateTerm_ End Property Public Property Get rcGrade() As String rcGrade = rcGrade_ End Property Public Property Get rcClass() As String rcClass = rcClass_ End Property Public Property Get rcStyle() As String rcStyle = rcStyle_ End Property Public Property Get styleNum() As Integer styleNum = styleNum_ End Property Public Property Get isEliminated() As Boolean isEliminated = isEliminated_ End Property
……とまあ、何の変哲もないコードです。例によってLetは作っていない。値のセットについては、別途メソッドを作る方が性に合っている気がする。これは完全に個人の好みです。
コンストラクタ
今回もありません。
メソッド
'メソッド' Public Sub setData(ByRef rcData As Racer) With rcData rcName_ = .rcName rcPhonetic_ = .rcPhonetic belongsTo_ = .belongsTo graduateTerm_ = .graduateTerm rcGrade_ = .rcGrade rcClass_ = .rcClass rcStyle_ = .rcStyle isEliminated_ = .isEliminated End With End Sub Public Sub setCode(ByVal pNum As Integer, _ ByVal sNum As Integer) prefNum_ = pNum styleNum_ = sNum End Sub
メソッドは2つ。一覧表から直に値を渡すことができるやつは、setDataメソッドで。ちなみに、メソッドの引数は自作の構造体で渡している。めんどくさいけど、書きやすさと読みやすさはバツグン。……ていうか、ここまでするんなら、いっそクラスをこのクラスのフィールドにしてしまえば良いような気もする。
んで、2つ目のsetCodeメソッドなんですが、元の表が、都道府県とか戦法なんかをベタの文字列で表しているのがそもそもの間違いなんですよねー。後で並べ替えのキーにすることが分かってるんだから、初めから振り番しといて、別の「都道府県番号表」とか「戦法番号表」なんかと紐付けしてりゃよかったんですよ。
データベースのなんたるかが全く分かってないやつ(まあ、私も大して分かってやしませんが)がデータ処理の基礎部分を作ってしまうと、後任の者が異様に苦労する、ということですな。
おっと、話がそれてしまった。
ともかく、都道府県と戦法については、後で並べ替えのキーにするために数値化しないといけない。そのために、「参照」シートでVLOOKUPなんか使っているわけなんですよ。
いや、もちろん、元データの表にVLOOKUPをゴリゴリ押し込むこともできるんですけど、VLOOKUPだらけの表ってなんか品がないような気がするんですよ。
リスト2 標準モジュールの宣言セクション
GambleRacerクラスのsetDataメソッドに引数を大量に渡すのがメンドクサイので、基礎データにあたる部分を構造体にして渡すことにした。その宣言が以下のコード。
Public Type Racer rcName As String '……名前' rcPhonetic As String '……ふりがな' belongsTo As String '……都道府県' graduateTerm As Integer '……卒業期' rcGrade As String '……級' rcClass As String '……班' rcStyle As String '……戦法' isEliminated As Boolean '……失格フラグ' End Type Dim racerData As Racer
……とまあ、こんな感じ。
次回予告
後は、GambleRacerクラスのインスタンスに、
- setDataメソッドを使って「選手データ」シートの各データをセットし、
- setCodeメソッドを使って都道府県番号、戦法番号をセットし、
- 「戦法別」または「都道府県別」シートに各パラメータを書き込ませる
ということをデータの数だけ繰り返したら、一覧表が完成することになる。
クラスって、作るまでが結構メンドウだけれど、一旦作ってしまうと、その後のプログラミングとメンテナンスが異様に楽になる。まだまだちゃんと使いこなせているわけではないけど、十分メリットを感じている。