Sub OnlyOne(Work, LoopFlg) ' 行、列およびブロックで確定以外の枠で文字が一回だけ出てくる場合、その文字は確定である Dim I, J As Integer '行列番号 Dim ITop, JTop As Integer ' ブロックの左上の行列番号 Dim Number As Integer 'OnlyOneの数字 Dim S, Sa As String Dim Moji(1 To 9) As String If LoopFlg <> "" Then Exit Sub '確定文字がすでに見つかっているのでこのサブルーチンは実施しない ' Moji配列に 文字の1から9をいれる。 For I = 1 To 9 Moji(I) = I Next I '横の行でOnlyOneを探す For I = 1 To 9 Sa = "" For J = 1 To 9 If Len(Work(I, J)) > 1 Then Sa = Sa & Work(I, J) 'I行の未確定枠のデータをすべて結合する Next J For Number = 1 To 9 S = Sa If InStr(S, Moji(Number)) > 0 Then '0は確定枠であり、0の場合何もしない S = Replace(S, Moji(Number), "", 1, 1) 'Moji(Number)を一つ取り除く If InStr(S, Moji(Number)) = 0 Then '0であるならば、この行にはMoji(Number)は1つである For J = 1 To 9 If InStr(Work(I, J), Moji(Number)) > 0 Then 'Moji(Number)を1つ削除したらもう見つからない。すなわち一つしかなかったと判断できる。 Work(I, J) = Moji(Number) '該当枠をMoji(Number)で埋める LoopFlg = "OnlyOne" 'サブルーチン名を代入 Exit Sub '確定がでたのでメインプログラムに戻る End If Next J End If End If Next Number Next I '縦の列でOnlyOneを探す For J = 1 To 9 Sa = "" For I = 1 To 9 If Len(Work(I, J)) > 1 Then Sa = Sa & Work(I, J) 'I列の未確定枠のデータをすべて結合する Next I For Number = 1 To 9 S = Sa If InStr(S, Moji(Number)) > 0 Then '0は確定枠であり、0の場合何もしない S = Replace(S, Moji(Number), "", 1, 1) 'Moji(Number)を一つ取り除く If InStr(S, Moji(Number)) = 0 Then '0であるならば、この行にはMoji(Number)は1つである For I = 1 To 9 If InStr(Work(I, J), Moji(Number)) > 0 Then Work(I, J) = Moji(Number) '該当枠をMoji(Number)で埋める LoopFlg = "OnlyOne" Exit Sub End If Next I End If End If Next Number Next J 'ブロックでOnlyOneを探す For ITop = 1 To 7 Step 3 For JTop = 1 To 7 Step 3 Sa = "" For I = ITop To ITop + 2 For J = JTop To JTop + 2 If Len(Work(I, J)) > 1 Then Sa = Sa & Work(I, J) ' (ITop,JTop)ブロックの未確定枠のデータをすべて結合する Next J Next I For Number = 1 To 9 S = Sa If InStr(S, Moji(Number)) > 0 Then '0は確定枠であり、0の場合何もしない S = Replace(S, Moji(Number), "", 1, 1) 'Moji(Number)を一つ取り除く If InStr(S, Moji(Number)) = 0 Then '0であるならば、この行にはMoji(Number)は1つである For I = ITop To ITop + 2 For J = JTop To JTop + 2 If InStr(Work(I, J), Moji(Number)) > 0 Then Work(I, J) = Moji(Number) '該当枠をMoji(Number)で埋める LoopFlg = "OnlyOne" Exit Sub End If Next J Next I End If End If Next Number Next JTop Next ITop End Sub