webForumDet fria alternativet

Excel: Datavalidering

4 svar · 401 visningar · startad av Marcus E

Marcus EMedlem sedan maj 20021 294 inlägg
#1

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
#2

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
#3

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
#4

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
#5

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. :)

Genererad på 392 ms · cache AV · v20260730165559-full.f96bc7eb