Menu

Level 11 挑战更强大的宏 其1
-显示近亲繁殖马-

【血统表中的近亲繁殖】

通过Level 9,我们已经能够制作5代血统表了,但你是否觉得这个血统表还缺少些什么呢?
没错,我们无法一眼看出哪些马是近亲繁殖(Inbreeding)的。

在常见的血统表中,近亲繁殖的马名通常会用粗体或不同颜色的文字标注,以便一目了然地看出哪些马是近亲繁殖的(或者没有近亲繁殖)。

由于每匹马的近亲繁殖情况各不相同,因此像之前那样用函数来处理几乎是不可能的。
于是,我们将编写一个宏,从血统表中找出近亲繁殖的马,并修改其字体样式,从而制作一个更专业的血统表。

【如何显示近亲繁殖的马】

要找出“血统表中哪些马是近亲繁殖的”,似乎可以通过检查表中所有马的名字,列出重复的名字来实现……
但这种方法会导致以下问题。

如果将所有重复的马都视为近亲繁殖,血统表会变成这样:
蓝色粗体为近亲繁殖的马)

*Northern Taste     公 栗色 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

*Northern Taste与Lady Angela有“3×2”的近亲繁殖,但如果将所有重复的马都视为近亲繁殖,那么Lady Angela的父母及其祖先也会被标记为近亲繁殖,导致无法分辨真正的近亲繁殖马。

此外,如果Lady Angela的父亲之外还有其他Hyperion的血统,这显然意味着Hyperion的近亲繁殖,但这种方法无法区分这种情况。
因此,简单地选择重复的马并不能正确显示近亲繁殖。

那么,我们可以尝试将某匹马及其后代作为一个组,通过组之间的比较来检查。

以Lady Angela及其后代为一个组,血统表中会有两个Lady Angela的组:

Lady Angela - Nearctic
Lady Angela - Lady Victoria

这两个组的父母相同,但后代不同。在这种情况下,我们将父母视为近亲繁殖马。
如果父母和后代完全相同,则不视为近亲繁殖。例如,Hyperion(Lady Angela的父亲)的组:

Hyperion - Lady Angela
Hyperion - Lady Angela

这不会被标记为近亲繁殖。

通过这种方式,将血统表中的某匹马及其后代作为一个组,如果“父母相同但后代不同”,则该父母为近亲繁殖马。这样可以正确识别近亲繁殖马。

【程序流程】

既然我们已经知道如何找出近亲繁殖马,接下来将以此为核心,设计整个宏的流程。

1、重置表格字体(初始化)

首先,将血统表中所有马名的字体恢复为默认值。
这是因为每次运行宏时,前一次的结果(字体修改)可能会影响新表的显示。
因此,需要先将整个表的字体重置为初始值:

字体名称:MS 明朝
样式:标准(非粗体)
大小:11(磅)

近亲繁殖马的显示样式为:
字体名称:MS ゴシック
样式:粗体
大小:12(磅)

2、变量声明

由于每次血统表中的马名都不同,无法直接将马名写入宏中进行比较。
因此,我们需要使用“变量”——一种可以存储不同值的“虚拟容器”。
变量类似于数学中的“x”或“y”,可以根据需要存储不同的值。
我们需要声明所需的变量,并为每个变量指定名称和数据类型。

3、为变量赋值

声明变量后,将实际的马名赋值给这些变量。
由于无法直接将具体马名(如“Northern Taste”)写入宏中,我们需要通过指示来实现,例如:“将A变量的值设置为当前单元格的数据”,“将B变量的值设置为另一个单元格的数据”。

4、比较父母与后代的组

这是程序的核心部分。
使用两个变量分别表示父母与后代的组,比较两个组的父母是否相同,后代是否不同。
如果父母相同且后代不同,则将父母标记为近亲繁殖马,并修改其字体样式。
如果不满足条件,则不进行任何操作。
在这种情况下,可以使用与EXCEL函数“IF”功能相似的“If”关键字来实现条件判断。

程序的大致结构清楚了吗?
接下来,在Level 12中,我们将实际编写这个宏!