ここから本文です

ヤマト運輸のチェックデジットの算出方法

t_almeida_314さん

2011/4/1223:00:28

ヤマト運輸のチェックデジットの算出方法

ヤマト運輸の問合せ番号(11桁)チェックデジット(1桁)このチェックデジットの算出方法が
分りません。7チェックと言うのは、聞いた事がありますが、算出方法が全く分りません。

エクセルのシート上での求め方と出来ればVBAでの求め方も分れば幸いです。

何方かお分かりになる方がいらっしゃいましたらよろしくお願いします。

閲覧数:
14,126
回答数:
2

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

m_taka2さん

2011/4/1310:48:23

ヤマトのチェックデジットは、単純に7で割った余りになっています。
たとえば、11桁が、1234-5678-901? だったら、
「12345678901」を7で割った余りは3ですので、チェックデジット込みの全体の番号は
「1234-5678-9013」になります。

これをそのまま式にしてもいいのですが、桁数が多すぎて計算できない場合もあるようですので、ちょっと修正して、

セルA1に「1234-5678-901」という文字列が入っているのなら、
ワークシート上では「=MOD(LEFT(A1,4)*3+MID(A1,6,4)*6+MID(A1,11,3),7)」で、チェックデジットの「3」が求まります。

(「12345678901」という11桁の数は32bit整数の範囲を超えており32bit演算はできませんので、
「1234」「5678」「901」の3つに分けて計算しています。10000000を7で割った余りは3、1000を7で割った余りは6であることを利用しています)

VBAの場合なら、
---
Function checkdigit(data)
checkdigit = (Left(data, 4) * 3 + Mid(data, 6, 4) * 6 + Mid(data, 11, 3)) Mod 7
End Function
---

こんな感じ。これで、「checkdigit("1234-5678-901")」と呼び出せば「3」が返って来ます。

質問した人からのコメント

2011/4/13 16:18:25

降参 ありがとうございます。うまく算出できました!

ベストアンサー以外の回答

1〜1件/1件中

mahoo_nieeさん

2011/4/1309:47:23

「7チェック」はどの方式ですか?。
それがわからないことには組み立てもできません。
算出にて、一般的な式でよいか、そのシステム独自の式になるのかは確認してください。
仕様提示した人に聞く。

ここでコード等を提示されたとして、それが本当に正しいのかどうかはあなたは判断できません。
そこが一番の問題です。作り方は任せたとしてもどの算出結果なら正しい、かは把握してください。

「7チェック」と言葉でいっても違う概念の算出を採用すればおかしくなるので、
「これのことですか?、この算出式ですよね?」
「こういう値のときはこういう結果になる式ですね?」
という裏づけ、は着手前に相手に確かめておくべきです。
これのことだろう、という個人の解釈で進めてはダメです。
http://www.kabukoba.co.jp/info/barcode/check.htm

算出仕様が分かればそれをシートなりVBAなり組み立てるわけですが、
シートでは、こんな感じで作っていきます。
「49010051359」の11桁があれば
まずこの値をA1に入力し
A2にはmid(a1,1,1)
B2にはmid(a1,2,1)
C2にはmid(a1,3,1)
D2にはmid(a1,4,1)
・・・
としていくと1桁ずつに区切られた状態になります。
チェックデジットはその1桁1桁に定数をかけたりしていくので、
1,3,5,7,9桁目にのみ×10とかあれば、
A3にはa2*10
C3にはc2*10
E3にはe2*10
・・・
チェックデジット末尾桁はその値を合計したりしていくので、
1桁目+2桁目+3桁目・・・とあれば、
L3にはC1+C2+C3+C4+C5・・・です。
さらに7で割った余りとあれば、
L4にはL3/7の余りを出す。
L4がチェックデジットの桁です、という具合になります。
L4が「2」なら、
「49010051359」の末尾が「2」、
結果「490100513592」がコードとなる。
これとデータ上のコードと照らし合わせてあっていれば問題なし、違えばズレている、となる。

VBAになると
「49010051359」を引数で渡して、末尾桁を返すか、12桁を返す。
for文mid関数で11桁数分繰り返し1桁ずつに区切ります。
区切られた1桁1桁を配列に退避して、そこを操作します。

日本語説明の仕様をコードに落とすためにはどうしたらいいか、
これができるようにならないと、提示された仕様からシステムを構築はできません。
日本語説明仕様をプログラムの仕様に置き換えながら大まかな骨組みが確定させる、
そこからコードを作り始める、細かい部分のコードはそれから考える。
11桁を1桁ずつチェックなので、どうやってそれぞれを1桁にするか、
11桁数繰り返しはどの関数、命令が使えるか、
途中の算出結果はどこに保持させるか、
そんな感じで組み立ては進んでいますか?。

上司ほか有識者とレビューをしましょう。

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。