VBAでASINがISBN-10形式か判定し、ISBN-13へ変換する方法

Amazonの商品コードである「ASIN」には、書籍の場合、ISBN-10と同じ形式の10桁のコードが設定されていることがあります。

この記事では、VBAを使って、

  1. ASINがISBN-10形式かどうかを判定する
  2. ISBN-10をISBN-13へ変換する

という処理を行う方法を紹介します。

1.ISBN-10形式を判定する

まず、対象の文字列がISBN-10として扱える形式かどうかを判定します。

今回の判定条件は次の3つです。

  • 全体で10桁である
  • 先頭9桁が数字である
  • 10桁目が数字、または「X」「x」である

ISBN-10では、最後のチェックデジットに「X」が使用される場合があります。

例えば、次のような値はISBN-10形式として判定します。

410109205X 
410109205x 
9784101092050

一方、10桁ではないものや、先頭9桁に数字以外の文字が含まれるものは対象外です。

ISBN10形式判定関数

Private Function ISBN10形式判定(ByVal asinVal As String) As Boolean

    Dim s As String
    s = Trim(asinVal)

    If Len(s) <> 10 Then
        ISBN10形式判定 = False
        Exit Function
    End If

    ' 先頭9桁は数字のみであること
    If Not 数字のみ判定(Left(s, 9)) Then
        ISBN10形式判定 = False
        Exit Function
    End If

    ' 末尾1桁は数字、または「X」(チェックデジット表記)であること
    Dim lastChar As String
    lastChar = Right(s, 1)

    If 数字のみ判定(lastChar) Or UCase(lastChar) = "X" Then
        ISBN10形式判定 = True
    Else
        ISBN10形式判定 = False
    End If

End Function

処理のポイント

最初にTrimを使用して、前後に余分なスペースがあっても判定できるようにしています。

s = Trim(asinVal)

次に、Lenで文字数を確認します。

If Len(s) <> 10 Then

10文字でなければISBN-10形式ではないため、ここで処理を終了します。

その後、先頭9文字がすべて数字かどうかを確認します。

If Not 数字のみ判定(Left(s, 9)) Then

関数「数字のみ判定」は、以下に詳細説明がありますので、参照してください。

最後に10文字目を確認します。

If 数字のみ判定(lastChar) Or UCase(lastChar) = "X" Then

UCaseを使用しているため、「X」だけでなく「x」も許容できます。

※この関数では、ISBNとして実際に正しいかどうかをチェックする「チェックデジットの検証」は行っていません。あくまで「ISBN-10として扱える文字形式か」を判定しています。


2.ISBN-10をISBN-13へ変換する

ISBN-10をISBN-13へ変換する場合、ISBN-10の最後にあるチェックデジットはそのまま使用しません。

例えば、

ISBN-10
410109205X

の場合、まず最後の「X」を除いた9桁を取り出します。

410109205

そして先頭に「978」を付けます。

978410109205

この12桁をもとに、ISBN-13用の新しいチェックデジットを計算します。


ISBN-13のチェックデジット計算

ISBN-13では、12桁の数字について、

  • 1桁目 → 1倍
  • 2桁目 → 3倍
  • 3桁目 → 1倍
  • 4桁目 → 3倍
  • ・・・

というように、1倍と3倍を交互に掛けます。

例えば、

978410109205

の場合は次のようになります。

9 × 1
7 × 3
8 × 1
4 × 3
1 × 1
0 × 3
1 × 1
0 × 3
9 × 1
2 × 3
0 × 1
5 × 3

これらをすべて合計し、その合計値からチェックデジットを計算します。

計算式は次のとおりです。

チェックデジット
= (10 - (合計値 Mod 10)) Mod 10

最後に、このチェックデジットを12桁の数字に追加すると、13桁のISBN-13になります。


3.ISBN-10 → ISBN-13変換のVBA

実際の変換処理は次のようになります。

Private Function ISBN10to13変換(ByVal isbn10 As String) As String

    Dim core9 As String
    core9 = Left(isbn10, 9)     ' 先頭9桁のみ使用(末尾の元チェックデジットは使わない)

    Dim base12 As String
    base12 = "978" & core9      ' 978プレフィックスを付与した12桁

    Dim i As Long, d As Long, total As Long
    total = 0
    For i = 1 To 12
        d = CLng(Mid(base12, i, 1))
        If i Mod 2 = 1 Then
            total = total + d * 1    ' 奇数桁目は重み1
        Else
            total = total + d * 3    ' 偶数桁目は重み3
        End If
    Next i

    Dim checkDigit As Long
    checkDigit = (10 - (total Mod 10)) Mod 10    ' 新しいチェックデジットを計算

    ISBN10to13変換 = base12 & CStr(checkDigit)

End Function

4.変換処理のポイント

① ISBN-10の先頭9桁だけを使用する

core9 = Left(isbn10, 9)

ISBN-10の10桁目は元のチェックデジットです。

そのため、10桁目が数字であっても「X」であっても、この変換では使用しません。

例えば、

410109205X

なら、

410109205

だけを取り出します。


② 「978」を先頭に追加する

base12 = "978" & core9

これにより、

410109205

が、

978410109205

という12桁になります。

今回の処理では、仕様により「979」は考慮せず、「978」を使用しています。


③ 1倍・3倍を交互に計算する

For i = 1 To 12

    d = CLng(Mid(base12, i, 1))

    If i Mod 2 = 1 Then
        total = total + d * 1
    Else
        total = total + d * 3
    End If

Next i

i Mod 2を使うことで、奇数桁と偶数桁を判定しています。

奇数桁 → 1倍
偶数桁 → 3倍

という処理になります。


④ チェックデジットを計算する

checkDigit = (10 - (total Mod 10)) Mod 10

合計値の10の余りを求め、それを利用してISBN-13のチェックデジットを計算しています。

最後に、

ISBN10to13変換 = base12 & CStr(checkDigit)

として、12桁の数字にチェックデジットを追加します。

これで13桁のISBN-13が完成します。


5.2つの関数を組み合わせて使用する

実際の処理では、まずISBN-10形式かどうかを確認し、ISBN-10形式だった場合だけISBN-13へ変換すると分かりやすくなります。

例えば次のように使用できます。

If ISBN10形式判定(asinVal) Then

    isbn13 = ISBN10to13変換(asinVal)

End If

このようにしておけば、ISBN-10形式ではないASINを誤ってISBN-13へ変換してしまうことを防げます。

まとめ

今回の処理では、次の流れでASINをISBN-13へ変換しています。

ASIN
 ↓
10桁か確認
 ↓
先頭9桁が数字か確認
 ↓
10桁目が数字またはXか確認
 ↓
ISBN-10形式と判定
 ↓
先頭9桁を取り出す
 ↓
「978」を追加
 ↓
ISBN-13のチェックデジットを計算
 ↓
13桁のISBN-13完成

特にポイントとなるのは、ISBN-10の最後のチェックデジットを変換に使用しないことです。

そのため、10桁目が数字の場合でも「X」の場合でも、同じ変換処理を利用できます。

Follow me!