Sub SameBlock(Work, LoopFlg) ' 行(または列)の文字が同一ブロックにだけあると、その文字は同一ブロックの他の行(または他の列)には入らない。 Dim Counter As Integer Dim Ia(1 To 9) As Integer Dim Ja(1 To 9) As Integer Dim I, ITop, Ix As Integer Dim J, JTop, Jx As Integer Dim Moji As String Dim Number As Integer Dim S As String If LoopFlg <> "" Then Exit Sub '確定文字がすでに見つかっているのでこのサブルーチンは実施しない For Number = 1 To 9 Moji = Number '行(横)で数字を調べる。 '数字が同じブロックに2個(または3個)あり、他のブロックに無ければ、数字のあるブロックの他の行にその数字があってはいけない。 '正であればブロックの他の枠から数字を削除 For I = 1 To 9 Counter = 0 For J = 1 To 9 If InStr(Work(I, J), Moji) > 0 Then Counter = Counter + 1 Ja(Counter) = J End If Next J If Counter <= 1 Then ' 文字は1か所だけなので何もしない ElseIf Counter = 2 Or Counter = 3 Then '正しければ文字は2か所または3か所である If Counter = 2 Then Ja(3) = Ja(2) '2変数を3変数と同様に処理をするため2変数の時はI3にI2データを代入。 If BlockTop(Ja(1)) = BlockTop(Ja(2)) And BlockTop(Ja(1)) = BlockTop(Ja(3)) Then '正しければ、同じブロックにある For Ix = BlockTop(I) To BlockTop(I) + 2 For Jx = BlockTop(Ja(1)) To BlockTop(Ja(1)) + 2 If Ix <> I Then S = Work(Ix, Jx) Work(Ix, Jx) = Replace(Work(Ix, Jx), Moji, "") If S <> Work(Ix, Jx) Then LoopFlg = "SameBlock" End If Next Jx Next Ix If LoopFlg <> "" Then Exit Sub End If End If Next I '列(縦)で数字を調べる。 '数字が同じブロックに2個(または3個)あり、他のブロックに無ければ、数字のあるブロックの他の行にその数字があってはいけない。 '正であればブロックの他の枠から数字を削除 For J = 1 To 9 Counter = 0 For I = 1 To 9 If InStr(Work(I, J), Moji) > 0 Then Counter = Counter + 1 Ia(Counter) = I End If Next I If Counter <= 1 Then ' 文字は1か所だけなので何もしない ElseIf Counter = 2 Or Counter = 3 Then '正しければ文字は2か所または3か所である If Counter = 2 Then Ia(3) = Ia(2) '2変数を3変数と同様に処理をするため2変数の時はI3にI2データを代入。 If BlockTop(Ia(1)) = BlockTop(Ia(2)) And BlockTop(Ia(1)) = BlockTop(Ia(3)) Then '正しければ、同じブロックにある For Ix = BlockTop(Ia(1)) To BlockTop(Ia(1)) + 2 For Jx = BlockTop(J) To BlockTop(J) + 2 If Jx <> J Then S = Work(Ix, Jx) Work(Ix, Jx) = Replace(Work(Ix, Jx), Moji, "") If S <> Work(Ix, Jx) Then LoopFlg = "SameBlock" End If Next Jx Next Ix If LoopFlg <> "" Then Exit Sub End If End If Next J 'ブロックで数字を調べる。 '数字が同じ行(または列)に2個(または3個)あり、他の行(または列)に無ければ、数字のない行(または列)の他のブロックにその数字があってはいけない。 '正であれば他のブロックの同じ行(または列)から数字を削除 For ITop = 1 To 7 Step 3 For JTop = 1 To 7 Step 3 Counter = 0 For J = JTop To JTop + 2 For I = ITop To ITop + 2 If InStr(Work(I, J), Moji) > 0 Then Counter = Counter + 1 Ia(Counter) = I Ja(Counter) = J End If Next I Next J If Counter <= 1 Then ' 文字は1か所だけなので何もしない ElseIf Counter = 2 Or Counter = 3 Then '文字は2か所または3か所であるとなる) If Counter = 2 Then Ia(3) = Ia(2) '2変数を3変数と同様に処理をするため2変数の時はI3にI2データを代入。 Ja(3) = Ja(2) End If If Ia(1) = Ia(2) And Ia(1) = Ia(3) Then '正しければ、同じ行にある For Jx = 1 To 9 If Jx <> Ja(1) And Jx <> Ja(2) And Jx <> Ja(3) Then S = Work(Ia(1), Jx) Work(Ia(1), Jx) = Replace(Work(Ia(1), Jx), Moji, "") If S <> Work(Ia(1), Jx) Then LoopFlg = "SameBlock" End If Next Jx End If If Ja(1) = Ja(2) And Ja(1) = Ja(3) Then '正しければ、同じ列にある For Ix = 1 To 9 If Ix <> Ia(1) And Ix <> Ia(2) And Ix <> Ia(3) Then S = Work(Ix, Ja(1)) Work(Ix, Ja(1)) = Replace(Work(Ix, Ja(1)), Moji, "") If S <> Work(Ix, Ja(1)) Then LoopFlg = "SameBlock" End If Next Ix End If If LoopFlg <> "" Then Exit Sub End If Next JTop Next ITop Next Number End Sub