ブロック候補- 入力されているブロックのデータを調べて、「調査する数字」が置けるかをチェックします。
仕様
あるブロック内のセルに注目し、既に数字が入力さ
れている場合、または、
そのブロック内に「調査する数字」が存在する場合 は、そのブロック全体を「候補無し」とて「0」とします。
- 空白でなく「0」にするのは、後の計算の都合
ブロックに於ける判定は行列の場合と少し異なります。
行列の場合は複合参照で範囲を特定できますが、ブロックの場合は、所属するブロックを特定する必要があります。
ブロックごとに数式を設定(ブロック単位のコピーを含む)することもできますが、後々、面倒なことになります。
そこで、ここでは、セルの行列番号から所属するブロック位置を計算で求めます。
セルの相対行および列番号(全体ブロックの左上から、0,1,2,3,4 ・・ とする)をR,Cとする場合、
小ブロックの開始相対行 : 3*INT(R/3)
小ブロックの開始列対行 : 3*INT(C/3)
で表せます。
また、R,Cは、
R = セルの行番号-全体ブロックの開始行
C = セルの行番号-全体ブロックの開始列
および、行および列番号を求める関数
ROW(),COLUMN()
を使用して、下図のような表として表せます。
行位置表 : 3*(INT((ROW()-ROW($C$38))/3))
列位置表 ; 3*(INT((COLUMN()-COLUMN($O$38))/3))
それぞれのセルに対して、ブロックを対応させたものが下図下段の表。
これにより、セルからブロック位置を求めることができます。
候補
上図のブロック位置表から、
OFFSET関数は、基点位置を指定行、列数分シフトさ
せる関数です。
(パラメータにより、サイズも変更可 - 上記の3,3は小ブロックのサイズを表す)
COUNTIF関数で、小ブロック内にある「調査する数字」の個数を調査。
下図の「ブロック」で色が付いている部分がブロック内に「6」を置ける候補セル
次項で、行列の候補と総合して、「調査する数字」が置けるセルをハイライト表示します。