みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

日本語(ひらがな・カタカナ・漢字)があるか判断する

日本語(ひらがな・カタカナ・漢字)があるか判断する方法

Sub test1()
Dim Str As String
Dim MidStr As String
Dim i As Long

Str = "aiu123あいう"

For i = 1 To Len(Str)
MidStr = Mid(Str, i, 1)

If Asc(MidStr) < 0 Then
MsgBox "日本が混ざっています"
Exit Sub
End If
Next

End Sub

このマクロを実行すると、「あ」の順番になった時にうまく反応するのですが、
いまいちASC関数についてよくわからないので教えてください。

ASC関数でマイナスになるものは全て日本語なのでしょうか?
Asc(MidStr) < 0でいいのか、そこが知りたいです。

a→97
i→105
u→117
1→49
2→50
3→51
あ→-32096
い→-32094
う→-32092

でした。

ご回答よろしくお願いします。

投稿日時 - 2012-10-05 20:25:31

QNo.7733838

困ってます

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

全角の英数字も日本語に含める気ですか?

ASC関数はシフトJISコードを返しているだけです。

シフトJISコードの全角文字(2バイト文字)は最上位ビットが1になります。

最上位ビットが1の「符号あり整数」は負数だから、全角文字はマイナスになります。

半角カタカナ(1バイト文字)も最上位ビットは1です。

投稿日時 - 2012-10-05 21:11:47

お礼

ありがとうございます。

投稿日時 - 2012-10-29 20:42:37

ANo.1

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

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

回答(4)

ANo.4

>Asc(MidStr) < 0でいいのか、そこが知りたいです。

うーん、何をお使いか書いていないので、もしExcelをお持ちでないと、調べるのはちょっと面倒ですが。もしあれば、その質問自体はご質問者さんが30分程度で調べられると思うのですが。

単純に、文字コード"<0" では、質問のタイトルどおりにはいきませんが、JISと限定すれば、概ね問題ないように思います。

2点ほど、それぞれの回答者から注文がついているけれども、大きな問題ではありません。

>ASC関数でマイナスになるものは全て日本語なのでしょうか?
記号や全角英数も入っています。JISの範囲で、半角にならない負のコードは、みな日本字と考えてよいように思うけれど、判断が分かれるところです。理由は、JISだけならよいのですが、Unicode文字がまじるからです。しかし、Unicodeの2バイトの上位バイトがないものは、排除するという考え方もあります。#1さんのJISの最上位ビットの話も悪くないので、コード化してみて出来ましたが、JISですから、一手間多くちょっと複雑になりますね。

日本字は半角もありますが、JISの日本字の正のコードは、半角のカタカナと一部だけしかありません。コードで探すなら、半角カタカナは、\xA1-\xDF(161-223)までです。(1)がそのサンプルです。

#1さんの
>全角の英数字も日本語に含める気ですか?
全角の英数や符号が不要なら、一端、半角にすればいいでは?
(StrConv(arg, vbNarrow))

#2さんの考え方は、記号抜きのANSIということですね。(2)は、失礼ながら、#2さんのコードを参考にして作りました。質問の趣旨とは違うかもしれませんが、#2の考え方に1票。

(3)のGetPhoneticは、万能ではありませんが、日本語限定ならいいかも?よみがながとれない漢字は、例えば、にんべん(イ)に、王という字「仼」(\u4EFC)など10個程度あります。ふだん使わない字ですから問題ないでしょう。

(4)は、うまくコードの貼り付けができない可能性がありますので、文字コードを探すか、中身をこのように書き換えください。漢字の最後は、「鶴[\u9DB4]」ではありません。偏が、ウ冠にオオトリで、造りは鳥の「鶴[\uFA2D]」のほうです。これは、Windowsですが、UnicodeのFAラインのどれでもよいです。

なお、\u は、Unicodeで、\x は、16進の正規表現の書き方です。

(2)の失敗した時の中身の代替え
Dim arg As String
  arg = ChrW(Val("&H3041")) & "-" & ChrW(Val("&H30FE"))
  arg = arg & ChrW(Val("&HFF62")) & "-" & ChrW(Val("&HFF9E"))
  arg = arg & ChrW(Val("&H4E00")) & "-" & ChrW(Val("&HFA2D"))
  IsJapanese_Like = arg1 Like "*[" & arg & "]*"

