- PR -

[非 .net] VBAで機種依存文字のチェック

投稿者投稿内容
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-02-09 17:39
会議室のテーマとはずれるのですが、みなさんのお知恵を拝借させてください。

Excelのマクロで、文字列に含まれる機種依存文字のチェックを行いたいのですが、
どんな方法がいいでしょうか?

前提条件は、
・Excel VBA (Excel2000以降)
・Excel以外の追加モジュール・プログラムをインストールしない
・OSはWindows98以降対応
です。

# 文字コードを取ってきてゴニョゴニュすればいけそうな気がするのですが、
# いまいち良く分からなくて・・・。
# 今は、機種依存文字を1文字ずつ、InStr関数でチェックしていますが、
# もっとスマートな方法がないかと思いまして(^^;
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 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 ]
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-02-10 10:28
はにまるさん、返答ありがとうございます。

はにまるさんの説明は良く分かったのですが、今度はVBAのASC関数の仕様で
戸惑っています。(^^;

引用:

  1.NEC選定特文字
     開始:まる数字の1「いち」(34624)
     終了:直角三角形「でるた」(34713)



例えば、chr(34624) は "まる数字の1「いち」" に変換されますが、
asc関数に "まる数字の1「いち」"を渡すと、-30912 が返ってきます。
ちなみに、chr(-30912)も "まる数字の1「いち」" に変換されます。

ヘルプで確認しても確かに「-32768 〜 32767を返す」と書いてあるのですが、
いったい何を返してるんでしょう?
(ヘルプには「文字コード」としか書いてない・・・)

もしご存知でしたらご教授下さい。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 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 ]
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-02-10 13:57
はにまるさん、返答ありがとうございます。

つまり、32767より大きい文字コード(って、全部そうですね(^^;)については、
2の補数を求めた上でそれと比較すればいいということですよね?
具体的には、

1.NEC選定特文字 -30823 〜 -30912
2.IBM拡張文字 -1472 〜 -949
3.NEC選定特文字で1の範囲外 -32322,-32321,-32282

の範囲に、ASC関数の戻り値が入っていれば機種依存文字と見做すということに
なると思うのですが、あってますよね?

これで今から試してみます。

引用:

 asc関数の戻値が integer型 である事は、ヘルプに記載されていますよね!
 で integer は、「-32768 〜 32767」で返します。
 これは、2進数の2バイトでマイナスは「2の補数」で表示している為です。
 # 情報処理試験で結構出ますね!



情報処理試験・・・、遠い昔の忘却の彼方に行ってますね・・・(^^;
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 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コード内なので問題ない」と言ってるサイトが多かったですね。
# 多分大丈夫なのかな?
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-02-10 15:38
引用:


 質問の返答としては、asc関数は、
 「2バイトの16進数を無理やり10進数で返している」です。




誤解を招くとあれなので・・・

unsignedなデータをsignedな型で返しているが正解です。

何がいいたいかというと、16進数も10進数も8進数も解釈できるのは人間だけって事です。

#なんてていってる僕の認識が間違えてたりして・・・。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-02-10 15:58
はにまるです。

引用:

Clusterさんより:
# すこし他のサイトも探してみましたが、3.の文字については、
# 「JISコード内なので問題ない」と言ってるサイトが多かったですね。
# 多分大丈夫なのかな?


あぅ!前のWindows-Unix間の接続テストで、序に試しとけばよかった...
今度試してみます、勝手にテストケースに盛り込んで...

引用:

NAL-6295さんより:

unsignedなデータをsignedな型で返しているが正解です。


お!「unsigned」「signed」って言う言葉知らなかった 
unsigned charは、正数でキャラクターコードを表現
signed char は、負数、正数両方を使ってキャラクターコードを表現

訂正ありがとうございます!

スキルアップ/キャリアアップ(JOB@IT)