Sub Triple_B(Work, LoopFlg) ' 行、列、あるいはブロックの3か所に3対の数字だけがある場合、他の場所のその数字は削除する。 Dim Counter, CounterX As Integer Dim I As Integer Dim I1, I2, I3 As Integer Dim ITop As Integer Dim J As Integer Dim J1, J2, J3 As Integer Dim K As Integer Dim L As Integer Dim JTop As Integer Dim N1, N2, N3 As Integer Dim Pair1, Pair2, Pair3 As String Dim S As String If LoopFlg <> "" Then Exit Sub '確定文字がすでに見つかっているのでこのサブルーチンは実施しない For I = 1 To 9 'I行で「3対」を探す For N1 = 1 To 7 For N2 = N1 + 1 To 8 For N3 = N2 + 1 To 9 Counter = 0 Pair1 = N1 '数値をPair1,Pair2,Pair3の文字変数に変換 Pair2 = N2 Pair3 = N3 For J = 1 To 9 If Len(Work(I, J)) = 2 Then If (InStr(Work(I, J), Pair1) > 0 And InStr(Work(I, J), Pair2) > 0) Or (InStr(Work(I, J), Pair1) > 0 And InStr(Work(I, J), Pair3) > 0) Or (InStr(Work(I, J), Pair2) > 0 And InStr(Work(I, J), Pair3) > 0) Then Counter = Counter + 1 J1 = J2 J2 = J3 J3 = J End If ElseIf Len(Work(I, J)) = 3 Then If InStr(Work(I, J), Pair1) > 0 And InStr(Work(I, J), Pair2) > 0 And InStr(Work(I, J), Pair3) > 0 Then Counter = Counter + 1 J1 = J2 J2 = J3 J3 = J End If End If Next J If Counter = 3 Then For J = 1 To 9 If J <> J1 And J <> J2 And J <> J3 Then S = Work(I, J) S = Replace(S, Pair1, "") S = Replace(S, Pair2, "") S = Replace(S, Pair3, "") If S <> Work(I, J) Then Work(I, J) = S LoopFlg = "Triple_B" End If End If Next J If LoopFlg <> "" Then Exit Sub End If Next N3 Next N2 Next N1 Next I For J = 1 To 9 'J列で「3対」を探す For N1 = 1 To 7 For N2 = N1 + 1 To 8 For N3 = N2 + 1 To 9 Counter = 0 Pair1 = N1 '数値をPair1,Pair2,Pair3の文字変数に変換 Pair2 = N2 Pair3 = N3 For I = 1 To 9 If Len(Work(I, J)) = 2 Then If (InStr(Work(I, J), Pair1) > 0 And InStr(Work(I, J), Pair2) > 0) Or (InStr(Work(I, J), Pair1) > 0 And InStr(Work(I, J), Pair3) > 0) Or (InStr(Work(I, J), Pair2) > 0 And InStr(Work(I, J), Pair3) > 0) Then Counter = Counter + 1 I1 = I2 I2 = I3 I3 = I End If ElseIf Len(Work(I, J)) = 3 Then If InStr(Work(I, J), Pair1) > 0 And InStr(Work(I, J), Pair2) > 0 And InStr(Work(I, J), Pair3) > 0 Then Counter = Counter + 1 I1 = I2 I2 = I3 I3 = I End If End If Next I If Counter = 3 Then For I = 1 To 9 If I <> I1 And I <> I2 And I <> I3 Then S = Work(I, J) S = Replace(S, Pair1, "") S = Replace(S, Pair2, "") S = Replace(S, Pair3, "") If S <> Work(I, J) Then Work(I, J) = S LoopFlg = "Triple_B" End If End If Next I If LoopFlg <> "" Then Exit Sub End If Next N3 Next N2 Next N1 Next J For ITop = 1 To 7 Step 3 'ブロックで「3対」を探す For JTop = 1 To 7 Step 3 For N1 = 1 To 7 For N2 = N1 + 1 To 8 For N3 = N2 + 1 To 9 Counter = 0 Pair1 = N1 '数値をPair1,Pair2,Pair3の文字変数に変換 Pair2 = N2 Pair3 = N3 CounterX = 0 For I = ITop To ITop + 2 For J = JTop To JTop + 2 CounterX = CounterX + 1 If Len(Work(I, J)) = 2 Then If (InStr(Work(I, J), Pair1) > 0 And InStr(Work(I, J), Pair2) > 0) Or (InStr(Work(I, J), Pair1) > 0 And InStr(Work(I, J), Pair3) > 0) Or (InStr(Work(I, J), Pair2) > 0 And InStr(Work(I, J), Pair3) > 0) Then Counter = Counter + 1 I1 = I2 I2 = I3 I3 = CounterX End If ElseIf Len(Work(I, J)) = 3 Then If InStr(Work(I, J), Pair1) > 0 And InStr(Work(I, J), Pair2) > 0 And InStr(Work(I, J), Pair3) > 0 Then Counter = Counter + 1 I1 = I2 I2 = I3 I3 = CounterX End If End If Next J Next I If Counter = 3 Then CounterX = 0 For I = ITop To ITop + 2 For J = JTop To JTop + 2 CounterX = CounterX + 1 If CounterX <> I1 And CounterX <> I2 And CounterX <> I3 Then S = Work(I, J) S = Replace(S, Pair1, "") S = Replace(S, Pair2, "") S = Replace(S, Pair3, "") If S <> Work(I, J) Then Work(I, J) = S LoopFlg = "Triple_B" End If End If Next J Next I If LoopFlg <> "" Then Exit Sub End If Next N3 Next N2 Next N1 Next JTop Next ITop End Sub