Page 159 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼数字データの文字扱い avx9200 03/1/9(木) 15:20 ┗Re:数字データの文字扱い こうちゃん 03/1/9(木) 20:14 ┗Re:数字データの文字扱い avx9200 03/1/9(木) 21:48 ┗Re:数字データの文字扱い こうちゃん 03/1/10(金) 9:03 ┗Re:数字データの文字扱い avx9200 03/1/10(金) 12:53 ┗Re:数字データの文字扱い こうちゃん 03/1/10(金) 21:21 ┗Re:数字データの文字扱い avx9200 03/1/12(日) 11:27 ┗Re:数字データの文字扱い こうちゃん 03/1/12(日) 23:17 ┣Re:数字データの文字扱い avx9200 03/1/13(月) 11:50 ┗Re:数字データの文字扱い avx9200 03/1/13(月) 11:59 ─────────────────────────────────────── ■題名 : 数字データの文字扱い ■名前 : avx9200 ■日付 : 03/1/9(木) 15:20 -------------------------------------------------------------------------
ACCESS200を使用しています。 バーコードリーダーを使用し、データを読み込んでいます。 そのデータの値を元に条件を付けて値を決めています。 例)条件:読み込んだ値<15000→A、>15000→Bとして実際に読み込んだ値が 15001の場合:Aになるという感じです。 今までは数値だけで問題なかったのですが英語(HEX値)が入ってきたためおかしくなりました。実際に読み込んだ値:1500Aの場合→AにしたいのですがBになってしまいます。 そこで読み込んだ値を全て文字扱いにすれば正しく判定できると思うのですが、その方法が判りません。また他の方法がありましたらお願いします。 上記、条件はモジュール内で設定しています。 |
avx9200さん、こんばんは >ACCESS200を使用しています。 >バーコードリーダーを使用し、データを読み込んでいます。 >そのデータの値を元に条件を付けて値を決めています。 >例)条件:読み込んだ値<15000→A、>15000→Bとして実際に読み込んだ値が >15001の場合:Aになるという感じです。 15001は15000より大きいので、Bじゃあないんですか? >今までは数値だけで問題なかったのですが英語(HEX値)が入ってきたためおかしくなりました。実際に読み込んだ値:1500Aの場合→AにしたいのですがBになってしまいます。 >そこで読み込んだ値を全て文字扱いにすれば正しく判定できると思うのですが、その方法が判りません。また他の方法がありましたらお願いします。 >上記、条件はモジュール内で設定しています。 数値を文字列に変換するにはCStr関数でできますし、16進で比較するなら &hつけてやれば16進として比較します。 こんな感じです・・ CLng("&h" & CStr(読み込んだ値)) < CLng(&h15000") ※この場合1500Aをバーコードリーダーで読み込んだら文字として読み込まれるのでしょうか?チョッとわかりません^^; 文字として認識しているならCStrは必要ないですね でも1500Aを16進で評価すれば、86026で、15000を16進で評価すれば86016ですから→Bになってしまうのではないでしょうか? #文字列で比較しても "1500A" > "15000" ですからBになりますね いずれにしても、条件を整理してみてくださいね。 |
▼こうちゃん さん: >15001は15000より大きいので、Bじゃあないんですか? 入力ミスでした。すいません。 >数値を文字列に変換するにはCStr関数でできますし、16進で比較するなら >&hつけてやれば16進として比較します。 >こんな感じです・・ >CLng("&h" & CStr(読み込んだ値)) < CLng(&h15000") >※この場合1500Aをバーコードリーダーで読み込んだら文字として読み込まれるのでしょうか?チョッとわかりません^^; >文字として認識しているならCStrは必要ないですね >でも1500Aを16進で評価すれば、86026で、15000を16進で評価すれば86016ですから→Bになってしまうのではないでしょうか? >#文字列で比較しても "1500A" > "15000" ですからBになりますね >いずれにしても、条件を整理してみてくださいね。 説明不足で申し訳ありません。 ちょっとやっかいな仕組みになっています。 読み込む桁数は必ず10桁です。 しかし頭の4桁は数値(10進法:0〜9)で途中の5桁は16進法(00001〜FFFFF)、最後の1桁はまた10進法(0〜3のみ)となっています。 途中に16進法が入っていると文字扱いになるみたいです。 また必ず途中にアルファベット(16進法)が入るとは限りません。 ですから読み込んだ数値のみの値を文字扱いしたあと、条件で振り分ける感じとなります。 細かく条件設定するしかないのでしょうか。 |
avx9200さん、おはようございます >説明不足で申し訳ありません。 >ちょっとやっかいな仕組みになっています。 >読み込む桁数は必ず10桁です。 >しかし頭の4桁は数値(10進法:0〜9)で途中の5桁は16進法(00001〜FFFFF)、最後の1桁はまた10進法(0〜3のみ)となっています。 >途中に16進法が入っていると文字扱いになるみたいです。 >また必ず途中にアルファベット(16進法)が入るとは限りません。 >ですから読み込んだ数値のみの値を文字扱いしたあと、条件で振り分ける感じとなります。 >細かく条件設定するしかないのでしょうか。 そ、ですね。 バーコードリーダーで読み込んだものを上記条件で分割して振り分ければいいのではないでしょうか。 Cint(Mid(読み込んだ文字列,1,4)) Clng("&h" & Mid(読み込んだ文字列,5,5)) Cint(Mid(読み込んだ文字列,10,1)) #読み込んだ文字列が変数に格納されていて、Variant型ならCstr(読み込んだ文字列)のように、いったん文字型に強制変換しておいたほうがいいかも・・ |
▼こうちゃん さん: 回答有り難うございます。 >Cint(Mid(読み込んだ文字列,1,4)) >Clng("&h" & Mid(読み込んだ文字列,5,5)) >Cint(Mid(読み込んだ文字列,10,1)) > >#読み込んだ文字列が変数に格納されていて、Variant型ならCstr(読み込んだ文字列)のように、いったん文字型に強制変換しておいたほうがいいかも・・ 説明されている内容はなんとなく理解できます。 が、実際にプロシージャとして記述するとなるとよく判りません。 申し訳ありませんが説明していただけないでしょうか。 以下が今までのプロシージャです。 ここで記載されている[SN]がバーコードリーダーで読み込んだ値です。 [C/M]=1とか=4とはテーブルに設定してある値です。 Private Sub SN_AfterUpdate() If (Me![SN]) > 1510000000 Then [C/M] = 1 End If If (Me![SN]) > 1560000000 Then [C/M] = 4 End If End Sub |
▼avx9200 さん: >説明されている内容はなんとなく理解できます。 >が、実際にプロシージャとして記述するとなるとよく判りません。 >申し訳ありませんが説明していただけないでしょうか。 > >以下が今までのプロシージャです。 >ここで記載されている[SN]がバーコードリーダーで読み込んだ値です。 >[C/M]=1とか=4とはテーブルに設定してある値です。 > >Private Sub SN_AfterUpdate() > > If (Me![SN]) > 1510000000 Then > [C/M] = 1 > End If > If (Me![SN]) > 1560000000 Then > [C/M] = 4 > End If > End Sub 各桁ごとでSNをどう設定すればいいのか教えていただかないと難しいですね。 でも、まあ、Me![SN]はテキストボックスのようなので、 Cint(Mid(Me![SN],1,4)) Clng("&h" & Mid(Me![SN],5,5)) Cint(Mid(Me![SN],10,1)) を使って比較すればいいんじゃないでしょうか。 判定条件はいい加減ですがこんな感じです・・ If Cint(Mid(Me![SN],1,4)) > 1510 AND _ Clng("&h" & Mid(Me![SN],5,5)) > 65000 AND _ Cint(Mid(Me![SN],10,1)) > 5 Then [C/M] = 1 End If たとえば SNが 15111A0001 のときには 1511×1000000+&h1A000×10+1 と全体を数値に翻訳?して解釈すればいいのですか? それとも4桁数値、5桁16進数、1桁数値、それぞれで条件があるのですか? 4桁数値、5桁16進数、1桁数値のそれぞれがどんな値の時に[C/M]に何を設定するのか教えてくださいね。 |
▼こうちゃん さん: 連絡が遅くなり申し訳ありませんでした。 以下に簡単(?)に説明させて頂きます。 頭4桁は多少変化はありますがほぼ固定です。 5〜9桁は「00001〜fffff」(16進)=1〜1,048,575台の中での製品番号を意味します。桁数値に意味はありません。 以前は10進での表記だったのですが台数が増加したため途中から16進を使用するようになりました。 識別するのはあくまで頭4桁(実際には3桁数値め)で条件分岐させます。 もっと詳しく説明すると・・・。 1桁数値:製品種:1〜9使用 2桁数値:基板種:1〜9使用 3桁数値:C/M拠点:1〜9使用 4桁数値:PA拠点:1〜9使用 5〜9桁数値(16進):製品個別番号:00001〜FFFFF使用 10桁数値:0固定または左:1、中:2、右:3 バーコードで読んだ値で「どのC/M拠点で製造したもの」かを自動でテーブルに値を取り込むようにしています。 本当は「3桁数値」(C/M拠点)だけで条件分岐させテーブル[C/M]の値で取り出したいのですが。 また現在は数値のみを使用していますが今後拠点が増加すると16進対応もあり得ます。 初めからからちゃんと説明しておけばお手数かけずにすんでいたのでしょうが申し訳ありません。 宜しくお願いします。 |
avx9200さん、こんばんは >識別するのはあくまで頭4桁(実際には3桁数値め)で条件分岐させます。 >もっと詳しく説明すると・・・。 >1桁数値:製品種:1〜9使用 >2桁数値:基板種:1〜9使用 >3桁数値:C/M拠点:1〜9使用 >4桁数値:PA拠点:1〜9使用 >バーコードで読んだ値で「どのC/M拠点で製造したもの」かを自動でテーブルに値を取り込むようにしています。 >本当は「3桁数値」(C/M拠点)だけで条件分岐させテーブル[C/M]の値で取り出したいのですが。 前の書き込みの以下で3桁目が「6」の場合の[C/M] = 4 というのがあったのでちょっと気にはなるのですが・・・ > If (Me![SN]) > 1510000000 Then > [C/M] = 1 > End If > If (Me![SN]) > 1560000000 Then > [C/M] = 4 > End If 3桁目だけをMid関数で取り出して分岐すればいいんじゃないでしょうか。 こんな感じでどうでしょ・・ Select Case Mid(Me![SN], 3, 1) Case "0" [C/M] = 0 Case "1" [C/M] = 1 Case "2" [C/M] = 2 Case "3" [C/M] = 3 Case "4" '一応前の書き込みのとおりに・・ [C/M] = 6 ' ・ ' ・ '必要に応じてCaseを調整してください。 ' ・ ' ・ Case "9" [C/M] = 9 End Select #将来16進になった場合も文字型のまま処理しておけばCaseを増やすだけで対応できますよね。 |
▼こうちゃん さん: またまた説明不足で申し訳ありません。 現時点では「S/NとC/M拠点との数値:1〜9」は完全に一致していません。 で、記述されていたとおりにプロシージャを書きました。 Private Sub SN_AfterUpdate() Select Case Mid(Me![SN], 3, 1) Case "1" [C/M] = 1 Case "2" [C/M] = 2 Case "3" [C/M] = 3 Case "4" [C/M] = 6 End Select END Sub しかし次のエラー表示がされます。 イベントプロパティに指定した式 更新後処理でエラーが発生しました。 *マクロ名、ユーザー定義関数名、「イベントプロシージャ」以外の式が指定されています。 関数、イベント、マクロの評価でエラーが発生しました。 確かに上記プロシージャはEXCEL上では関数として動作しているのですが。 何がいけないのでしょうか。 |
▼こうちゃん さん: すいませんでした。 一度accessを立ち下げて、再度ファイルを起動したら正常に動作しました。 大変、お手数をおかけして申し訳ありませんでした。 また、長らく対応して頂き有り難うございました。 今後何かありましたら宜しくお願いします。 |