ASC関数でマイナスになるものは全て日本語なのでしょうか?

このQ&Aのポイント
  • ASC関数を使用して、文字のUnicodeコードポイントを取得することができます。
  • ASC関数の戻り値は整数で、ASCII範囲(0〜127)の場合はほとんどの文字に対して正の値を返します。
  • しかし、日本語文字のUnicodeコードポイントは負の値となりますので、ASC関数でマイナスになる文字は日本語文字であることを示しています。
回答を見る
  • ベストアンサー

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

日本語(ひらがな・カタカナ・漢字)があるか判断する方法 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 でした。 ご回答よろしくお願いします。

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

  • ベストアンサー
  • bx2
  • ベストアンサー率47% (97/206)
回答No.1

全角の英数字も日本語に含める気ですか? ASC関数はシフトJISコードを返しているだけです。 シフトJISコードの全角文字(2バイト文字)は最上位ビットが1になります。 最上位ビットが1の「符号あり整数」は負数だから、全角文字はマイナスになります。 半角カタカナ(1バイト文字)も最上位ビットは1です。

njiji09
質問者

お礼

ありがとうございます。

その他の回答 (3)

回答No.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で、あくまでもトレーニングで書きました。

njiji09
質問者

お礼

ありがとうございます。

  • matyu1003
  • ベストアンサー率42% (257/598)
回答No.3

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

njiji09
質問者

お礼

ありがとうございます。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.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

njiji09
質問者

お礼

ありがとうございます。

