EXCELで血統表を作ろう!

レベル12  もっとすごいマクロに挑戦  その2

−インブリード馬を表示する−

レベル11へ
EXCELで血統表を作ろう!  目次へ
トップページへ


【3代血統表を作る】

いよいよ実際のマクロを記述してみます.
5代血統表のインブリードを表示させるのが最終目標なのですが,これはかなり長い記述になってしまいますので,まずは3代血統表中のインブリード馬のフォントを変更するマクロを作ります.

というわけで,最初に3代血統表を作成します.
といっても,5代血統表がすでにありますので(5代血統表の作成がまだの方は,レベル9の最後にファイルがありますので,これをダウンロードしてください)これを一部変更して使います.

EXCELを起動し,5代血統表のファイルを開きます.
“DATA”(データベース)と“TABLE5”(5代血統表)の2つのシートがあると思いますが,このうち“TABLE5”シートを開きます.
メニューの「編集」→「シートの移動またはコピー」で,“TABLE5”の後ろ(いちばん後ろ)に“TABLE5”をコピーして貼り付けます.
シート名が自動的に“TABLE5 (2)”とつけられますが,これを“TABLE3”に変更します.

このシートの血統表のうち,4代目と5代目の部分にあたるG列〜J列を削除します.
この操作でF列右側の罫線が消えてしまったら,これを引き直してください.
また,H列以降のエラーチェック部分も,4代目〜5代目にあたる部分を削除してください.

これで3代血統表ができました.これを使ってマクロを記述していきます.


【マクロを記述する】

メニューの「ツール」→「マクロ」→「Visual Basic Editor」で,マクロを記述する画面を開きます.
この画面で,さらにメニューの「挿入」→「標準モジュール」を選択し,マクロを記述できるようにします.
(マクロの記述方法についてはレベル10を参考にしてください.)

まず最初にマクロ名(インブリード3代)を書きます.

Sub インブリード3代( )

'3代血統表中のインブリード馬のフォントを変更する

End Sub

1行目の“Sub インブリード3代( )”の下に,「 ' 」(シングルクォーテーション)で始まる緑色の行がありますが,これは「コメント行」と呼ばれ,マクロのプログラムそのものには関係のない記述です.
プログラムの実行には関係ないので,書かなくてもマクロは動きますが,こうしたコメント(メモ)を所々に入れておくと,あとで修正したり,別のプログラムで一部を利用したりするときにわかりやすいので,なるべく入れるようにしましょう.

このコメント行の下に,レベル11で作ったプログラムの流れにしたがって記述をしていきます.


【フォントの初期化】

まず表全体のフォントを初期化します.
マクロの3行目以降に次の記述を追加してください.

'表全体のフォントを初期化する

Range("A3:F34").Select
With Selection.Font
    .Name = "MS 明朝"
    .FontStyle = "標準"
    .Size = 11
End With

A3セル〜F34セルの範囲を選択し,この部分のフォントを次のように設定します.

  フォント名=MS 明朝
  スタイル=標準(太字,斜体などはしない)
  サイズ=11(ポイント)

このフォントが初期値となります.
マクロを実行すると,インブリード馬がいた場合,その馬名のフォントが変更になりますが,これを元に戻してやらないと,次の別の馬のフォント表示がおかしくなってしまいます.
したがって,マクロの最初に,まず表全体のフォントを元に戻す操作が必要になります.


【変数の宣言】

表中の馬名が記載されている位置に,各変数を割り当てます.
ここで注意しなければならないのは,セルと中身のデータの両方にそれぞれ別の変数を割り当てることです.
馬名の比較はセルの中身(データ)で行うので,これに対する変数が必要ですが,フォントの変更はセルに対して行うので,データの入れ物であるセル(範囲)にも変数が必要になるのです.

3代血統表中には15頭の馬がいるので,変数もそれぞれ15ずつ,合計30個に名前をつけて宣言します.
名前は基本的にどんなものでもかまいませんが(マクロが使用しているキーワードと同じ名前は使えません),あまり長くなく,あとで何の変数かわかりやすいものがよいでしょう.
ここでは,父親を“S”(Sire = 種牡馬 の略),母親を“D”(Dam = 繁殖牝馬 の略)とし,「父の父」は“SS”,「母の父の母」は“DSD”のように名前をつけます.血統表のタイトル部分に入る本人(馬?)については,“HORSE”とします.
また,セル範囲に対する変数は,「父」の位置に相当するセルには“RS”(Rは Range = 範囲 の略)のように,頭に“R”をつけた名前を設定します.

フォントの初期化の下に,次の記述を追加します.

'表中の馬名に変数を設定する
'S=父,D=母

Dim HORSE As String, RHORSE As Range

Dim S As String, RS As Range
Dim D As String, RD As Range

Dim SS As String, RSS As Range
Dim SD As String, RSD As Range
Dim DS As String, RDS As Range
Dim DD As String, RDD As Range

Dim SSS As String, RSSS As Range
Dim SSD As String, RSSD As Range
Dim SDS As String, RSDS As Range
Dim SDD As String, RSDD As Range
Dim DSS As String, RDSS As Range
Dim DSD As String, RDSD As Range
Dim DDS As String, RDDS As Range
Dim DDD As String, RDDD As Range

“Dim HORSE As String, RHORSE As Range”は,「“HORSE”という名前の文字列の変数と,“RHORSE”という名前の範囲の変数を宣言します」という意味です.文字列で宣言した変数には馬名が,範囲で宣言した変数にはセルが代入されます.


