[[20031106174955]] 『16桁の整数を7で割って余りを求めたい』(YS) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『16桁の整数を7で割って余りを求めたい』(YS)

 バーコード(NW−7)のチェックデジット(7チェックDR)を計算しています。
 つまり、ID(1〜16桁の整数)を7で割って余りを求めるわけですが、
 Excelの仕様は15桁までなので、単純にMOD(A1,7)では#NUM!となってしまいます。
 苦肉の策で、下記のような式で計算していますが、もっと良い方法があればご教授下さい。

            A                   B
 1          ID	          チェックデジット
 2   2003110400000001           5 =IF(LEN(A2)<16,A2-QUOTIENT(A2,7)*7,
 3   2003110400000002           6   MOD((A2-QUOTIENT(A2,7)*7)+RIGHT(A2,1),7))
 4   2003110400000003           0
 5   200311041000001            1
 6   200311041000002            2
 7   200311041000003            3
 8   200311041000004            4

 上の数字から考えるに、
 上何桁かが共通なわけですよね。
 (JANコードの原産国・メーカーIDのように)

 (EUREKA)

 アドイン無しでも以下でいけそうです。

 =MOD(MOD(LEFT(A2,8),7)*10^(LEN(A2)-8)+RIGHT(A2,LEN(A2)-8),7)

 もっといい方法かと言われると・・・^^;汗
 (KAMIYA)

 >上何桁かが共通なわけですよね。
 実際に使用する場合はもちろんそうなんですが、
 今回の目的はシステムの確認なので、わざと、できるだけ、バラバラにします。
 桁数も、わざと違うものを作って混在させます。

 >もっといい方法かと言われると・・・
 いえいえ、ありがとうございます。
 私のより短いし、IFを使っていないし、すっきりしてます!
 早速これまでのものと差し替えて使ってみます。
 (YS)

 8桁以下だとエラーになってしまいますが、
 それでもよかったのでしょうか?
 サンプルから、9桁以上と勝手に判断してしまい、

 >ID(1〜16桁の整数)

 を見落としていました。
 (KAMIYA) 

 すみません、1〜8桁の場合も必要です。私も確認していませんでした。
 でも、1〜8桁ならMOD(ID,7)で計算できるので、
 IFを使って9桁未満・以上で分けてももいいかな、と思っています。
 ありがとうございました。
 (YS)

 へぇへぇへぇ〜 と確認していたら、MODって対象の数値が10桁ぐらいになると
 #NUM!になるみたいですね。
 探したら、こんなんでました。

 [XL] MOD() 関数で #NUM! エラー値が返される
http://support.microsoft.com/default.aspx?scid=kb;ja;119083&Product=excelJPN

        A                              B               C          D               E
 1  2003110400000001		20031104		2	00000001		5
 2  2003110400000002		20031104		2	00000002		6
 3  2003110400000003		20031104		2	00000003		0
 4  200311041000001		2003110		4	41000001		1
 5  200311041000002		2003110		4	41000002		2
 6  200311041000003		2003110		4	41000003		3
 7  12345678901324567890123		123456789013245	2	67890123		4

 作業列を使いますけど、1〜17桁対応です。
 B1に =LEFT(A1,LEN(A1)-8)
 C1に =IF(ISERROR(B1),"",MOD(B1,7))
 D1に =RIGHT(A1,8)
 E1に =IF(D1="","",MOD(C1&D1,7))
 B〜D列は非表示に。
 よくみるとKAMIYAさんのとほぼ同じだったりします(汗)。
 違いといえば、作業列が増えたことと、1〜17桁対応ということと、
 下位桁から確保すること。

 1〜23桁対応にするには
 C1は =IF(ISERROR(B1),"",B1-(INT(B1/7)*7)) 

 ↓で真祖通りすがりの者さんが使用している名前定義の方法なら、すっきりします。
[[20031013101121]] 『スペースを入れて表示』(ななえ)

 (ramrun)寝て曜日〜

 >[XL] MOD() 関数で #NUM! エラー値が返される
 へ〜、Excelは15桁までなのに10桁程度で#NUM!になるのはなぜ?と思っていたんですが、
 >MOD() 関数では、"除数" に 134,217,728 (2 の 27 乗) を掛けた値が、"数値" 以下となる場合、#NUM! エラー値が返されます。
 と、いうことなんですね。
 確かに、 134217728*7=939524096   MOD(939524096-1,7)=6, MOD(939524096,7)=#NUM! ですね。
 納得。

 >真祖通りすがりの者さんが使用している名前定義の方法なら、すっきりします。
 名前定義でもうまくいきました。
 ただ、難点は、実際に使う人は名前定義を全く使ったことがないので
 どういう計算をしているか、理解してもらうのが大変かも。

 KAMIYAさんの
 >アドイン無しでも以下でいけそうです。
 が、最初何のことかわからなかったんですが、私が使っていたQUOTIENTってアドインだったんですね。
 QUOTIENTやDEC2HEXとか日常的に使っているので、
 ramranさんがINTを使ってるのを見るまで忘れてました。
 レス書くとき気をつけねば。

 皆さん、ありがとうございました。
 (YS)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.