- - PR -
[非 .net] VBAで機種依存文字のチェック
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-02-09 17:39
会議室のテーマとはずれるのですが、みなさんのお知恵を拝借させてください。
Excelのマクロで、文字列に含まれる機種依存文字のチェックを行いたいのですが、 どんな方法がいいでしょうか? 前提条件は、 ・Excel VBA (Excel2000以降) ・Excel以外の追加モジュール・プログラムをインストールしない ・OSはWindows98以降対応 です。 # 文字コードを取ってきてゴニョゴニュすればいけそうな気がするのですが、 # いまいち良く分からなくて・・・。 # 今は、機種依存文字を1文字ずつ、InStr関数でチェックしていますが、 # もっとスマートな方法がないかと思いまして(^^; | ||||||||
|
投稿日時: 2004-02-09 20:02
はにまるです。
WindowsのOS依存文字が ”NEC選定特文字”と”IBM拡張文字”です。 ”NEC選定特文字”と”IBM拡張文字”は14文字重複して登録され、 それぞれ、文字コード表に存在致しますが、 Windows上では、内部で強制的に片方の文字コードに設定されますので 片方のみを認識しておけば良い事になります。 ################################################## # 「」はIMEで変換する際の入力文字です。 # () はその漢字をASCII変換した際の値です。 ################################################## 1.NEC選定特文字 開始:まる数字の1「いち」(34624) 終了:直角三角形「でるた」(34713) ※実際には、合併集合「しゅうごう」(34716)までですが、別の文字コードが優先される。 下記のNo.3がそれ、 2.IBM拡張文字 開始:ローマ数字の小文字の1「いち」(64064) 終了:黒に似た漢字「IMEのコード一覧で表示して下さい。」(64587) 3.NEC選定特文字で1の範囲外 (1)Uに似た記号「しゅうごう」(33214) (2)Uを逆さにした記号「しゅうごう」(33215) (3)点3つ「なぜならば」(33254) ※No.3は、”NEC選定特文字”のグループ外なので 問題無いかもしれませんが、私は念の為、外しています。 (調査しきれなかった ) チェック対象の文字列を一文字づつASCII変換して 上記の1、2、3の範囲のいずれかで一致した場合入力エラーとすれば、OKです。 # 念のため、上記コードをchr 変換して一覧表示して見てください。 [ メッセージ編集済み 編集者: はにまる 編集日時 2004-02-09 20:04 ] | ||||||||
|
投稿日時: 2004-02-10 10:28
はにまるさん、返答ありがとうございます。
はにまるさんの説明は良く分かったのですが、今度はVBAのASC関数の仕様で 戸惑っています。(^^;
例えば、chr(34624) は "まる数字の1「いち」" に変換されますが、 asc関数に "まる数字の1「いち」"を渡すと、-30912 が返ってきます。 ちなみに、chr(-30912)も "まる数字の1「いち」" に変換されます。 ヘルプで確認しても確かに「-32768 〜 32767を返す」と書いてあるのですが、 いったい何を返してるんでしょう? (ヘルプには「文字コード」としか書いてない・・・) もしご存知でしたらご教授下さい。 | ||||||||
|
投稿日時: 2004-02-10 11:19
はにまるです。
ありゃりゃ本当ですね excelって事を考慮していなかった ^^; ま〜御勉強ついでと言う事で、、、 ←こいつ逃げている。 asc関数の戻値が integer型 である事は、ヘルプに記載されていますよね! で integer は、「-32768 〜 32767」で返します。 これは、2進数の2バイトでマイナスは「2の補数」で表示している為です。 # 情報処理試験で結構出ますね! もどって漢字コードですが、 「丸数字の1」は、34624 で、16進数で表すと、&h8740 です。 # IMEの文字一覧で見ると、シフトJIS:&h8740 と表示されます。 &h8740を2進数表示すると、 「1000」「0111」「0100」「0000」となり、 先頭が1の為、マイナス値と見なします。 つまり、「2の補数」を求めます。 「1000」「0111」「0100」「0000」 ↓逆 「0111」「1000」「1011」「1111」 で1の補数 ↓+1 「0111」「1000」「1100」「0000」 で2の補数 ↓10進数に変換 30912 ↓マイナスなので −30912 つまり、 integerの2バイト領域の場合、34624 も −30912 も 2進数及び16進数上では、同じ値となります。 ## 追加 ## 質問の返答としては、asc関数は、 「2バイトの16進数を無理やり10進数で返している」です。 [ メッセージ編集済み 編集者: はにまる 編集日時 2004-02-10 11:45 ] | ||||||||
|
投稿日時: 2004-02-10 13:57
はにまるさん、返答ありがとうございます。
つまり、32767より大きい文字コード(って、全部そうですね(^^;)については、 2の補数を求めた上でそれと比較すればいいということですよね? 具体的には、 1.NEC選定特文字 -30823 〜 -30912 2.IBM拡張文字 -1472 〜 -949 3.NEC選定特文字で1の範囲外 -32322,-32321,-32282 の範囲に、ASC関数の戻り値が入っていれば機種依存文字と見做すということに なると思うのですが、あってますよね? これで今から試してみます。
情報処理試験・・・、遠い昔の忘却の彼方に行ってますね・・・(^^; | ||||||||
|
投稿日時: 2004-02-10 15:30
おかげさまで上手くいきました。ありがとうございました。
参考まで、コードを掲示します。 (文字列を渡すと、含まれている機種依存文字だけを返す関数です。) Public Function check(strTarget As String) As String Dim strReturn As String Dim intStrLen As Integer Dim intChar As Integer Dim i As Integer On Error GoTo Error_RTN intStrLen = Len(strTarget) strReturn = "" For i = 1 To intStrLen intChar = Asc(Mid(strTarget, i, 1)) If (intChar <= -30823 And intChar >= -30912) _ Or (intChar <= -949 And intChar >= -1472) _ Or intChar = -32322 Or intChar = -32321 Or intChar = -32282 Then strReturn = strReturn & Chr(intChar) End If Next i check = strReturn End Function # すこし他のサイトも探してみましたが、3.の文字については、 # 「JISコード内なので問題ない」と言ってるサイトが多かったですね。 # 多分大丈夫なのかな? | ||||||||
|
投稿日時: 2004-02-10 15:38
誤解を招くとあれなので・・・ unsignedなデータをsignedな型で返しているが正解です。 何がいいたいかというと、16進数も10進数も8進数も解釈できるのは人間だけって事です。 #なんてていってる僕の認識が間違えてたりして・・・。 | ||||||||
|
投稿日時: 2004-02-10 15:58
はにまるです。
あぅ!前のWindows-Unix間の接続テストで、序に試しとけばよかった... 今度試してみます、勝手にテストケースに盛り込んで...
お!「unsigned」「signed」って言う言葉知らなかった unsigned charは、正数でキャラクターコードを表現 signed char は、負数、正数両方を使ってキャラクターコードを表現 訂正ありがとうございます! |