【変数に値を代入する】

それぞれの変数に,馬名とセル範囲を代入します.

'変数に値を代入する

Set RHORSE = Range("B1")

Set RS = Range("B13")
Set RD = Range("B24")

Set RSS = Range("D8")
Set RSD = Range("D13")
Set RDS = Range("D24")
Set RDD = Range("D29")

Set RSSS = Range("F5")
Set RSSD = Range("F8")
Set RSDS = Range("F13")
Set RSDD = Range("F16")
Set RDSS = Range("F21")
Set RDSD = Range("F24")
Set RDDS = Range("F29")
Set RDDD = Range("F32")

HORSE = RHORSE.Value

S = RS.Value
D = RD.Value

SS = RSS.Value
SD = RSD.Value
DS = RDS.Value
DD = RDD.Value

SSS = RSSS.Value
SSD = RSSD.Value
SDS = RSDS.Value
SDD = RSDD.Value
DSS = RDSS.Value
DSD = RDSD.Value
DDS = RDDS.Value
DDD = RDDD.Value

“Set RHORSE = Range("B1")”は,「“RHORSE”という名前の変数に“B1”セルを代入しなさい」という意味,“HORSE = RHORSE.Value”は,「“HORSE”という名前の変数に“RHORSE”の中身のデータを代入しなさい」という意味です.
2種類の変数で代入の仕方が違っていますが,こうしないと正しく代入されないので,この通りに記述してください.

上の例では,まず範囲の変数に各セル範囲を割り当て,次にその範囲の名前を使って中身のデータ(馬名)を文字列の変数に割り当てています.
先に馬名を変数に代入してからセル範囲を割り当ててもかまいませんが,そのときは次のような記述になります.

'変数に値を代入する

HORSE = Range("B1").Value

S = Range("B13").Value
D = Range("B24").Value

......

Set RHORSE = Range("B1")

Set RS = Range("B13")
Set RD = Range("B24")

......



【メインプログラムの記述】

いよいよメインプログラムの記述です.
ここでは,
  1.親−子の組を作る
  2.組の中から2つを取り出し,比較する
  3.親が同じで子が異なるときは,親のフォントを変更する
  4.すべての組について比較を行う
という操作をしていきます.

3代血統表には15頭の馬がいますが,本人(馬)には子がいませんので,親子の組は14組できます.
この組の中から2つを取り出す組合せは91通りありますが,実際にはこんなにたくさんの比較をする必要はありません.
たとえば,“父−子”の組と“母−子”の組は比較しても意味がありません.なぜなら,“父”と“母”が同じ馬ということはあり得ないからです.
また,“父”と“父の父”が同じということも絶対にありませんから,“父−子”と“父の父−父”の組も比較しなくていいことになります.

つまり,親が同一馬であることはあり得ない組合せは比較の対象から除外することができます.除外できる組合せとは,次の場合です.
  ・親同士の性別が異なる
  ・親同士が直系の親族
これらを除くと,比較する組合せは全部で32通りになります.


'馬名を比較し,インブリード馬のフォントを変更する

If S = DS And HORSE <> D Then
    RS.Select
        With Selection.Font
            .Name = "MS ゴシック"
            .FontStyle = "太字"
            .Size = 12
        End With
    RDS.Select
        With Selection.Font
            .Name = "MS ゴシック"
            .FontStyle = "太字"
            .Size = 12
        End With
End If

上の記述では,“S - HORSE”と“DS - D”の2つの組を比較し,S と DS が同一でなおかつ HORSE と D が異なるとき,S と DS のフォントを変更するという操作をしています.
実際には HORSE と D が同じ(子と母が同じ)ということはあり得ませんので,後半の条件は意味がありませんが,他の比較と記述をそろえるため,ここにも書いてあります.

比較する全組合せは次の通りです.

S−HORSE と DS−D
S−HORSE と DSS−DS
S−HORSE と DDS−DD

D−HORSE と SD−S
D−HORSE と SSD−SS
D−HORSE と SDD−SD

SS−S と DS−D
SS−S と SDS−SD
SS−S と DSS−DS
SS−S と DDS−DD

SD−S と DD−D
SD−S と SSD−SS
SD−S と DSD−DS
SD−S と DDD−DD

DS−D と SSS−SS
DS−D と SDS−SD
DS−D と DDS−DD

DD−D と SSD−SS
DD−D と SDD−SD
DD−D と DSD−DS

SSS−SS と SDS−SD
SSS−SS と DSS−DS
SSS−SS と DDS−DD

SSD−SS と SDD−SD
SSD−SS と DSD−DS
SSD−SS と DDD−DD

SDS−SD と DSS−DS
SDS−SD と DDS−DD

SDD−SD と DSD−DS
SDD−SD と DDD−DD

DSS−DS と DDS−DD

DSD−DS と DDD−DD

上の組合せについて,“If S = DS And HORSE <> D Then”〜“End If”の形の記述をします.
全部で32通りを間違いなく記述してください.(かなり面倒ですが,がんばってくださいね)

これでほとんどできあがりですが,このままだとマクロが終了したときに血統表全体を選択した状態で止まってしまうので,“End Sub”の上に次の記述を加えます.

    Range("B2").Select

これは,「B2セルを選択しなさい」という意味で,マクロの最後にカーソルがB2セルに移動します.


さあ,これでマクロの記述は完了しました.
次のレベル13でいよいよマクロを動かしてみましょう.


レベル13へ
EXCELで血統表を作ろう!  目次へ
トップページへ


address=http://cosmarr.com