VBAでASINがISBN-10形式か判定し、ISBN-13へ変換する方法
Amazonの商品コードである「ASIN」には、書籍の場合、ISBN-10と同じ形式の10桁のコードが設定されていることがあります。
この記事では、VBAを使って、
- ASINがISBN-10形式かどうかを判定する
- 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 Function4.変換処理のポイント
① 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」の場合でも、同じ変換処理を利用できます。


