レベル11 もっとすごいマクロに挑戦 その1 −インブリード馬を表示する− |
EXCELで血統表を作ろう! 目次へ | トップページへ |
レベル9までで5代血統表が作れるようになったと思いますが,この血統表,何か物足りない気がしませんか? そうです,インブリード(クロス)になっている馬がどれかわからないんです. よく見る血統表では,インブリード馬の馬名が太字になっていたり,文字の色が変えてあったりして,一目で何がインブリードになっているのか(あるいはインブリードがないのか)がわかるようになっています. どの馬がインブリードになるのかは,それぞれの馬(血統表)によって異なりますので,今までのように関数で対応するのはほとんど不可能です. そこで,血統表の中からインブリード馬を探し,その馬名のフォントを変えるマクロを組んで本格的な血統表を作成してみましょう. |
「血統表中のどの馬がインブリードになっているか」を調べるには,表の中のすべての馬の名前を調べ,重複しているものをリストアップすればいい... ような気がしますね. しかし,このようなやり方で重複馬をすべてインブリードと見なして表示させると,次のような血統表になってしまいます. (青の太字がインブリード馬です) |
*ノーザンテースト 牡 栗毛 1971年生 |
Northern Dancer 鹿毛 1961 Lady Victoria 黒鹿毛 1962 | Nearctic 黒鹿毛 1954 Natalma 鹿毛 1957 | Nearco 黒鹿毛 1935 Lady Angela 栗毛 1944 | Pharos Nogara | Phalaris Scapa Flow |
Havresac Catnip | ||||
Hyperion Sister Sarah | Gainsborough Selene | |||
Abbots Trace Sarita | ||||
Native Dancer 芦毛 1950 Almahmoud 栗毛 1947 | Polynesian Geisha | Unbreakable Black Polly | ||
Discovery Miyako | ||||
Mahmoud Arbitrator | Blenheim Mah Mahal | |||
Peace Chance Mother Goose | ||||
Victoria Park 鹿毛 1957 Lady Angela 栗毛 1944 | Chop Chop 鹿毛 1940 Victoriana 栗毛 1952 | Flares Sceptical | Gallant Fox Flambino | |
Buchan Clodagh | ||||
Windfields Iribelle | Bunty Lawless Nandi | |||
Osiris Belmona | ||||
Hyperion 栗毛 1930 Sister Sarah 黒鹿毛 1930 | Gainsborough Selene | Bayardo Rosedrop | ||
Chaucer Serenissima | ||||
Abbots Trace Sarita | Tracery Abbots Anne | |||
Swynford Molly Desmond |
*ノーザンテーストは Lady Angela:3×2 のインブリードを持ちますが,重複する馬の名前をすべてインブリードとしてしまうと,Lady Angela の両親やそのまた両親までインブリードということになり,本当のインブリード馬がどれかわからなくなってしまいます. また,Lady Angela の父親以外に Hyperion が含まれていれば,これは当然 Hyperion のインブリードを持つことになりますが,この場合との区別がつきません. したがって,単純に重複する馬を選び出すだけでは,正しく表示できないことになります. では,ある馬とその子供を1つの組として,組ごとの比較で調べる方法を考えてみましょう. Lady Angela とその子供を1つの組とすると,血統表中には Lady Angela の組が2つ存在します. Lady Angela − Nearctic Lady Angela − Lady Victoria この2組は,親は同じですが子供は異なります. このような場合,親をインブリード馬と見なします. 親と子が全く同じ組合せはインブリードではないと考えれば,Lady Angela の父親である Hyperion の組 Hyperion − Lady Angela Hyperion − Lady Angela はインブリードにはなりません. このように,血統表中のある馬とその子供を1つの組として考え, 親が同じで子が違うとき,その親はインブリード馬である とすれば,正しくインブリード馬を選ぶことができます. |
インブリード馬を探す方法がわかりましたので,これをメインの部分とし,マクロ全体を考えていきます. 1.表のフォントを元に戻す(初期化) まず最初に,血統表中の馬名のフォントを元に戻します. ...というと何か変な気がしますが,このマクロは新しい血統表を作成するたびに動かすものですから,前のマクロの結果(フォントの変更)が残っていると,あとで作成した表のフォント変更が正しく行われなくなります. そのため,最初に表全体のフォントを元に戻す操作が必要になります. ここでは, フォント名=MS 明朝 スタイル=標準(太字なし) サイズ=11(ポイント) の設定を初期値とします. インブリード馬の表示は次のようになります. フォント名=MS ゴシック スタイル=太字 サイズ=12(ポイント) 2.変数の宣言 血統表の馬名は毎回異なりますから,馬の名前を直接マクロに書き込み,比較することはできません. そこで,名前をつけた「仮の箱」を用意しておき,箱の名前を使ってマクロを記述します. この仮の箱は「変数」と呼ばれます.変数はその名の通り,「値が変わる数」で,数学の“x”(エックス)や“y”(ワイ)のように,そのときどきで違う値を代入して使う記号だと考えてください. 必要な変数を用意し,それぞれの変数に違う名前をつけ,変数に入る値の種類を限定することを「変数の宣言」といいます. 3.変数に値を代入する 変数に名前をつけたら,その変数に実際の馬の名前を代入します. このときも,“ノーザンテースト”のような具体名を直接マクロに記述することはできませんから,「Aという変数には,このセル番地に入っているデータを入れなさい」「Bという変数には,あのセル番地に入っているデータを入れなさい」−−というように指示します. 4.親子の組を比較する いよいよメインプログラムの記述です. 変数を2つ使って親子の組を作り,2つの組で親同士が同じかどうか,子同士が同じかどうかを比較します. 親が等しくかつ子が異なるときは,親をインブリード馬とし,親に当たる変数のフォントを変更します.この条件に当てはまらないときは,何もしません. このように,条件によって異なる処理をさせる場合には,EXCELの関数で用いられる“IF”と同じように働く“If”というキーワードを使います. |
プログラムのだいたいの構造はわかりましたか. では,いよいよ次のレベル12で実際のマクロを書いてみましょう. |
レベル12へ | EXCELで血統表を作ろう! 目次へ | トップページへ |