ExcelVBAについて

半角文字のチェックをやろうと思って
http://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+200807/08070013.txt
ここにあるような
If LenB(StrConv(.Value, vbFromUnicode)) <> LenB(.Value) Then
の判定でチェックしたのですが、
ある外字をstrConvで変換すると1バイト文字になるので上記の半角文字チェックにひっかかってしまいます。
この外字がチェックされず半角文字だけチェックするようにしたいのですが。
文字コードで判断すれば良いのでしょうか。
文字を文字コードに変換する関数にどんなものがあるのか、だとか
文字コードのどこからどこまでのコードが外字にあたるかなどもわかりません。よろしくお願いします

回答の条件
  • 1人3回まで
  • 登録:2008/09/10 00:48:08
  • 終了:2008/09/11 21:25:30

ベストアンサー

id:ardarim No.3

ardarim回答回数897ベストアンサー獲得回数1452008/09/11 04:49:42

ポイント100pt

StrConvは、Unicodeとマルチバイト(日本語環境ではシフトJIS)との間の変換ですので、シフトJISで定義されていないUnicode文字は、外字に限らず全て ? などの文字に変換されてしまいます。


ここでいう「半角文字」が、いわゆる日本語環境で言うところの半角英数、半角カナというレベルのものであるなら、その範囲で1文字ずつチェックするのが確実だと思います。


例えば。

Function HasHalfChar(ByVal s As String) As Boolean

    Dim i As Integer
    
    HasHalfChar = False
    For i = 1 To Len(s)
        If IsHalfChar(Mid$(s, i, 1)) Then
            HasHalfChar = True
            Exit For
        End If
    Next i

End Function

Function IsHalfChar(ByVal ch As String) As Boolean

    Dim uc As Integer
    
    uc = AscW(ch)
    
    If uc >= 0 And uc < &H80 Then
        ' 半角英数(ASCII)
        IsHalfChar = True
    ElseIf uc >= &HFF61 And uc <= &HFF9F Then
        ' 半角カナ
        IsHalfChar = True
    Else
        IsHalfChar = False
    End If

End Function

シフトJISで定義されていない文字(例えば、á、卡、€など日本語で使われない文字や記号、外字など)は基本的にStrConv、Asc、AscBなどの関数では正しく扱えませんので、正しく判定できません。AscWを使って、Unicode値で判定する必要があります。

á、卡、€などの文字はVBAエディタ内では記述できないので、テストするのであれば適当なセルに入力して確認する必要があります。

Debug.Print HasHalfChar(Cells(1,1).Value)
id:ticaramoci

返事が遅くなりましたが。

おかげさまで上記のコードでうまくいきました。

とともに大変勉強になりました。ありがとうございました

2008/09/11 21:20:03

その他の回答(2件)

id:desuyoker No.1

たかたか回答回数78ベストアンサー獲得回数82008/09/10 08:04:23

ポイント3pt

ある外字が何かわかっているなら、

If LenB(StrConv(.Value, vbFromUnicode)) <> LenB(.Value) Then

の後に、その外字は除外する判定(if文)を追加すればいいのでは?

id:ticaramoci

ほかの外字でも同じようなことがありえるので汎用的に判定できる方法が良いです

2008/09/10 08:36:51
id:kaiton No.2

kaiton回答回数260ベストアンサー獲得回数342008/09/10 13:10:42

ポイント90pt

http://okwave.jp/qa691058.html

http://okwave.jp/qa2890688.html?ans_count_asc=20

を参考に、外字を他の全角文字に置き換えて、その後に判定してはどうでしょうか?


それか、関数では外字も全角で判断されるのを確認できたので(Excel2003で)

別セルに=LEN(A1)*2<>LENB(A1) などの作業セルをVBAで参照するか?

参考

http://support.microsoft.com/default.aspx?scid=kb;ja;408879

id:ardarim No.3

ardarim回答回数897ベストアンサー獲得回数1452008/09/11 04:49:42ここでベストアンサー

ポイント100pt

StrConvは、Unicodeとマルチバイト(日本語環境ではシフトJIS)との間の変換ですので、シフトJISで定義されていないUnicode文字は、外字に限らず全て ? などの文字に変換されてしまいます。


