名簿作りマクロ(1)

人物データを元に名簿を作成するマクロ

配置転換で行った先で見たもの

新年度の配置転換で、新しい部署に行くことになった。んで、早速名簿作りをしないといけなくなった。

だいたいこんな感じのものが出てきたと思ってください。

f:id:akashi_keirin:20170409201614j:plain

f:id:akashi_keirin:20170409201629j:plain

どうやら、

f:id:akashi_keirin:20170409201644j:plain

こんな元データを作って、それをいろんな条件で並び替えてコピペすることによって、注目するキーごとの名簿を作っていたみたいだ。あ、もちろん画像はイメージですよ。実際にはもっとたくさんパラメータのある大がかりな表です。

せいぜい200人分ぐらいの名簿だから、大したことないといえば大したことのない名簿作りだけど、よくやるよ、ホントに。

ナマケモノの私は、もちろんマクロでやることを考えましたよ。たとえ1回こっきりでもマクロでやりますね。だって、その方が楽しいから(キリッ

方針

もちろん、クラスモジュール入門者なので、今回も無駄にクラスモジュール使いますよ。

それぞれのワークシートはこんな感じ。

f:id:akashi_keirin:20170409210413j:plain

f:id:akashi_keirin:20170409210428j:plain

f:id:akashi_keirin:20170409210440j:plain

んで、「参照」と名付けたシートのB1~E1セルには、

f:id:akashi_keirin:20170409210537j:plain

f:id:akashi_keirin:20170409210549j:plain

f:id:akashi_keirin:20170409210601j:plain

f:id:akashi_keirin:20170409210611j:plain

こんな風に、名前を定義したり、数式を入れたりしている。

処理の手順としては、

  1. 選手を表すクラスを作る
  2. 「選手データ」シート1行分のデータを選手クラスのインスタンスに持たせる
  3. 「戦法別」または「都道府県別」シートにデータを転記する
  4. 全部転記し終わったらそのシートにふさわしいやり方でデータを並べ替える

とまあ、こんなところか。

選手クラスを作る

リスト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クラスのインスタンスに、

  1. setDataメソッドを使って「選手データ」シートの各データをセットし、
  2. setCodeメソッドを使って都道府県番号、戦法番号をセットし、
  3. 「戦法別」または「都道府県別」シートに各パラメータを書き込ませる

ということをデータの数だけ繰り返したら、一覧表が完成することになる。

クラスって、作るまでが結構メンドウだけれど、一旦作ってしまうと、その後のプログラミングとメンテナンスが異様に楽になる。まだまだちゃんと使いこなせているわけではないけど、十分メリットを感じている。

@akashi_keirin on Twitter