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

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

締切り済みの質問

VBAによる第3、4水準文字の判定について

表題の件についてご質問させてください。

環境 OS:WinVista Office:2007

Accessのフォーム画面の入力内容に対して、Vistaから追加された機種依存文字である第3水準、第4水準漢字の入力があるかどうかをチェックしたいと考えています。
ネット等でいろいろと情報を仕入れてプログラムを組んでみたのですが、一部うまくいかない所があるのでご質問させていただければと思います。

◎自前で組んだロジック  ※試験的にExcelで作成中
(入力された文字数分繰り返し) 
  lWork = Asc(Mid(ThisWorkbook.Sheets(1).Range("B2"), iCnt1, 1))
  '読み込んだ文字が"?"となり文字が化けた場合
  If iWork = 63 Then
    bFlg = True
  End If
  
  If bFlg = True Then
    '読み込み文字を十進数へ
     iWork = AscW(Mid(ThisWorkbook.Sheets(1).Range("B2"), iCnt1, 1))
     If iWork < 0 Then  ……(1)
       iWork = iWork + 65536
        sWork = "&H" & Hex(iWork)

        ThisWorkbook.Sheets(2).Range("D" & iCnt2 + 3) = ChrW(iWork)

    Else   ……(2)

        ThisWorkbook.Sheets(2).Range("D" & iCnt2 + 3) = ChrW(iWork)
    End If
(繰り返しここまで)

上記の様なロジックでまずは判定を行い、その上で、判定に引っかかった文字から文字コードを取得し、文字をセルの値として出力する形でサンプルを作ってみました。
※文字コードを取得して、文字自体を出力してるのはメッセージでどの文字が知らせる必要があるため

【質問事項】
(2)のElse以下の条件については上手くいくのですが、AscW関数にて取得した値がマイナスだった際にChrW関数でチェックで引っかかった値を出力することができません(出力内容がブランク)。
65536を加算すれば、という内容をネット見たので試してみたのですが、セルに出力される値がブランクとなってしまいます。チェックした文字の文字コードもプログラムの中で使用している数値と実際の数値と異なっています。
上記事象についての解決策などをご存じの方がいらっしゃいましたらご助言願います。
(より具体的に言うと、文字コードが”&4E08”(十進数だと19976)である感じを読み込んだ際、なぜかAscW関数で値を取得すると値が”55360”となってしまい、16進数に変換してChrWで文字に変換しても変換後の文字がブランクとなってしまう)

また、第3水準漢字と第4水準漢字であることの判定についても、上記の判定(VBEで読み込んで”?”に化けてしまう)以外に、確実に判定を行う方法などがあったらごアドバイス等をお願いいたします。

VBAは多少扱ったことはあるのですが、文字コード関連はあまり詳しくないので、ご助言をお願いします。

投稿日時 - 2012-10-23 02:22:26

QNo.7761870

困ってます

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

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

回答(1)

ANo.1

こんにちは。

似たようなご質問はあるのですが、今回のように、機種依存文字である第3水準、第4水準漢字というのは、考えたことがありません。つまり、言い換えると、JIS、Unicodeはオケーということになるのでしょうか?

参考になると思います。
http://okwave.jp/qa/q7733838.html
#4

おっしゃっていることは、UnicodeとJI第3水準以上を区分けという話になるように思いました。当面、いろいろ盛り込んで、以下のようなコードを考えてみました。あれやこれやと、知っていることを盛り込んだだけですので、なぜ、4,5があるのか、分かっていませんが、4,5の文字コードには違いがあるということだけです。

正規表現が使えればもっと早いのですが、どこかのサイトに、一文字ずつ指定なんていうコードありました。それは、VBAとして負担が大きくなってしまいます。Like演算子で、50や100文字程度なら問題ないです。また、外部のオブジェクトやAPIに渡す方法もありそうですが、最初から別の言語で作っても同じことになってしまいます。

ExcelやAccess の時は、Mid関数で、文字1つずつを入れてループしますが、このままでは、かなり処理スピードは遅いはずですので、もし問題があれば、また考えてみます。なお、半角カタカナは、1の分類です。少し、こちらのものを試していただけませんか?

'1  半角文字
'2  JIS文字/一般漢字
'3  Unicode
'4  Unicode外
'5  Unicode外 ?

Function Is_OrdinaryChar(char1 As String) As Long
 Dim ch() As Byte
 ch = char1
 If Asc(char1) = 63 And AscW(char1) <> 63 Then
  If UBound(ch) > 2 Then
   Is_OrdinaryChar = 5 'Unicode外
  ElseIf char1 Like "[一-龠]" Then
   Is_OrdinaryChar = 3 'Unicode
  Else
   Is_OrdinaryChar = 4 'Unicode外
  End If
 ElseIf LenB(StrConv(char1, vbFromUnicode)) = 1 Then
  Is_OrdinaryChar = 1 '半角文字
 Else
  Is_OrdinaryChar = 2 'JIS文字/一般漢字
 End If
End Function

投稿日時 - 2012-10-23 12:01:00

お礼

回答ありがとうございます。参考にさせていただきました。
参考した情報と、外部のページを参考に解決させていただきました。
ありがとうございます。

投稿日時 - 2012-10-24 19:38:58

あなたにオススメの質問