- ベストアンサー
ASC関数でマイナスになるものは全て日本語なのでしょうか?
- ASC関数を使用して、文字のUnicodeコードポイントを取得することができます。
- ASC関数の戻り値は整数で、ASCII範囲(0〜127)の場合はほとんどの文字に対して正の値を返します。
- しかし、日本語文字のUnicodeコードポイントは負の値となりますので、ASC関数でマイナスになる文字は日本語文字であることを示しています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
全角の英数字も日本語に含める気ですか? ASC関数はシフトJISコードを返しているだけです。 シフトJISコードの全角文字(2バイト文字)は最上位ビットが1になります。 最上位ビットが1の「符号あり整数」は負数だから、全角文字はマイナスになります。 半角カタカナ(1バイト文字)も最上位ビットは1です。
その他の回答 (3)
- WindFaller
- ベストアンサー率57% (465/803)
>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で、あくまでもトレーニングで書きました。
お礼
ありがとうございます。
- matyu1003
- ベストアンサー率42% (257/598)
半角カタカナの"ア"だと177になります。なので、ダメですよ。
お礼
ありがとうございます。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 直接の回答ではないのですが・・・ タイトル部の >日本語(ひらがな・カタカナ・漢字)があるか判断する方法 に関していえば 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
お礼
ありがとうございます。
お礼
ありがとうございます。