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 Function

Bonsoir,

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

18larry.xlsm (73.03 Ko)

Bonjour,

J'ai en effet identifié dans ton sujet un code que j'avais produit... Le problème étant la prise en compte de GP suivi d'un numéro à 2 chiffres, j'ai donc modifié la ligne concernée pour que l'on prenne en considération des numéros à 2 chiffres...

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... ! La fonction définit un code de recherche numérique, lequel était à 4 chiffres mais étant donné que le dernier chiffre passe à 2 chiffres, il te faut décaler les autres !

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 Function

Il 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é je veux comprendre.

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 ! Il n'y a pas de raison que cela cesse subitement. Tu augmentes le nombre de codes qui peuvent être produits, il te faut établir la table correspondante...

Bonne continuation.

Rechercher des sujets similaires à "fonction like nombre carracteres code vba"