ارنی یک کاربرگ دارد که در ستون A، یک سری اعداد ISBN را شامل می شود. برخی از این اعداد 10 رقمی و برخی 13 رقمی هستند. برخی دارای خط تیره در مکان های مختلف هستند و برخی فاقد خط تیره هستند. ارنی می داند که آخرین رقم شابک یک رقم چک بر اساس فرمول خاصی است. او به راهی برای محاسبه صحیح بودن یا نبودن رقم آخر نیاز دارد، اما نمی داند که این کار با فرمول کاربرگ یا ماکرو بهتر است انجام شود.
با توجه به داده هایی که ارنی با آنها کار می کند و فرمول های متفاوتی که در محاسبه اعداد بررسی ISBN استفاده می شود، بهتر است از یک تابع تعریف شده توسط کاربر برای محاسبه معتبر بودن یا نبودن رقم چک استفاده شود. زیر یک ماکرو همه منظوره خوب است که می تواند این کار را انجام دهد:
Function CheckISBN(rng As Range) As Boolean
Dim sTemp As String
Dim sDigits As String
Dim J As Integer
Dim K As Integer
Dim bXFlag As Boolean
Dim iTtl As Integer
Dim iMult As Integer
Dim iChk As Integer
Dim sChk As String
sTemp = rng.Text
Check to see if rightmost character is X
This comes into play only for 10-digit ISBNs
bXFlag = False
If Right(sTemp, 1) = "X" Then bXFlag = True
Strip everything except digits
sDigits = ""
For J = 1 To Len(sTemp)
If Asc(Mid(sTemp, J, 1)) > 47 And _
Asc(Mid(sTemp, J, 1)) < 58 Then
sDigits = sDigits & Mid(sTemp, J, 1)
End If
Next J
Add back in the X, if necessary
If bXFlag Then sDigits = sDigits & "X"
Select Case Len(sDigits)
Case 10 10-digit ISBN
K = 0
For J = 1 To Len(sDigits) - 1
K = K + (Val(Mid(sDigits, J, 1)) * (11 - J))
Next
sChk = Trim(Str(11 - (K Mod 11)))
If sChk = "10" Then sChk = "X"
CheckISBN = True
If sChk Right(sDigits, 1) Then CheckISBN = False
Case 13 13-digit ISBN
K = 0
iMult = 1
For J = 1 To Len(sDigits) - 1
K = K + (iMult * Val(Mid(sDigits, J, 1)))
iMult = 4 - iMult
Next J
iChk = K Mod 10
If iChk > 0 Then iChk = 10 - iChk
sChk = Trim(Str(iChk))
CheckISBN = True
If sChk <> Right(sDigits, 1) Then CheckISBN = False
Case Else
ISBN isnt either 10 or 13 digits
CheckISBN = False
End Select
End Function
این تابع اعداد ISBN 10 یا 13 رقمی را کنترل می کند و مهم نیست که چه متن دیگری در سلول قبل از ISBN داشته باشید یا اینکه بین ارقام ISBN خط تیره، فاصله یا نقطه وجود داشته باشد. این کد هر کاراکتر غیر عددی را حذف می کند، به استثنای "X" انتهایی، که ممکن است در مورد یک ISBN 10 رقمی مهم باشد.
برای استفاده از تابع، تنها کاری که باید انجام دهید این است که به عنوان پارامتر، از یک مرجع سلولی که حاوی مقدار ISBN است استفاده کنید:
=CheckISBN(A1)
بسته به اینکه آخرین رقم ISBN در سلول A1 درست باشد یا خیر، تابع درست یا نادرست برمی گردد. (آخرین رقمی است که رقم بررسی یک ISBN را تشکیل می دهد.) چون True یا False را برمی گرداند، این تابع می تواند در قوانین قالب بندی شرطی یا در فرمول های پیچیده تر طراحی شما استفاده شود.
اگر می خواهید درباره فرآیند محاسبه واقعی یک رقم چک شابک بیشتر بدانید، باید بدانید که شابک ها می توانند 10 رقمی (برای شابک های تخصیص یافته در سال 2006 و سال های قبل) یا 13 رقمی (برای شابک هایی که پس از 1 ژانویه اختصاص داده شده اند) باشد. ، 2007). به علاوه، هر طرح از یک روش محاسبه متفاوت برای تعیین رقم چک استفاده می کند. دو صفحه وب زیر می توانند به شما در درک روش های محاسبه کمک کنند:
https://isbn-information.com/the-10-digit-isbn.html
https://isbn-information.com/check-digit-for-the-13-digit-isbn.html