Fonction like nombre de carractères code VBA
Bonjour
J'ai un code VBA qui fonctionne mais voilà ma source de donnée a changée et je me retrouve avec des groupes supplémentaires GP# dans le code et GP1, GP2 etc dans mon fichier excel . Mon problème est le suivant au delà de GP9 le code ne fonctionne plus car deux caractères après le GP je suppose .
Pouvez vous m'aider Merci
Function HD(com As Range)
Dim cc%, gp%
Application.Volatile
With com
Select Case .Cells(1, 11)
Case "pair": cc = 1000
Case "impair": cc = 2000
Case Else: HD = CVErr(xlErrNA): Exit Function
End Select
Select Case .Cells(1, 12)
Case "lundi": cc = cc + 100
Case "mardi": cc = cc + 200
Case "mercredi": cc = cc + 300
Case "jeudi": cc = cc + 400
Case "vendredi": cc = cc + 500
Case Else: HD = CVErr(xlErrNA): Exit Function
End Select
Select Case .Cells(1, 18)
Case Is > 50: cc = cc + 10
Case Is > 10: cc = cc + 20
Case Is > 0: cc = cc + 30
Case Else: HD = CVErr(xlErrNA): Exit Function
End Select
If .Cells(1, 3) Like "GP#" Then gp = CInt(Right(.Cells(1, 3), 1))
If gp > 0 And gp < 16 Then
cc = cc + gp
Else
HD = CVErr(xlErrNA): Exit Function
End If
End With
HD = cc
End FunctionBonsoir,
en effet dans cette ligne :
If .Cells(1, 3) Like "GP#" Then gp = CInt(Right(.Cells(1, 3), 1))
la variable gp est égale à la valeur de la cellule A3 en y prenant 1 caractère à partir de la droite, ce qui fonctionne pour les valeur allant de GP0 à GP9 !
Pour y remédier il faut prendre les caractères allant de celui qui se trouve après le "GP" jusqu'à la fin de la longueur de la valeur :
If .Cells(1, 3) Like "GP" Then gp = CInt(Mid(.Cells(1, 3), 3, Len((.Cells(1, 3)))
En somme on extrait la partie de la valeur de la cellule qui se trouve à partir du 3ième caractère et jusqu'au dernier dont la valeur est égal au nombre de caractère de la valeur. Du coup que vous ayez des GP103 ou GP12035, la partie chiffre sera extraite.
@ bientôt
LouReeD
Bonsoir
merci de ce retour, j'ai copié votre code mais j'ai un message d'erreur de compilation
Bonjour, Salut LouReed !
Remplace :
If .Cells(1, 12) Like "GP#" Then gp = CInt(Right(.Cells(1, 12), 1))par :
If IsNumeric(Right(.Cells(1, 12), 1)) Then gp = CInt(Replace(.Cells(1, 12), "GP", ""))Cordialement.
Bonsoir MFerrand
Tu ma résolu un problème il y a quelques semaines
J'ai copié ton code, sur mon fichier Excel (colonne U) la recherche dans les tables pour les groupes gp1 à gp9 pas de problèmes par contre de gp10 à gp15 soit la recherche v retourne une valeur vrai mais erroné ne tient pas compte de l'heure dans la table (feuille règle col U) ou #N/A. Je remarque également pour ces groupes surtout le groupe GP15 lorsque la recherche v renvoi un #N/A si je change la quantité (colonne R) > 10 plus de #N/A .
Merci de ton aide
Ci-joint mon fichier Excel
Bonjour,
J'ai en effet identifié dans ton sujet un code que j'avais produit...
Tu as la réponse dans mon post du 01/06 à 06h53.
Cordialement.
Bonjour
J'ai testé ton code hier soir ça fonctionne pour gp1 a gp9 ensuite ça bug pour les gp avec deux caractères j'ai joint un fichier pour exemple .
Merci de ton aide
Si tu testes sans avoir adapté le reste... !
Function HD(com As Range)
Dim cc%, gp%
Application.Volatile
With com
Select Case .Cells(1, 11)
Case "pair": cc = 10000
Case "impair": cc = 20000
Case Else: HD = CVErr(xlErrNA): Exit Function
End Select
Select Case .Cells(1, 12)
Case "lundi": cc = cc + 1000
Case "mardi": cc = cc + 2000
Case "mercredi": cc = cc + 3000
Case "jeudi": cc = cc + 4000
Case "vendredi": cc = cc + 5000
Case Else: HD = CVErr(xlErrNA): Exit Function
End Select
Select Case .Cells(1, 18)
Case Is > 50: cc = cc + 100
Case Is > 10: cc = cc + 200
Case Is > 0: cc = cc + 300
Case Else: HD = CVErr(xlErrNA): Exit Function
End Select
If IsNumeric(Right(.Cells(1, 12), 1)) Then gp = CInt(Replace(.Cells(1, 12), "GP", ""))
If gp > 0 And gp < 16 Then
cc = cc + gp
Else
HD = CVErr(xlErrNA): Exit Function
End If
End With
HD = cc
End FunctionIl te faut aussi rétablir le tableau de recherches (qui va s'allonger de façon conséquente) avec des valeurs à 5 chiffres : 450 valeurs susceptibles d'être renvoyées...
Bon courage. Cordialement.
Bonsoir
J'ai testé ton nouveau code avec ma nouvelle table c'est parfait ça fonctionne uniquement sur les GP avec deux caractères après, je n'ai que des # N/A sur les GP avec un seul caractère , je contourne le problème avec des groupes à deux caractères GP1 devient GP10, GP2 devient GP11 etc cela m'arrange de 10 possibilité je passe à 90.
Peux tu m'expliquer la logique sur le zéro ajouté sur ton nouveau code, ancien code "Case "pair": cc = 1000" tu passe sur un Case "pair": cc = 10000 donc un zéro en plus .
je me dis, pair ou impair je reste sur un chiffre donc un , les jours la semaine de 1 a 5 donc tjrs un chiffre, les qtés trois possibilités donc tjrs sur un chiffre par contre les GP possibilité de 1 à 15 donc la je suis sur un nombre à deux chiffres si je fais l'addition de tout ça j'arrive sur 5 donc les 5 caractères de 10000 désolé
Merci
Cordialement
Bonjour,
Tu as toi-même adaptée la fonction d'origine à tes besoins. La fonction renvoyait un code de type abcd (4 chiffres). Dans ton adaptation, a peut prendre les valeurs 1 ou 2, comme auparavant, mais le critère est différent, b peut prendre les valeurs 1 à 5, c'était 1 à 4, et les critères sont également différents, c prend les valeurs 1 à 3, comme auparavant, sur les mêmes critères. Quant à d, il prenait les valeurs 1 à 5 et doit prendre maintenant les valeurs 1 à 15 (le critère n'ayant pas changé...).
Pour intégrer cette variation, le code renvoyé doit passer à 5 chiffres : abcdd. La fonction procède additivement:
a pouvant être 1 ou 2, on initialise le code avec 10000 ou 20000
selon la valeur de b (1 à 5), on ajoutera 1000, 2000, 3000, 4000 ou 5000
selon la valeur de c (1 à 3), on ajoutera ensuite 100, 200 ou 300
reste dd, qui va prendre une valeur de 1 à 15, qu'on ajoute.
Selon cette dernière valeur, tu pourras avoir un code où a, b et c valant 1, qui pourra varier de 11101 à 11115.
ça fonctionne uniquement sur les GP avec deux caractères après
Comme tu le vois cela doit fonctionner avec GP1 à GP15 sans problème particulier...
Cordialement.
Bonsoir
Grand Merci pour tes explications et ta patience , je pense m'en sortir avec tous ces éléments maintenant et les comprendre surtout .
Cordialement
Pour faire ta première adaptation, il a bien fallu que tu comprennes !
Bonne continuation.