関連するQ&A

  • Excelのユーザー定義関数について。

    ネットで調べて「アルファベットのみを半角にする」というユーザー定義関数を発見し使用していますが、 この関数にある特定の文字を変換する条件を追加することはできますでしょうか。 例えば、リンゴ という文字がセル内にある場合、ミカン に変換されて表示されるという条件を下記のユーザー定義関数に加える事ができますか。 もしくは、新たに別のユーザー定義関数を作るしかないのでしょうか。アドバイスよろしくお願いします。m(_ _ )m Function ASC_A(str As String) As String Dim i As Integer For i = 1 To Len(str) If Mid(str, i, 1) Like "[a-zA-Z]" Then Mid(str, i, 1) = StrConv(Mid(str, i, 1), vbNarrow) End If Next ASC_A = str End Function

  • 「'」もascで変換させたい

    A1に「'test」と入れると「test」になってしまいます。 そして、 Sub test() Dim MojiInt As Long Dim i As Long Dim myRow As Long Dim Moji As String MojiInt = Len(Cells(1, 1)) For i = 1 To MojiInt Moji = Mid((Cells(1, 1)), i, 1) If i = 1 Then Cells(1, 2) = Asc(Moji) Else Cells(1, 2) = Cells(1, 2) & "," & Asc(Moji) End If Next i End Sub をすると、 116,101,115,116 になります。 最初の「'」もascで変換させることは無理なのでしょうか?

  • 「:」を使えば、一行のコードにできるわけではない?

    「:」を使えば、一行のコードにできるわけではないのですか? ifステートメントを1行にしたいのですが Sub test() Dim a As String a = "aiu" If a Like "*i*" Then: Stop: End If End Sub これだと End If に対応する If ブロックがありません。 となってしまいます。 ちゃんと、 Sub test() Dim a As String a = "aiu" If a Like "*i*" Then Stop End If End Sub こうしないとダメですか? なぜ、:は使えないのですか? よろしくお願いします。

  • プログラミングVisual Basicの質問です。

    任意の数字を入力し、Len関数とMid関数を使って2進数を10進数に変換するというプログラムを作っているのですが、うまくいきません。 コードは Dim a  As Integer Dim b  As Integer Dim i  As Integer a = Val(TextBox1.Text) For i = Len(a) To 1 Step -1 If Mid(a, Len(a), 1) = "1" Then b += 2 ^ (i - 1) End If Next Label3.Text = b    End Sub 上記のものが作ったコードです。 問題点の指摘をよろしくお願いします。

  • VBA 複数の文字のコードを一気に返すには

    Sub test1() Dim myStr As String myStr = "abc" Debug.Print Asc("a") Debug.Print Asc(myStr) End Sub このコードは、どちらも97が返るのですが、 myStrは3文字です。 3文字全ての文字コードを返すには、 Sub test2() Dim myStr As String myStr = "abc" Debug.Print Asc(Mid(myStr, 1, 1)) & Asc(Mid(myStr, 2, 1)) & Asc(Mid(myStr, 3, 1)) End Sub のようにするしかないのでしょうか?

  • 2010 excel マクロ 記号の変化

    エラー発生で強制終了になってしまいます。2007年のexcelで作成したものですが、2010だと強制終了になってしまいます。 内容は□をダブルクリックすると■になるように作っています。 記述は2003年からのマクロ記述なので、変化が必要なのでしょうか? Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'セルをダブルクリックすると、・→○→△→×→・と変更する。 Dim S1 As String Dim S2 As String Dim S01 As String Dim S02 As String Dim S03 As String Dim S04 As String S1 = "□" S2 = "■" S01 = "・" S02 = "○" S03 = "△" S04 = "×" On Error GoTo ERR_12 sCheckXY S1, S2 sCheckX1234 S01, S02, S03, S04 sChangeXY S1, S2 Exit Sub ERR_12: End End Sub Sub sChangeXY(X As String, Y As String) '選択セルに□があれば■に変える Dim Str0 As String 'str1の左端 Dim Str1 As String 'strの右側更新 Dim Str2 As String 'strの左側更新 Dim Str20 As String 'strの左側一部保存 Dim L As Long Dim M As Long Dim N As Long Str1 = ActiveCell.Text L = Len(Str1) Debug.Print L If L = 0 Then End End If For N = 1 To L Debug.Print Str2 Str0 = Left(Str1, 1) If Str0 = X Or N = L Then If Str20 <> "" Then If N = L Then Str20 = Str20 + Str0 End If If MsgBox(Str20 & "  はチェックしますか?", vbYesNo, "選択肢") = vbYes Then Str2 = Str2 + Replace(Str20, X, Y) Str20 = Str0 Else Str2 = Str2 + Replace(Str20, Y, X) Str20 = Str0 End If Else Str20 = Str0 End If Else Str20 = Str20 + Str0 End If Str1 = Right(Str1, L - N) Next N ActiveCell.Value = Str2 End Sub Sub sCheckXY(X As String, Y As String) '選択セルがXならY,YならXにチェックをかえる If ActiveCell.Text = X Then ActiveCell.Value = Y End ElseIf ActiveCell.Text = Y Then ActiveCell.Value = X End End If End Sub Sub sCheckX1234(X1 As String, X2 As String, X3 As String, X4 As String) '選択セルがXならY,YならXにチェックをかえる If ActiveCell.Text = X1 Then ActiveCell.Value = X2 End ElseIf ActiveCell.Text = X2 Then ActiveCell.Value = X3 End ElseIf ActiveCell.Text = X3 Then ActiveCell.Value = X4 End ElseIf ActiveCell.Text = X4 Then ActiveCell.Value = X1 End End If End Sub

  • またまた エクセルのユーザー定義で

    前回以下のようなコードを教えていただきましたが、この変換を複数列で使えるようにするにはどうしたらいいのでしょうか? D,G,N,Q,X,AA,の列に効かせたいのですが。 Private Sub worksheet_change(ByVal Target As Range) If Intersect(Target, Columns(1)) Is Nothing Or Selection.Count <> 1 Then Exit Sub Dim str As String str = Target Application.EnableEvents = False If Target <> "" Then If Len(str) = 7 Then Target = Left(str, 5) & "A" & Mid(str, 6, 1) & "-" & Right(str, 1) Else Target = Left(str, 5) & "A" & Mid(str, 6, 2) & "-" & Right(str, 1) End If End If Application.EnableEvents = True End Sub

  • EXCELのマクロ :再帰的式を使って書き換える

    次のEXCELのマクロ プログラムを再帰的式を使って シンプルにするにはどんな風にすればよういのでしょうか。よろしくお願いします。 Public Sub p() Dim c, base As Range Dim str As String Dim i1, i2, i3 Dim c1, c2, c3 Dim o1, o2, o3 Set base = Range("A1") c = 0 str = "ABCD" For i1 = 1 To Len(str) c1 = Mid(str, i1, 1) o1 = Replace(str, c1, "")    For i2 = 1 To Len(o1)    c2 = Mid(o1, i2, 1)    o2 = Replace(o1, c2, "")      For i3 = 1 To Len(o2)      c3 = Mid(o2, i3, 1)      o3 = Replace(o2, c3, "")      base.Offset(c).Value = c1 & c2 & c3 &       c4 & c5 & o5      c = c + 1      Next    Next Next End Sub

  • vbaの繰り返し処理について

    vbaです。 Sub Test1() Dim Str As String Dim Pnt1 As Long Dim Pnt2 As Long Str = Range("A1") Pnt1 = InStr(Str, "重 http://") If Pnt1 <= 0 Then Exit Sub Pnt2 = InStr(Pnt1, Str, "要") If Pnt2 <= 0 Then Range("B1") = Mid(Str, Pnt1 + 2) Else Range("B1") = Mid(Str, Pnt1 + 2, Pnt2 - (Pnt1 + 2)) End If End Sub という式でA1からA2.A3と下にURLが入っており空欄になるまで同じ処理をしたいのですがどのように変更すれば作動しますでしょうか?

  • 32進数の文字に+1カウントした値の取得

    Access(vba)で32進数の値に+1カウントした結果を取得したいと考えています。 引数、戻り値とも32進数の値の独自関数を作りたいです。 例) 11AF00 ⇒ 11AF01 11AF0Z ⇒ 11AF10 11AFZZ ⇒ 11AG00 下記のコードを途中まで考えましたが、繰り上がりとか考えてると???になってしまいました。 どなたかご教授お願いします。 Public Function P36進数カウント(str As String) Const alpha = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" Dim i As Integer Dim keta As Integer keta = Len(str)   ←桁数分LOOPするとか考えたのですが、ギブアップです。   Mid(str, i, 1) = Mid(alpha, InStr(alpha, Mid(str, i, 1)) + 1, 1) End Function

専門家に質問してみよう