Marcus EMedlem sedan maj 20021 294 inlägg
Hej!
Jag har en lista på böcker i Excel med en kolumn där man ska skriva in ISBN-nummer. Kan man på något sätt kontrollera så att de nummer som skrivs in är korrekta?
Jag tänkte att man kunde använda custom data validation (Data->Validation, Allow: Custom). Frågan är vad jag ska skriva som formel. Kan jag anropa en VBA-funktion som kontrollerar att den senast ändrade cellen är ett korrekt ISBN-nummer?
Tack på förhand.
DanvikMedlem sedan sep. 200221 inlägg
Ifall du går till föjande webbplats: http://www.xldennis.com/ och skriver ISBN i den avancerade sökfunktionen hittar du något som kanske kan vara dig till hjälp.
Lycka till!
Marcus EMedlem sedan maj 20021 294 inlägg
Tack för svaret.
Det jag var ute efter var att kontrollera om numrena är korrekta och inte att de visas på ett korrekt sätt. Den sista siffran i ISBN-numret är kontrollsiffra och det är den som ska kontrolleras. Jag har redan skrivit en VBA-funktion. Frågan är hur jag kopplar den till datavalidering.
clarkbonesMedlem sedan feb. 20012 693 inlägg
Du har ju Workbook_SheetChange event som möjliggör att du kan köra din funktion så fort ett visst område av celler ändras...
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
if activecell.col=1 then ' Här antar vi att man matar in ISBN i Kolumn A
ValidationFunction ' Din funktion (Använd activecell's funktioner för att läsa av vilken cell man arbetar med)
End if
End Sub
Marcus EMedlem sedan maj 20021 294 inlägg
Tack, jag kunde lösa det med hjälp av SheetChange. Fast ActiveCell var inte cellen som ändrats utan Target.
Så här blev min kod:
Function ValidISBN(isbn As String) As Boolean
Dim i As Long, add As Long, sum As Long
Dim no As Long, summod As Long
For i = 1 To Len(isbn) - 1
Dim ch As Byte
ch = Asc(Mid(isbn, i, 1))
If ch >= Asc("0") And ch <= Asc("9") Then
add = Chr(ch) * (10 - no)
sum = sum + add
no = no + 1
ElseIf ch <> Asc("-") Then
ValidISBN = False
Exit Function
End If
Next i
Dim check1 As Byte, check2 As Byte
summod = Int(sum / 11)
If summod * 11 <> sum Then summod = summod + 1
summod = summod * 11
summod = summod - sum
If summod = 10 Then
check1 = Asc("X")
Else
check1 = Asc(summod)
End If
check2 = Asc(Mid(isbn, Len(isbn), 1))
If check1 = check2 Then
ValidISBN = True
Else
ValidISBN = False
End If
End Function
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 4 Then
If Target.Text <> "" Then
If Not ValidISBN(Target.Text) Then
MsgBox Target.Text & " är inte ett giltigt ISBN-nummer"
End If
End If
End If
End Sub
Den är kanske inte så snygg, men den fungerar. :)