Sub Palindrome2(Str As String) '回文判定マクロ
Dim i As Integer Dim Str2 As String '反対から並べ替える For i = Len(Str) To 1 Step -1 Str2 = Str2 + Mid(Str, i, 1) Next i Dim flag As Integer flag = 0 '回文かどうかの判定 For i = Len(Str) To 1 Step -1 Select Case Asc(Mid(Str, i, 1)) Case -32056 To -32052, -32036 To -32032, -32025 To -32021, -32018 To -32015 '濁音などなし If Mid(Str, i, 1) <> Mid(Str2, i, 1) Then flag = flag + 1 End If Case -32087 To -32064 '濁音あり(か~ち) '偶数が濁音 If Asc(Mid(Str, i, 1)) Mod 2 = 0 Then If Mid(Str, i, 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) - 1) <> Mid(Str2, i, 1) Then flag = flag + 1 End If Else If Mid(Str, i, 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) + 1) <> Mid(Str2, i, 1) Then flag = flag + 1 End If End If Case -32060 To -32057 '濁音あり(て~と) '奇数が濁音 If Asc(Mid(Str, i, 1)) Mod 2 = 0 Then If Mid(Str, i, 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) + 1) <> Mid(Str2, i, 1) Then flag = flag + 1 End If Else If Mid(Str, i, 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) - 1) <> Mid(Str2, i, 1) Then flag = flag + 1 End If End If Case -32051 To -32037 'はばぱ行 If ((Asc(Mid(Str, i, 1)) + 32051) Mod 3) = 0 Then 'は行 If Mid(Str, i, 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) + 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) + 2) <> Mid(Str2, i, 1) Then flag = flag + 1 End If ElseIf ((Asc(Mid(Str, i, 1)) + 32051) Mod 3) = 1 Then 'ば行 If Mid(Str, i, 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) - 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) + 1) <> Mid(Str2, i, 1) Then flag = flag + 1 End If ElseIf ((Asc(Mid(Str, i, 1)) + 32051) Mod 3) = 2 Then 'ぱ行 If Mid(Str, i, 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) - 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) - 2) <> Mid(Str2, i, 1) Then flag = flag + 1 End If End If Case -32063 To -32061 'つづっ If Mid(Str, i, 1) = "つ" Then If Mid(Str, i, 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) - 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) + 1) <> Mid(Str2, i, 1) Then flag = flag + 1 End If ElseIf Mid(Str, i, 1) = "づ" Then If Mid(Str, i, 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) - 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) - 2) <> Mid(Str2, i, 1) Then flag = flag + 1 End If ElseIf Mid(Str, i, 1) = "っ" Then If Mid(Str, i, 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) + 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) + 2) <> Mid(Str2, i, 1) Then flag = flag + 1 End If End If Case -32097 To -32088, -32031 To -32026 'あいうえお、やゆよ(小さい音あり) If (Asc(Mid(Str, i, 1)) Mod 2) = 0 Then If Mid(Str, i, 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) - 1) <> Mid(Str2, i, 1) Then flag = flag + 1 End If Else If Mid(Str, i, 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) + 1) <> Mid(Str2, i, 1) Then flag = flag + 1 End If End If Case -32020 To -32019 'ゎわ If Mid(Str, i, 1) = "ゎ" Then '小さい音 If Mid(Str, i, 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) - 1) <> Mid(Str2, i, 1) Then flag = flag + 1 End If ElseIf Mid(Str, i, 1) = "わ" Then If Mid(Str, i, 1) <> Mid(Str2, i, 1) And _ Chr(Asc(Mid(Str, i, 1)) + 1) <> Mid(Str2, i, 1) Then flag = flag + 1 End If End If Case Else 'その他 If Mid(Str, i, 1) <> Mid(Str2, i, 1) Then flag = flag + 1 End If End Select Next i If flag = 0 Then MsgBox "「" & Str & "」は回文です。" Else MsgBox "「" & Str & "」回文ではありません。" & Chr(10) & _ "逆は「" & Str2 & "」" & Chr(10) & _ "flag = " & flag End If End Sub
Sub macro110319c() 'Palindrome2使用例
Call Palindrome2("つつみがみっつ") End Sub |
コメント