2014年6月11日水曜日

keisen


 このkeisenマクロは、Sheet 1 の EXCEL画面に盤面を描くものである。



 盤面とは、セルを区切る細い線とブロックを囲む太い線だけであるので、簡単なようだが EXCEL画面上にVBAで描かせるのは意外と難しいので、そのマクロ本体を下に紹介することとしよう。「コピペ」することで、 任意のナンプレ画面を描くことができます。

Sub keisen()
 Application.ScreenUpdating = False
 ars = ricj((ppp + 1), (qqq + 1))
 are = ricj((ppp + z), (qqq + z))
 ar = ars & ":" & are
  Range(ar).Borders.LineStyle = xlContinuous
For i = 1 To pt
 arrs = ricj((ppp + (i - 1) * ps + 1), (qqq + 1))
 arre = ricj((ppp + i * ps), (qqq + z))
 arr = arrs & ":" & arre
  Range(arr).BorderAround LineStyle:=xlContinuous, Weight:=xlMedium
Next i
For j = 1 To ps
 accs = ricj((ppp + 1), (qqq + (j - 1) * pt + 1))
 acce = ricj((ppp + z), (qqq + j * pt))
 acc = accs & ":" & acce
  Range(acc).BorderAround LineStyle:=xlContinuous, Weight:=xlMedium
Next j
'
 ars = ricj((ppp + 1), (qqq + 1))
 are = ricj((ppp + z), (qqq + z))
 ar = ars & ":" & are
  Range(ar).BorderAround LineStyle:=xlContinuous, Weight:=xlThick
 Application.ScreenUpdating = True
End Sub
'
Function ricj(i, j)
If j <= 26 Then
  jc = j
  ricj = qt(jc) & i
ElseIf j <= 52 Then
 jc = j - 26
  ricj = "A" & qt(jc) & i
ElseIf j <= 78 Then
 jc = j - 52
  ricj = "B" & qt(jc) & i
ElseIf j <= 104 Then
 jc = j - 78
  ricj = "C" & qt(jc) & i
Else
 MsgBox ("You indicate too large RANGE !!")
End
End If
End Function
'
Function qt(jc)
Select Case jc
 Case 1: qt = "A": Case 2: qt = "B": Case 3: qt = "C": Case 4: qt = "D": Case 5: qt = "E"
 Case 6: qt = "F": Case 7: qt = "G": Case 8: qt = "H": Case 9: qt = "I": Case 10: qt = "J"
 Case 11: qt = "K": Case 12: qt = "L": Case 13: qt = "M": Case 14: qt = "N": Case 15: qt = "O"
 Case 16: qt = "P": Case 17: qt = "Q": Case 18: qt = "R": Case 19: qt = "S": Case 20: qt = "T"
 Case 21: qt = "U": Case 22: qt = "V": Case 23: qt = "W": Case 24: qt = "X": Case 25: qt = "Y"
 Case 26: qt = "Z"
End Select
End Function

 ここに、(ppp,qqq) はSheet 1 上の盤面の原点の位置(左上のセルの座標)を表し、ps,pt はそれぞれ1ブロックの縦方向(行)および横方向(列)のセルの数を表す。また、z=ps*pt はナンプレの大きさを表す。これらの数値はbasic_settingで設定する。

ノーマル・ナンプレでは、9×981のセルを細線で囲み、3×39個のブロックを太線で囲む。すなわち、ps=pt=3 ,z=9 である。

16×16 大型ナンプレの場合、 ps=pt=4  z=16 
28×28 変形ナンプレの場合、 ps=4pt=7  z=28  である。

なお、このマクロは、EXCEL/VBA/2007 以前に対応するもので、列番号のアルファベットを数字に直す Function を使っています。

最後に、変形ナンプレ(全体12×12、ブロック 3×4)を keisen マクロを使って描いた例を示します。この場合、上のマクロにおいて、ps=3, pt=4, z=12 とおきます。



2014年6月1日日曜日

font_size_color

 マクロ font_size_color ( Sheet 1) および font_size_color_Sheet16 ( Sheet16) は、盤面内での数字(digit) の大きさと色により、その数字の持つ性質を区別する。

盤面のセルの色は、薄いダイダイ色で、
 表出数(Givens)は、 Font 18  Color 3 赤 
 決まった数(Answer)は、Font 14 Color 5 青
 候補の数(Candidate)は、Font 12 Color 1 黒
とする。

Sub font_size_color()
 Application.ScreenUpdating = False
  For i = 1 To z
    For j = 1 To z
      With Sheets("Sheet1").Cells(ppp + i, qqq + j)
      .Interior.ColorIndex = 36
      .Font.Bold = True
  If .Value = "" Then
      .Font.ColorIndex = 5
      .Font.Size = 14
  ElseIf IsNumeric(.Value) = False Then
      .Font.ColorIndex = 1
      .Font.Size = 12
  Else
      .Font.ColorIndex = 3
      .Font.Size = 18
  End If
      End With
    Next j
   Next i
 Application.ScreenUpdating = True
End Sub


 
 実例として、朝日新聞5月31日★5の問題を鉛筆で解く場合の盤面を表す。





局面は第2手目で「予約」(Hidden pair)で (7,2)=3 が決まるところである。
1手目は、「ブロッケン」Hidden Single で決まった (9,8)=3 が青色で示されている。
Hidden Pair Method では、各Block内での (HiddenPair を小さいfont で示している。

digit 1 から順にやっていくと、8 の段階で上の図の局面に到達する。Block 7 (左下)において、(7,1)=1368  の候補をもち、(8,3) =18 のセルと合わせて、「予約」Hidden pair of Block が完成して、(7,1)=18 となり、3および6が消去される。その結果、(7,2)=3Hidden Single になる。

また、(9,1)=6 もHidden Single となり、第3手目が決まる。同様に第4手目(9,2=5 も決まることになる。