2018年03月04日
EXCELでISBNの変換
これまで何気なくやっていたISBNによる所蔵の重複チェックですが、少し古い資料の場合、ISBN10で書誌を作られている場合があります。そういう資料を最近購入した場合、ISBN13が付与されなおしています。これは出版、及び図書館業界では共通認識で、図書館システムなんかにも、自動で変換してチェックをしてくれたりします。
ISBNが何?って人はとりあえずこちら(TRC)やこちら(Wikipedia)をご覧いただければと思いますが、簡単に言うと、本固有の記号ですね。車とか家電とかパソコンとかの型式番号に近いものです。ただ、国際的に振出のルールが決まっていて、それが2007年を境に10桁から13桁に変更されたのですね。なので、2007年以前に出版されたものが、2007年以降に重版やらなんやらで販売される場合、10桁から13桁に書き換えられています。
で、問題なのは、そういう資料は割と高い確率で書誌データにISBN10が採用されているんですね。なので、あとから購入したものと同じ本なのにISBNが違う、という事態が発生します。図書館システムならまず同じものとして扱ってくれますが、それは業界ルールだからであって、世間一般のルールではありません(笑)EXCELにとってはISBN10とISBN13は、完全に別の値なのです。なので、EXCEL上で比較する場合、どちらかの形式に変換して統一しないといけないのですが、それがまあ、ちょっと面倒くさいなあ、という場面に最近出会ってしまったのでした。
10桁から13桁の変換は基本的には頭に「978」をつければ完成なので問題ないのですが、面倒なのはチェックデジットの計算が変わってしまうことです。計算方法自体は単純で特に問題ありませんが、それをEXCEL上でどうやって関数で表現するか、となるとなかなかめんどくさいですね^^
VBAなら割と簡単で、
Private Sub ISBN
dim x as long,z as long
dim cd as long 'チェックデジットを格納する変数
dim y(12) as long ’ISBNの1桁目から12桁目までの数字を格納する変数
dim isbn10 as string,isbn13 as string 'ISBN
isbn10 = cells(1,1) 'セルA1にISBN10が入力されているとして
isbn13 = "978" & isbn10 'ISBN10の頭に「978」を付けてISBN13の形にする
for x = 1 to 12 ’For NextでISBNの各桁の数字を獲得。13桁目はチェックデジットなので不要。
y(x) = mid(isbn13,x,1)
next x
'奇数桁の和*1と偶数桁の和*3の総和を計算する。
z = (y(1)+y(3)+y(5)+y(7)+y(9)+y(11))+(y(2)+y(4)+y(6)+y(8)+y(10)+y(12))*3
z = z mod 10 '総和を10で割った余りを計算する。
cd = 10-z '10から余りを引くとチェックデジットになる。
isbn13 = mid(isbn13,1,12) & cd '初めに作ったISBN13の12桁目までと、チェックデジットを合わせる。
End Sub
書き方はいくつかありますが、おおざっぱにはこんなところです。
これを関数で表現するのは、意外にめんどくさくて、mid関数を12個使うのか、まあ、978は固定なのでそこを除いても9個使うのか、となるとあんまりスマートじゃないなあ、メンテも面倒そうだなあ、使いまわしが面倒そうだなあ、となるわけです。いくつか案はあるけど、どれも「スマートだぜ」とは言えない状況です。
大したことではないけど、ちょっとした悩みでした。
ISBNが何?って人はとりあえずこちら(TRC)やこちら(Wikipedia)をご覧いただければと思いますが、簡単に言うと、本固有の記号ですね。車とか家電とかパソコンとかの型式番号に近いものです。ただ、国際的に振出のルールが決まっていて、それが2007年を境に10桁から13桁に変更されたのですね。なので、2007年以前に出版されたものが、2007年以降に重版やらなんやらで販売される場合、10桁から13桁に書き換えられています。
で、問題なのは、そういう資料は割と高い確率で書誌データにISBN10が採用されているんですね。なので、あとから購入したものと同じ本なのにISBNが違う、という事態が発生します。図書館システムならまず同じものとして扱ってくれますが、それは業界ルールだからであって、世間一般のルールではありません(笑)EXCELにとってはISBN10とISBN13は、完全に別の値なのです。なので、EXCEL上で比較する場合、どちらかの形式に変換して統一しないといけないのですが、それがまあ、ちょっと面倒くさいなあ、という場面に最近出会ってしまったのでした。
10桁から13桁の変換は基本的には頭に「978」をつければ完成なので問題ないのですが、面倒なのはチェックデジットの計算が変わってしまうことです。計算方法自体は単純で特に問題ありませんが、それをEXCEL上でどうやって関数で表現するか、となるとなかなかめんどくさいですね^^
VBAなら割と簡単で、
Private Sub ISBN
dim x as long,z as long
dim cd as long 'チェックデジットを格納する変数
dim y(12) as long ’ISBNの1桁目から12桁目までの数字を格納する変数
dim isbn10 as string,isbn13 as string 'ISBN
isbn10 = cells(1,1) 'セルA1にISBN10が入力されているとして
isbn13 = "978" & isbn10 'ISBN10の頭に「978」を付けてISBN13の形にする
for x = 1 to 12 ’For NextでISBNの各桁の数字を獲得。13桁目はチェックデジットなので不要。
y(x) = mid(isbn13,x,1)
next x
'奇数桁の和*1と偶数桁の和*3の総和を計算する。
z = (y(1)+y(3)+y(5)+y(7)+y(9)+y(11))+(y(2)+y(4)+y(6)+y(8)+y(10)+y(12))*3
z = z mod 10 '総和を10で割った余りを計算する。
cd = 10-z '10から余りを引くとチェックデジットになる。
isbn13 = mid(isbn13,1,12) & cd '初めに作ったISBN13の12桁目までと、チェックデジットを合わせる。
End Sub
書き方はいくつかありますが、おおざっぱにはこんなところです。
これを関数で表現するのは、意外にめんどくさくて、mid関数を12個使うのか、まあ、978は固定なのでそこを除いても9個使うのか、となるとあんまりスマートじゃないなあ、メンテも面倒そうだなあ、使いまわしが面倒そうだなあ、となるわけです。いくつか案はあるけど、どれも「スマートだぜ」とは言えない状況です。
大したことではないけど、ちょっとした悩みでした。
【このカテゴリーの最新記事】
-
no image
-
no image
-
no image
-
no image
-
no image
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7389635
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック