全角の漢字やひらがなはそのままで、なぜかカタカナだけ半角にしろという。いまどき半角カナってねぇ〜。21世紀ですぜ、ダンナ。
Excel VBAで全角カナを半角カナにするファンクションです。
str = ZenKana2HanKana(str) で変換できます。
ミソは長音(ー)が共通のコードなので、1文字前がカナだったら半角に変換するようにしています。
VBAなんて久々でこれでいいのか不安ですが、まぁ、動いてます(w
ソースそのままなので半角カナが入ってますが…スイマセン。
'//=========================================
'// ZenKana2HanKana
'//-----------------------------------------
'// 全角カナを半角カナにして返す
'//=========================================
Private Function ZenKana2HanKana(pStr As String) As String
Dim i As Integer
Dim str1 As String
Dim preStrKanaFlg As Boolean
ZenKana2HanKana = ""
'// 1文字前の文字がカナかどうか判断するフラグ
'// ー(長音)を判断するために使う
preStrKanaFlg = False
'// 文字列数ぶんだけ繰り返す
For i = 1 To Len(pStr)
str1 = Mid(pStr, i, 1)
'// ア〜ミ(0x8340〜0x837E)
'// ム〜ワ(0x8380〜0x838F)
'// ヰヱ(0x8390、0x8391)これは変換できないのでイエにする
'// ヲン(0x8392、0x8393)
'// ヴヵヶ(0x8394〜0x8396)ヵヶは変換しても全角なのでカケにする
'// 0x837Fは未定義文字となっている
'// 理由は「0x837f」でググれ
'// Shift-JISの文字では 2byteの文字の中で
'// 2byteめが 0x7F となる文字は定義されていません。
If ChkZenKana(str1) Then
'// 通常以外のカナの場合は特別に処理する
Select Case str1
Case "ヰ"
ZenKana2HanKana = ZenKana2HanKana & "イ"
Case "ヱ"
ZenKana2HanKana = ZenKana2HanKana & "エ"
Case "ヵ"
ZenKana2HanKana = ZenKana2HanKana & "カ"
Case "ヶ"
ZenKana2HanKana = ZenKana2HanKana & "ケ"
Case Else
ZenKana2HanKana = ZenKana2HanKana & StrConv(str1, vbNarrow)
End Select
'// 1文字前カナフラグを立てる
preStrKanaFlg = True
Else
'//1文字前がカナ、かつ"ー"(長音)の場合はカナの長音として判断
If str1 = "ー" And preStrKanaFlg = True Then
ZenKana2HanKana = ZenKana2HanKana & "ー"
Else
ZenKana2HanKana = ZenKana2HanKana & str1
End If
'// 1文字前カナフラグを消す
preStrKanaFlg = False
End If
Next
End Function
'//=========================================
'// ChkZenKana
'//-----------------------------------------
'// 文字列中に1文字でも全角カナがあればTrueを返す
'//=========================================
Private Function ChkZenKana(pStr As String) As Boolean
Dim i As Integer
Dim str1 As String
ChkZenKana = False
For i = 1 To Len(pStr)
str1 = Mid(pStr, i, 1)
'// ア〜ミ(0x8340〜0x837E)
'// ム〜ワ(0x8380〜0x838F)
'// ヰヱ(0x8390、0x8391)
'// ヲン(0x8392、0x8393)
'// ヴヵヶ(0x8394〜0x8396)
'// 0x837Fは未定義文字となっている
'// 理由は「0x837f」でググれ
'// Shift-JISの文字では 2byteの文字の中で
'// 2byteめが 0x7F となる文字は定義されていません。
If (&H8340 <= Asc(str1) And Asc(str1) <= &H8396) _
And Asc(str1) <> &H837F Then
ChkZenKana = True
Exit Function
End If
Next
End Function