ご質問者さんのは、かなり有名なVBAマクロの問題ですが、どれもズバリというものではありません。他にも、3つ、正規表現で探す方法と、#1さんの話を元にしたものと、Unicodeの2バイトの上位桁を探す方法を考えましたが、紙面の都合上、やめました。

それと、VBAには、あまり予約語がないので通りますが、「Str As String」と変数にしていますが、VB.Net ならいいけれども、VBAでは、Str は、VB関数のひとつですから、やめたほうがよいです。

Sub Main1()
 Dim arg1 As String
 arg1 = "aiu1230ぁ!"
 If cd_JCheck(arg1) Then '(1)
 'If Like_IsJapanese(arg1) Then '(2)
 'If IsJapanese(arg1) Then '(3)
 'If IsJapanese_Like(arg1) Then '(4) 'コメントアウトを入れ替えて試してください。
  MsgBox "日本字が入っています", 64
 Else
  MsgBox "日本字が入っていません。!"
 End If
End Sub

'(1) 質問者さんのコードの手直し
Function cd_JCheck(arg1 As String) As Boolean
 Dim i As Long
 Dim j As Long
 Dim a As String
 Dim flg As Boolean
 arg = StrConv(arg1, vbNarrow)
 For i = 1 To Len(arg1)
  a = Mid(arg1, i, 1)
  j = Asc(a) 'JISコード
  If j < 0 Or (j > 160 And j < 224) Then '半角の範囲
   flg = True
   Exit For
  End If
 Next i
 cd_JCheck = flg
End Function

'(2) #2さんの回答を参考-記号も排除
Function Like_IsJapanese(arg1 As String) As Boolean
 Like_IsJapanese = StrConv(arg1, vbNarrow) Like "*[!0-9A-Za-z]*"
End Function

'(3) 'Excel以外は、Excelオートメーションか、ExcelをComが必要
Function IsJapanese(arg1 As String) As Boolean
'正味2行で足りる
 Dim myStr1 As String
 Dim myStr2 As String
 myStr1 = StrConv(StrConv(arg1, vbWide), vbHiragana)
 myStr2 = Application.GetPhonetic(arg1)
 IsJapanese = StrComp(myStr1, myStr2, 0) 'バイナリ比較
End Function

'(4) VBA/VB一般(ネット経由だと文字が換えられる可能性あり)
'入力前に、文字コードを確認する必要あり
Function IsJapanese_Like(arg1 As String) As Boolean
  'ひらがな+カタカナ+漢字
  '\u3041-\u30FE \uFF62-\uFF9E \u4E00-\uFA2D 入力文字[鶴]に注意!
  IsJapanese_Like = arg1 Like "*[ぁ-ヾ「-゛一-鶴]*"
End Function

私は、数年ぶりのVBAで、あくまでもトレーニングで書きました。

投稿日時 - 2012-10-07 12:41:05

お礼

ありがとうございます。

投稿日時 - 2012-10-29 20:42:44

ANo.3

半角カタカナの"ア"だと177になります。なので、ダメですよ。

投稿日時 - 2012-10-06 13:41:44

お礼

ありがとうございます。

投稿日時 - 2012-10-29 20:42:41

ANo.2

こんばんは!
直接の回答ではないのですが・・・

タイトル部の
>日本語(ひらがな・カタカナ・漢字)があるか判断する方法
に関していえば
ASC関数を使用するより、私であれば
↓のような感じでやります。

Sub test1()
Dim Str As String
Dim MidStr As String
Dim i As Long
Dim k As Long

Str = "aiu123あいう"

For i = 1 To Len(Str)
MidStr = Mid(Str, i, 1)

If Not StrConv(MidStr, vbNarrow) Like "[A-z 0-9]" Then
k = k + 1
End If
Next i

If k > 0 Then
MsgBox "日本語が混ざっています"
Else
MsgBox "アルファベットもしくは数字のみです"
End If

End Sub

すなわちある文字列にアルファベット・数値以外があれば k=k+1 とし
k>0 の場合はアルファベット・数値以外の文字があると判断できる。

ご希望の
>Asc(MidStr) < 0でいいのか、そこが知りたいです。
の回答でないのでごめんなさいね。m(_ _)m

投稿日時 - 2012-10-05 21:34:32

お礼

ありがとうございます。

投稿日時 - 2012-10-29 20:42:39

あなたにオススメの質問