These 2 similarly pieces of code are begging for refinement, but these work for the time being. Both of them test a character's ability scores to return a boolean result. They are a bit more intensive due to the use of select case statements over strings, which I hope to swap for enums eventually.

The first, IsValidClass, tests to see if a character's ability scores are high enough to gain the bonuses of their class. I use it so I can know when a character loses their class bonuses while in negative hit points. It takes a string class along with six values Str, Ing, Wis, Con, Dex, Cha representing a character's attributes (note: I deliberately labelled intelligence "Ing" as "int" is a common programming shorthand for "integer", which causes problems), plus a string delimiter delim used for multi-classed characters.

Public Function IsValidClass(class As String, Str As Integer, Ing As Integer, Wis As Integer, Con As Integer, Dex As Integer, Cha As Integer, delim As String) As Boolean
 
    Dim match As Boolean
 
    Dim classes() As String
    classes = Split(class, delim)
 
    ' for performance reasons
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
 
    ' check if character has one class or more
    If UBound(classes) = 0 Then
        Select Case classes(0)
            Case "Cleric"
                match = Wis >= 9
            Case "Druid"
                match = Wis >= 12 And Cha >= 15
            Case "Fighter"
                match = Str >= 9 And Con >= 7
            Case "Paladin"
                match = Str >= 11 And Ing >= 9 And Wis >= 13 And Con >= 9 And Cha >= 17
            Case "Ranger"
                match = Str >= 13 And Ing >= 13 And Wis >= 14 And Con >= 14
            Case "Mage"
                match = Ing >= 9 And Dex >= 6
            Case "Illusionist"
                match = Ing >= 15 And Dex >= 16
            Case "Thief"
                match = Dex >= 9
            Case "Assassin"
                match = Str >= 12 And Ing >= 11 And Dex >= 12
            Case "Monk"
                match = Str >= 15 And Wis >= 15 And Dex >= 15 And Con >= 11
            Case "Monster"
                match = True
            Case Else
                match = False
        End Select
    Else
        match = True
        For Each c In classes
            Select Case c
            Case "Cleric"
                match = match And Wis >= 13
            Case "Druid"
                match = match And Wis >= 13 And Cha >= 15
            Case "Fighter"
                match = match And Str >= 13 And Con >= 7
            Case "Paladin"
                match = match And Str >= 15 And Ing >= 9 And Wis >= 15 And Con >= 9 And Cha >= 17
            Case "Ranger"
                match = match And Str >= 15 And Ing >= 15 And Wis >= 15 And Con >= 14
            Case "Mage"
                match = match And Ing >= 16 And Dex >= 6
            Case "Illusionist"
                match = match And Ing >= 16 And Dex >= 16
            Case "Thief"
                match = match And Dex >= 13
            Case "Assassin"
                match = match And Str >= 15 And Ing >= 11 And Dex >= 15
            Case "Monk"
                match = match And Str >= 16 And Wis >= 16 And Dex >= 16 And Con >= 16
            Case Else
                match = False
            End Select
        Next
 
    End If
 
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    IsValidClass = match
 
End Function

The second, HasClassBonus, tests if a character's ability scores are high enough to receive a 10% bonus to experience. This too works with multi-classed characters and accepts an identical list of parameters to IsValidClass.

Public Function HasClassBonus(class As String, Str As Integer, Ing As Integer, Wis As Integer, Con As Integer, Dex As Integer, Cha As Integer, delim As String) As Boolean
 
    Dim bonus As Boolean
 
    Dim classes() As String
    classes = Split(class, delim)
 
    bonus = True
    For Each c In classes
        Select Case c
            Case "Cleric"
                bonus = bonus And Wis >= 16
            Case "Druid"
                bonus = bonus And Wis >= 16 And Cha >= 16
            Case "Fighter"
                bonus = bonus And Str >= 16
            Case "Paladin"
                bonus = bonus And Str >= 16 And Wis >= 16 And Cha >= 17
            Case "Ranger"
                bonus = bonus And Str >= 16 And Ing >= 16 And Wis >= 16
            Case "Mage"
                bonus = bonus And Ing >= 16
            Case "Thief"
                bonus = bonus And Dex >= 16
            Case Else
                bonus = False
        End Select
 
    Next
 
    HasClassBonus = bonus
 
End Function