こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルvba カタカナは全角、それ以外は半角に

セルにはカタカナ、数字、漢字、文字がすべて混在しています。
カタカナは全角に、カタカナ以外(数字や記号)は半角に統一しようかと思っています。

一度すべてを半角にし、カタカナだけ全角に戻そうかと考えました。


Sub test()
Dim e As Range
Dim f As Integer
Dim rData As Variant, ansData As Variant
Range("A1:A10").Select
For Each e In Selection
ansData = ""
For f = 1 To Len(e.Value)
rData = StrConv(e.Value, vbNarrow)
If Mid(rData, f, 1) Like "[ア-ン]" Then
ansData = ansData & StrConv(Mid(rData, f, 1), vbWide)
Else
ansData = ansData & Mid(rData, f, 1)
End If
Next f
e.Value = ansData
Next e
End Sub

しかしこれでは、
「ッ」「ァ」など小さい文字や、「ー(長音)」が半角から全角に戻りません。
また、「ズ」など濁音が「ス゛」と2文字になってしまいます。

これらの正しく変換されないものをすべて列挙し、Replaceなどを使って修正するしかないのでしょうか?


実は最初に、すべてを「全角→半角」にするようマクロ作成したのですが、半角にする文字をReplaceですべて列挙しるのは大変だと思い、「半角→全角」にしたらうまくいくかと思ったのですが、それでもうまくいきませんでした・・・

よろしくお願いします。

投稿日時 - 2013-08-20 22:46:44

QNo.8228622

困ってます

質問者が選んだベストアンサー

> また、「ズ」など濁音が「ス゛」と2文字になって
そりゃもちろん・・半角変換後に「一文字ずつ全角に変換」していますから、
濁点や半濁点も「1文字」として全角に変換しちゃいますよね。

じゃぁどうしましょう?ということで、
逆の手順で考えてみると上手くいくかも?

Sub test()
Dim e As Range
Dim f As Integer
Dim rData As Variant, ansData As Variant
    Range("A1:A10").Select
    For Each e In Selection
        ansData = ""
        rData = StrConv(e.Value, vbWide)
        For f = 1 To Len(rData)
            If Asc(Mid(rData, f, 1)) < -32097 Then
                ansData = ansData & StrConv(Mid(rData, f, 1), vbNarrow)
            Else
                ansData = ansData & Mid(rData, f, 1)
            End If
        Next f
        e.Value = ansData
    Next e
End Sub


さぁ、何を逆に考えたでしょう(笑)。


簡単に解説してみると、
・すべて全角に変換
・一文字ずつ取り出しながら
  ・Ascで変換した文字コードが「-32097=“ぁ”」より小さかったら
    ・半角に(出来るものは)変換
  ・それ以外は
    ・そのまま
・文字列長分繰り返し
・セルに戻す

という作業です。


文字コードに関しては以下でご確認ください。
http://charset.7jp.net/jis.html
“日本語”で最初に出てくる文字は「ぁ」で、
そのコードを10進数に変換したのが「-32097」です。
上記ではこの「-32097」より小さい数字は「日本語以外=半角に変換」としています。

ちなみに・・StrConv(Narrow)では「半角にできない記号」は無視されますので、
日本語より先に出てくる「数学記号や矢印」などは考慮しなくて大丈夫と思われます。



参考までにどうぞ。

投稿日時 - 2013-08-21 00:05:59

お礼

文字コードを利用する方法は思いつきませんでした。

これで、半角にしたいものに対応できそうですね。

助かりました。ありがとうございました。

投稿日時 - 2013-08-22 07:23:53

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

> 実は最初に、すべてを「全角→半角」にするようマクロ作成したのですが
元のデータを用いて、
For f = 1 To Len(e.Value)
ループの中でIF文使って判定しているけど、
Select Case で列挙したほうが作りやすいと思います。
(実行時間コストがかかるかも?)

1文字先読みして、濁音・半濁音だったらセットで判定させる。

投稿日時 - 2013-08-20 23:10:17

お礼

早速の回答ありがとうございます。

select case を使うということですか。

参考にしてみます。

ありがとうございました。

投稿日時 - 2013-08-22 07:09:57

あなたにオススメの質問