2016-04-18 2 views
0

J'essaie de tester la valeur d'une zone de texte par rapport à plusieurs conditions dans VBA et je ne suis pas sûr de la meilleure façon de procéder.VBA Vérification d'une valeur de zone de texte contre plusieurs conditions

L'utilisateur est censé entrer un ID de produit et cet ID peut être dans l'un des 5 formats et certaines longueurs en fonction de ce format. Quatre des 5 sont alphanumériques (10) et le cinquième est numérique seulement (13). Pour trois d'entre eux (type A), je l'ai vérifié pour les premiers caractères de la chaîne pour voir si ils correspondent comme quoi que ce soit après que les deux premiers sont jeu équitable. Pour le type B (numérique seulement), j'ai un ensemble de numéros de série pour celui-là et j'essaye de forcer la longueur de 13 chiffres. Pour le type C, il peut commencer par LMN ou LMNZZ et le reste des caractères doivent être des chiffres.

Voici ce que j'ai jusqu'à présent ...

Dim ALen, Blen, Clen as Integer 
Dim val_UpperLimit,val_LowerLimit as Double 

val_UpperLimit = 9999999999999# 
val_LowerLimit = 100000000000# (Only 12 digits b/C# can start with 0) 
ALen = "10" 
BLen = "13" 
CLen = "14" 

'Check for Product Type B (Should be numeric value only. 13 digits long) 
If IsNumeric(txtProduct.Value) _ 
    And txtProduct.Value < val_UpperLimit _ 
    And txtProduct.Value > val_LowerLimit _ 
    And Len(txtProduct.Value) = BLen _ 

    'Check for Product Type A (Product will start with A0, D0 or YY and be 10 characters long) 
    Or txtProduct.Value Like "A0*" _ 
     And Len(txtProduct.Value) = ALen _ 
    Or txtProduct.Value Like "D0*" _ 
     And Len(txtProduct.Value) = ALen _ 
    Or txtProduct.Value Like "YY*" _ 
     And Len(txtProduct.Value) = ALen _ 

    'Check for Product Type C (Product will start with LMN# or LMNZZ# and be a total of 14 characters/digits) 
    Or txtProduct.Value Like "LMN*" _ 
    Or txtProduct.Value Like "LMNZZ*" _ 
     And Len(txtProduct.Value) = CLen _ 
Then 
    txtProduct.Value = UCase(txtProduct.Value) 
Else 
    MsgBox "Please enter a valid Product ID", vbOKOnly 
    txtProduct.SetFocus 
    Exit Sub 
End If 

Toute aide est grandement appréciée!

Répondre

0

Je serais probablement utiliser une fonction comme suit:

... 

    If ProductIDIsValid(txtProduct.Value) Then 
     txtProduct.Value = UCase(txtProduct.Value) 
    Else 
     MsgBox "Please enter a valid Product ID", vbOKOnly 
     txtProduct.SetFocus 
     Exit Sub 
    End If 

... 

Public Function ProductIDIsValid(ByVal ProductID As String) As Boolean 

    If Len(ProductID) = 10 And (Left(ProductID, 2) = "A0" Or Left(ProductID, 2) = "D0" Or Left(ProductID, 2) = "YY") Then 'Type A 
     ProductIDIsValid = True 
    ElseIf Len(ProductID) = 13 And Not ProductID Like "*[!0-9]*" Then 'Type B 
     If CDbl(ProductID) >= 100000000000# Then ProductIDIsValid = True 
    ElseIf Len(ProductID) = 14 And Left(ProductID, 3) = "LMN" Then 'Type C 
     ProductIDIsValid = True 
    Else 'No match 
     ProductIDIsValid = False 
    End If 

End Function 

Vous pouvez stocker cette fonction dans un module quelque part et l'appeler comme je l'ai fait dans le code.

+0

Merci Chris. Cela fonctionne magnifiquement! –