質問番号:1419196732

置換対象が同一列にあってうまく置換できません。
今、画像のようにデータが並んでおりまして。

北東→南東
北西→南西
南東→北東
南西→北西
南→北
北→南
東→西
西→東

と、置換したいのですが。
例えば、普通に北東を南東に置換した
場合、既に北東であったものは南東になりますが。
次に南東を北東に置換しようとした際、最初から南東であったものだけでなく、置換処理を行った後の南東も、北東になってしまうという状況でして。

何とか、同時に一気に置換できるような関数やマクロはないでしょうか。
あるいは、置換処理を行ったものについては、置換対象にしないような工夫というのでしょうか。
サンプルファイルはこちら http://xfs.jp/sBZskc に置きました。
よろしくお願い致します。

http://q.hatena.ne.jp/images/question/1419196/1419196732_thumbnail.png

回答1 VBAで変換(シート1に記述)

Option Explicit

Sub main()

Dim lp As Long              ' カウンタ
Dim RowCount As Long        ' 最終行

    RowCount = Range("A" & Rows.Count).End(xlUp).Row

    For lp = 1 To RowCount
        If Range("A" & lp) <> "" Then
            Select Case Range("A" & lp)
                Case "北"
                    Range("B" & lp) = "南"
                Case "南"
                    Range("B" & lp) = "北"
                Case "東"
                    Range("B" & lp) = "西"
                Case "西"
                    Range("B" & lp) = "東"

                Case "北西"
                    Range("B" & lp) = "南西"
                Case "北東"
                    Range("B" & lp) = "南東"
                Case "南西"
                    Range("B" & lp) = "北西"
                Case "南東"
                    Range("B" & lp) = "北東"
            End Select
        End If
    Next lp

End Sub

回答2 ユーザー関数で変換(標準モジュールに記述)

Function ChangeDirection(Direction As String) As String

    Select Case Left(Direction, 1)
        Case "北"
            ChangeDirection = Replace(Direction, "北", "南")
        Case "南"
            ChangeDirection = Replace(Direction, "南", "北")
        Case "東"
            ChangeDirection = Replace(Direction, "東", "西")
        Case "西"
            ChangeDirection = Replace(Direction, "西", "東")
    End Select

End Function


(変換したいセルにユーザー関数を挿入)

回答2' 回答2で作ったユーザー関数を用いてVBAで変換

Option Explicit

Sub main()

Dim lp As Long              ' カウンタ
Dim RowCount As Long        ' 最終行

    RowCount = Range("A" & Rows.Count).End(xlUp).Row

    For lp = 1 To RowCount
        If Range("A" & lp) <> "" Then
            Range("B" & lp) = ChangeDirection(Range("A" & lp))
        End If
    Next lp

End Sub

(ChangeDirection関数はシート1、標準モジュールどちらに記述しても可)

回答3 エクセル関数で変換

=IF(A2="","",IF(LEN(A2)=2,IF(A2="北西","南西",IF(A2="北東","南東",IF(A2="南西","北西","北東"))),IF(A2="北","南",IF(A2="南","北",IF(A2="東","西","東")))))

(以下B列にコピー)