ここでいう「半角文字」が、いわゆる日本語環境で言うところの半角英数、半角カナというレベルのものであるなら、その範囲で1文字ずつチェックするのが確実だと思います。


例えば。

Function HasHalfChar(ByVal s As String) As Boolean

    Dim i As Integer
    
    HasHalfChar = False
    For i = 1 To Len(s)
        If IsHalfChar(Mid$(s, i, 1)) Then
            HasHalfChar = True
            Exit For
        End If
    Next i

End Function

Function IsHalfChar(ByVal ch As String) As Boolean

    Dim uc As Integer
    
    uc = AscW(ch)
    
    If uc >= 0 And uc < &H80 Then
        ' 半角英数(ASCII)
        IsHalfChar = True
    ElseIf uc >= &HFF61 And uc <= &HFF9F Then
        ' 半角カナ
        IsHalfChar = True
    Else
        IsHalfChar = False
    End If

End Function

シフトJISで定義されていない文字(例えば、á、卡、€など日本語で使われない文字や記号、外字など)は基本的にStrConv、Asc、AscBなどの関数では正しく扱えませんので、正しく判定できません。AscWを使って、Unicode値で判定する必要があります。

á、卡、€などの文字はVBAエディタ内では記述できないので、テストするのであれば適当なセルに入力して確認する必要があります。

Debug.Print HasHalfChar(Cells(1,1).Value)
id:ticaramoci

返事が遅くなりましたが。

おかげさまで上記のコードでうまくいきました。

とともに大変勉強になりました。ありがとうございました

2008/09/11 21:20:03
  • id:kaiton
    2番目に紹介したURLのソースから
    Reg.Replace(strText, "") を
    hoge = Reg.Replace(strText, "★") に修正(外字を★に入れ替え)して

    質問文のようにIf LenB(StrConv(hoge, vbFromUnicode)) <> LenB(hoge) Then
    で判断すると動作しました。(Excel2003で)

    1文字だけれど外字あり、全角半角混在、全角のみ、半角のみ(英字のみ、カタカナのみなど)
    で確認しました。
  • id:ticaramoci
    ticaramoci 2008/09/11 00:01:28
    すみません。"あ"に入れ替えてやったりしましたが、まだうまくいっていません。
    おそらくkaitonさんから教えていただいた方法でできるはずなんでしょうが、
    ちょっと特殊な外字なのかもしれません。URLのソースにあった文字コードの範囲で抽出できませんでした。
    HEX(Asc(問題の字))を出力すると「BF」になりました。
    Unicodeだから? 書体をふつうの明朝やゴシックにすると見た目「?」になります。
    半分あきらめかけています
  • id:kaiton
    http://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_0000-0FFF
    UNICODEなら上下さかさまの「?」
    外字ではなく、一部のフォント(Wingdingsなど)で形が異なるのか?

    シート上でその文字を貼り付けして =DEC2HEX(CODE(ASC(A1))) だと何になりますか?
  • id:ticaramoci
    ticaramoci 2008/09/11 01:24:41
    いろいろありがとうございます。
    「?」はさかさまじゃないです。
    独自の外字登録アプリ‥みたいなもので登録しエクセルに表示させてるものです。
    ただWindowsで何かしらの文字コード管理を行ってると思うのですが‥。
    データを持ち帰れないので「=DEC2HEX(CODE(ASC(A1)))」は明日試してみます
    これはExcel関数でしょうか。ExcelVBAでしょうか。
    両方やってみます。
  • id:kaiton
    =DEC2HEX(CODE(ASC(A1)))はVBAではなくExcel関数です。
    #3の回答は、私も勉強になります。 m(__)m
  • id:ticaramoci
    ticaramoci 2008/09/11 21:21:55
    Excel関数ですか。セルに記述したら何故か「Value#」になってしまいました。
    やり方がおかしかったのかな。。
    とりあえず3の方の回答でうまくいくことができました。
    最後までありがとうございました。
  • id:kaiton
    http://office.microsoft.com/ja-jp/excel/HP052090541041.aspx
    DEC2HEX関数は、分析ツールアドインを組み込む必要がありました。
    念のため補足です。
    それと、過分なポイントありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません