Sub Pair_A(Work, LoopFlg) ' 行、列、あるいはブロックの2か所に対の数字があり、他の場所にはその数字がない場合(対タイプA)、2か所は他の数字があっても対の数字の場所と判断できる。 ' 2か所の対でない数字は削除する。 Dim I As Integer Dim I1 As Integer Dim I2 As Integer Dim ITop As Integer Dim J As Integer Dim J1 As Integer Dim J2 As Integer Dim K As Integer Dim L As Integer Dim JTop As Integer Dim N1, N2 As Integer Dim Pair1 As String Dim Pair2 As String Dim S(1 To 9) As String If LoopFlg <> "" Then Exit Sub '確定文字がすでに見つかっているのでこのサブルーチンは実施しない For I = 1 To 9 'I行でタイプAの「対」を探す For N1 = 1 To 8 For N2 = N1 + 1 To 9 ' 対N1とN2を1から9まで組み合わせる(整数) Pair1 = N1 '対をPair1とPair2の文字変数に変換 Pair2 = N2 For J1 = 1 To 8 ' Pair1, Pair2が見つかるまでJを進める。 If InStr(Work(I, J1), Pair1) > 0 Or InStr(Work(I, J1), Pair2) > 0 Then Exit For 'Pari1, Pari2がJ1番目で見つかった Next J1 If InStr(Work(I, J1), Pair1) > 0 And InStr(Work(I, J1), Pair2) > 0 And J1 < 9 Then ' Pair1とPair2両方があり、かつ次の対の余地が残っているか? '対がある。 もう一つの対探しに進む。 For J2 = J1 + 1 To 9 If InStr(Work(I, J2), Pair1) > 0 Or InStr(Work(I, J2), Pair2) > 0 Then Exit For ' Pair1かPair2があった Next J2 If InStr(Work(I, J2), Pair1) > 0 And InStr(Work(I, J2), Pair2) > 0 Then 'Pair1とPair2が共にあった If Len(Work(I, J1)) > 2 Or Len(Work(I, J2)) > 2 Then ' もう一つの対が見つかったので、それらに他の文字が含まれていたらタイプAである。 'I2が9未満であれば他にPair1またはPair2が無いかを確認に進む If J2 < 9 Then For K = J2 + 1 To 9 If InStr(Work(I, K), Pair1) > 0 Or InStr(Work(I, K), Pair2) > 0 Then Exit For 'Kが9以下であれば、対以外にもPair1,Pair2があるのでタイプAの対ではない Next K '最後までチェック(K=10)して「対」以外にPair1, Pair2がないのでタイプAの対である Else K = 10 'J2が9の場合Kを10にセット End If If K = 10 Then ' 対が見つかり、他の場所にPair1,Pair2共ないことを確認したので対の場所は対を代入する。 Work(I, J1) = Pair1 & Pair2 Work(I, J2) = Pair1 & Pair2 LoopFlg = "Pair_A" Exit Sub End If End If End If End If Next N2 Next N1 Next I For J = 1 To 9 'J列でタイプAの「対」を探す For N1 = 1 To 8 For N2 = N1 + 1 To 9 '対N1とN2を1から9まで組み合わせる(整数) Pair1 = N1 '対をPair1とPair2の文字変数に変換 Pair2 = N2 For I1 = 1 To 8 ' Pair1, Pair2が見つかるまでJを進める。 If InStr(Work(I1, J), Pair1) > 0 Or InStr(Work(I1, J), Pair2) > 0 Then Exit For 'Pari1, Pari2がI1番目で見つかった Next I1 If InStr(Work(I1, J), Pair1) > 0 And InStr(Work(I1, J), Pair2) > 0 And I1 < 9 Then ' Pair1とPair2両方があり、かつ次の対の余地が残っているか? '対がある。 もう一つの対探しに進む。 For I2 = I1 + 1 To 9 If InStr(Work(I2, J), Pair1) > 0 Or InStr(Work(I2, J), Pair2) > 0 Then Exit For ' Pair1かPair2があった Next I2 If InStr(Work(I2, J), Pair1) > 0 And InStr(Work(I2, J), Pair2) > 0 Then 'Pair1とPair2が共にあった If Len(Work(I1, J)) > 2 Or Len(Work(I2, J)) > 2 Then ' もう一つの対が見つかったので、それらに他の文字が含まれていたらタイプAである。 'I2が9未満であれば他にPair1またはPair2が無いかを確認に進む If I2 < 9 Then For K = I2 + 1 To 9 If InStr(Work(K, J), Pair1) > 0 Or InStr(Work(K, J), Pair2) > 0 Then Exit For 'Kが9以下であれば、対以外にもPair1,Pair2があるのでタイプAの対ではない Next K '最後までチェック(K=10)して「対」以外にPair1, Pair2がないのでタイプAの対である Else K = 10 'J2が9の場合Kを10にセット End If If K = 10 Then ' 対が見つかり、他の場所にPair1,Pair2共ないことを確認したので対の場所は対を代入する。 Work(I1, J) = Pair1 & Pair2 Work(I2, J) = Pair1 & Pair2 LoopFlg = "Pair_A" Exit Sub End If End If End If End If Next N2 Next N1 Next J For ITop = 1 To 7 Step 3 'ブロックでタイプAの「対」を探す For JTop = 1 To 7 Step 3 For N1 = 1 To 8 For N2 = N1 + 1 To 9 '対N1とN2を1から9まで組み合わせる(整数) Pair1 = N1 '対をPair1とPair2の文字変数に変換 Pair2 = N2 K = 0 For I = ITop To ITop + 2 For J = JTop To JTop + 2 K = K + 1 S(K) = Work(I, J) 'ブロックデータ(2次元)を1次元の変数Sに展開 Next J Next I ' Pair1, Pair2が見つかるまでJを進める。 For I1 = 1 To 8 If InStr(S(I1), Pair1) > 0 Or InStr(S(I1), Pair2) > 0 Then Exit For 'Pari1, Pari2がI1番目で見つかった Next I1 If InStr(S(I1), Pair1) > 0 And InStr(S(I1), Pair2) > 0 And I1 < 9 Then ' Pair1とPair2両方があり、かつ次の対の余地が残っているか? '対がある。 もう一つの対探しに進む。 For I2 = I1 + 1 To 9 If InStr(S(I2), Pair1) > 0 Or InStr(S(I2), Pair2) > 0 Then Exit For ' Pair1かPair2があった Next I2 If InStr(S(I2), Pair1) > 0 And InStr(S(I2), Pair2) > 0 Then 'Pair1とPair2が共にあった。 If Len(S(I1)) > 2 Or Len(S(I2)) > 2 Then ' もう一つの対が見つかったので、それらに他の文字が含まれていたらタイプAである。 'I2が9未満であれば他にPair1またはPair2が無いかを確認に進む If I2 < 9 Then For K = I2 + 1 To 9 If InStr(S(K), Pair1) > 0 Or InStr(S(K), Pair2) > 0 Then Exit For 'Kが9以下であれば、対以外にもPair1,Pair2があるのでタイプAの対ではない Next K '最後までチェック(K=10)して「対」以外にPair1, Pair2がないのでタイプAの対である Else K = 10 'J2が9の場合Kを10にセット End If If K = 10 Then ' 対が見つかり、他の場所にPair1,Pair2共ないことを確認したので対の場所は対を代入する。 L = 0 For I = ITop To ITop + 2 For J = JTop To JTop + 2 L = L + 1 If L = I1 Or L = I2 Then Work(I, J) = Pair1 & Pair2 'S(K)をブロックデータ(2次元)に代入 LoopFlg = "Pair_A" End If Next J Next I Exit Sub End If End If End If End If Next N2 Next N1 Next JTop Next ITop End Sub