〇×反転

〇なら×に、×なら〇に、オセロのように反転させたいことがあります。
ユーザー定義関数を作ってみました。

Function CrossingOver(str As String) As String
    Select Case str
        Case "〇"
            CrossingOver = "×"
        Case "×"
            CrossingOver = "〇"
    End Select
End Function

Sub test()
    MsgBox CrossingOver("〇")
End Sub

これはこれで動くのですが、もう少し短くしてみたい。
ということで、こんな風に改造してみました。

Function CrossingOver(str As String) As String    
    CrossingOver = Chr(-64808 - Asc(str))
End Function

文字や記号は、数字で管理されています。
その番号を知ることが出来るのが、ASC関数です。
 ASC("〇")=-32422
 ASC("×")=-32386
従って、これらの合計から〇の番号を引けば×に、×の番号を引けば〇になるわけです。
※計算結果は、Chr関数で記号に戻してあげましょう。

しかしこの関数、重大な欠陥があります。〇と×以外の文字を与えられると、全く関係ない記号を返してしまうのです。

Sub test()
    MsgBox CrossingOver("◎")
End Sub

f:id:Infoment:20180704202422p:plain

これを防ぐためには、引数で得た値の選別が必要です。〇と×以外のときは、「参照文字エラー」を返してみました。

Function CrossingOver(str As String) As String
    Select Case str
        Case "〇", "×"
            CrossingOver = Chr(-64808 - Asc(str))
        Case Else
            CrossingOver = "参照文字エラー"
    End Select
End Function

結局、元のコードより長くなってしまいました。短くする試み、失敗です。

参考まで