- PR -

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

投稿者投稿内容
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-02-11 22:30
引用:

JWさんの書き込み (2004-02-10 21:18) より:

また、Excel限定にしてもうまくいかないデータも有りますね。
・オートコレクトが効く状態(標準)で、(c),(r),(tm)などを入力
・(Windows2000/XPで?) IMEからUnicodeにしかない文字を選択して入力
・その他、Unicodeが表示できるアプリからのコピー&ペースト
などの方法を使うことにより、Unicodeにしか無い文字をExcel上に入力できます。

ASC関数の定義が怪しいですが、
(少なくともExcel2000では) Unicodeにあり、SJISに無い文字の扱いは
・アクセント記号つきの英字など、基本の文字がある場合
→ アクセント記号無しの英字が返る
・その他
→ 0x3F(10進で63)、"?"の文字コードが返る
ようです。
# まあ WindowsAPIのUnicode関連の関数はそんなもののような気もします。

そんなデータを考慮するのであれば、
・Asc()の結果が 0x20(32)〜0x7F(127) で AscW()の結果が 0x80(128)〜0xFF(255)の場合
・Asc()の結果が 0x3F(63) で AscW()の結果が 0x3F以外の場合
も、機種依存扱いでいいような気もします。
# そんなデータ入れないか…。




アドバイスありがとうございます。
UNICODEにしかない文字なんて、まるで眼中になかったです。

このあたりのチェックも組み込む方向で検討します。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-02-12 16:58
はにまるです。
引用:

NAL-6295さんより:
double型の0.0001を1万回足したら何になるか質問して見てください。
1と言ったら危険です。


引用:

きくちゃんさんより:
VBだから問題なんですよね〜。で、大体、テストでは問題なくても、実運用で問題が発生してしまうという。



「まるめ誤差」の問題ですね、、、
や・ば・い!テストケースに盛り込んでいない。TT

早速、対策打合わせをしました... ^^;
で、結果、開発規定書に「浮動小数型の変数の利用は禁止」と追記する事にしました。

# レベルの低い対応ですが、そこまでパートナーさんを管理出来ない..
# 開発規定書で制限を掛けるって、技術者としては、なんか嫌な話だな...

Clusterさんへ>

  不要な御節介と思いますが、
  機種依存文字の排除の際には、社外帳票と法定帳票に御注意下さい。

  社員名、取引先名、住所の場合は、正式名称では無い入力になる為、
  業務担当者から苦情が発生する可能性があります。
  帳票機能に絞って、入力制限の掛かるフィールドが利用されるか
  調査し、業務担当者に事前連絡する事をお勧めいたします。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-02-12 17:08
引用:

はにまるさんの書き込み (2004-02-12 16:58) より:
はにまるです。
引用:

NAL-6295さんより:
double型の0.0001を1万回足したら何になるか質問して見てください。
1と言ったら危険です。


引用:

きくちゃんさんより:
VBだから問題なんですよね〜。で、大体、テストでは問題なくても、実運用で問題が発生してしまうという。



「まるめ誤差」の問題ですね、、、




まるめ誤差というよりも、コンピュータは小数点が苦手ってのが本質です。
2進数における小数点以下の各桁を10進数にすると
0.5
0.25
0.125
0.0625
としか表現できない事に起因しています。

#トリビア風に言うと「コンピュータは10進数の0.1を正しく表現できない。」
#って違ってたら誰か突っ込んでください。
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-02-12 17:22
どんどん、どんどん話題がずれていく
引用:

NAL-6295さんの書き込み (2004-02-12 17:08) より:
#トリビア風に言うと「コンピュータは10進数の0.1を正しく表現できない。」
#って違ってたら誰か突っ込んでください。


それで合っています。「浮動小数点の」という条件付きですけど。
10進の0.1も、2進では 0.00011001100110011001100…… と無限に続くと思います。


でも、そうでない格納方式もあったります。BCD(2進化10進)とかは、効率は悪いけど10進を正しく格納します。有効桁数の範囲内なら。
.NETでいうと、System.Decimal なのかな?調べたことがないので自信が無いんですけど

[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-02-12 17:26 ]
Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 2004-02-12 17:29
引用:

はにまるさんの書き込み (2004-02-12 16:58) より:

Clusterさんへ>

  不要な御節介と思いますが、
  機種依存文字の排除の際には、社外帳票と法定帳票に御注意下さい。

  社員名、取引先名、住所の場合は、正式名称では無い入力になる為、
  業務担当者から苦情が発生する可能性があります。
  帳票機能に絞って、入力制限の掛かるフィールドが利用されるか
  調査し、業務担当者に事前連絡する事をお勧めいたします。




超蛇足ですが、法定帳票の場合機種依存文字よりもまずフォントの問題が
先に出ますよね。例の「しめすへん」の「ネ」と「示」とか...
最近は許されるようになったのかな?
Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 2004-02-12 17:35
本題に戻して...

引用:

Clusterさんの書き込み (2004-02-09 17:39) より:

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

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

# 文字コードを取ってきてゴニョゴニュすればいけそうな気がするのですが、
# いまいち良く分からなくて・・・。
# 今は、機種依存文字を1文字ずつ、InStr関数でチェックしていますが、
# もっとスマートな方法がないかと思いまして(^^;




コードでの比較の他にも、正規表現ではじくということもできます。
数が多いと大変ですが...
UnicodeについてはとりあえずVBAならStrConvで変換して比較するということ
になるのでしょうけど...Unicodeにしかない機種依存文字って、
StrconvでSJISに変換したらどうなるんでしょうねぇ?

※どんな文字なのかわからない私(^^ゞ
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-02-12 17:42
はにまるです。

引用:

ぢゃん♪さんより:
それで合っています。「浮動小数点の」という条件付きですけど。
でも、そうでない格納方式もあったります。BCD(2進化10進)とかは、効率は悪いけど10進を正しく格納します。有効桁数の範囲内なら。


旧VBでは、固定小数点の変数型が用意されているので、それで回避です!

引用:

Beatleさんより:
超蛇足ですが、法定帳票の場合機種依存文字よりもまずフォントの問題が
先に出ますよね。例の「しめすへん」の「ネ」と「示」とか...
最近は許されるようになったのかな?


以前やったシステムでは、電子帳簿保存法で申請している帳票に関しては、監査法人からOKが出ました。
その対応にIBM拡張漢字の変換一覧を作成しました ^^;


[ メッセージ編集済み 編集者: はにまる 編集日時 2004-02-12 17:43 ]
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-02-12 18:07
引用:

旧VBでは、固定小数点の変数型が用意されているので、それで回避です!


ぅわ、余計なこと言っちゃったかな…?

念のためですが、実数を扱う場合、結局どの型を使っても誤差との戦いは避けられませんので。
(たとえば 1÷3 なんて、浮動小数点だろうが2進化10進だろうが必ず誤差は出ます。)

#って、この例だと整数だろうが誤差が出るから意味ないか

[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-02-12 18:15 ]

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