IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Vérification clé de contrôle (somme de contrôle) [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Excel_man
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Par défaut Vérification clé de contrôle (somme de contrôle)
    Bonjour,
    J'ai besoin de manipuler des n° de palettes type SSCC (17 chiffres + 1 chiffre de contrôle) et pour être sur de la saisie, j'ai trouvé sur le net comment fonctionne la clé de contrôle:
    En partant de la gauche, le premier chiffre est multiplié par 3, le deuxième par 1, le troisième par 3 et ainsi de-suite. On additionne tout les résultats que l'on soustrait au même nombre arrondi a la dizaine supérieure.
    J'aimerais savoir si c'est possible de faire ce genre de contrôle sans passer par VBA.
    Sinon j'ai commencé à travailler un code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function Somme_OK(SSCC as long) as Boolean
    Dim i as Byte,j as Byte, somme_controle as Integer
    If LEN(SSCC)<>18 Then Exit Function
    For i=17 to 1 step -1
        If i MOD 2=0 then j=1 else j=3
        somme_controle = somme_controle + (Left(right(SSCC;i);1)*j
    Next i
    Somme_OK = Right(SSCC;1) = Arrondi.sup(somme_controle)-somme_controle
    'Je ne sais pas comment obtenir l'arrondi a la dizaine supérieur
    Je n'ai pas Excel sous a main donc le code a été tapé comme ça...désolé
    Merci pour autres solutions

  2. #2
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Dans l'exemple joint, tu trouveras 3 présentations :
    1) Décomposition avec des formules Excel. On effectue les différents calculs séparément puis on vérifie l'égalité avec le nombre alloué au contrôle.
    2) On regroupe les différents traitements dans une formule (lourd !).
    3) On effectue le traitement avec une fonction VBA.

    Cordialement.
    Fichiers attachés Fichiers attachés

  3. #3
    Membre confirmé Avatar de Excel_man
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Par défaut
    Citation Envoyé par enernaej Voir le message
    Bonjour,
    Pour arrondir à la dizaine supérieure de X il suffit d'appliquer la formule :
    ((X \ 10)+1)*10
    Bonjour,
    L'idée de diviser puis multiplier par 10 avec un +1 est bonne pour passer a la dizaine superieure mais sans faire un arrondi, on garde la décimale.
    Merci a toi

    Citation Envoyé par gFZT82 Voir le message
    Bonjour,
    Dans l'exemple joint, tu trouveras 3 présentations :
    1) Décomposition avec des formules Excel. On effectue les différents calculs séparément puis on vérifie l'égalité avec le nombre alloué au contrôle.
    2) On regroupe les différents traitements dans une formule (lourd !).
    3) On effectue le traitement avec une fonction VBA.
    Cordialement.
    Bonjour gFZT82,
    Merci pour cette démonstration. Mon idée était d’intégrer une formule dans le contrôle de format donc avec ton aide je peux soit synthétiser cette décomposition en une formule (très lourd) ou utiliser la macro fournie.

    Bonjour,
    J'ai donc gardé le code VBA que j'ai personnalisé pour contrôler la saisie du n° dans un userform (voir bouton <<Saisie du n°>>). J'avertie avec une icone que la saisie est conforme ou non. A l'aide du tuto suivant: Obliger une saisie numérique dans une TextBox , j'ai imposé la saisie au format désiré. Le seul hic , c'est que je n'arrive pas a empêcher le copié/collé non conforme: au moment du ctrl+V, la procédure [TextBox1_BeforeUpdate] ne se déclenche pas ???
    Encore merci de votre aide.
    Fichiers attachés Fichiers attachés

  4. #4
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Le copier-coller ne devrait pas présenter de problème, un contrôle de la saisie étant réalisé avec la fonction ChainePasOK.
    Cette fonction vérifie si la chaine est homogène et ne comprend que des chiffres. Pour cela, elle utilise la fonction Val.
    Mais .... Excel ne prend en compte que 15 chiffres significatifs. Le résultat est donc faussé car ton code comprend 18 chiffres.

    Exemple avec le code 123456789123456789 :
    CStr(Val(strpass))) retourne 1,23456789123457E+17 et Len(CStr(Val(strpass)))) est égal à 20 alors que strpass retourne 123456789123456789 et Len(strpass) est égal à 18.
    L’égalité entre les 2 termes n’est donc pas vérifiée.

    Une solution palliative consiste à séparer ton code en 2 parties de 9 chiffres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Function ChainePasOK(strpass As String) As Boolean
       If strpass = "" Then Exit Function
       If Len(strpass) = 1 And InStr("1234567890", strpass) = 0 Then ChainePasOK = True: Exit Function
       If Len(CStr(Val(Mid(strpass, 1, 9)))) + Len(CStr(Val(Mid(strpass, 10, 9)))) <> Len(strpass) Then ChainePasOK = True
    End Function
    Cordialement.

    EDIT : ci-joint un classeur avec un code partiellement modifié.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre confirmé Avatar de Excel_man
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Par défaut Developpez.com devient MadameIrma.com !
    Bonjour gFZT82,
    C'est plutôt remarquable d'avoir déjà la réponse de ma future question !
    En effet je n'en était pas là car je buttais sur l'utilisation de la procédure TextBox1_BeforeUpdate qui était utilisé dans le tuto: lors de mes débogage, la procédure ne se lançait même pas. Plutôt que de chercher a comprendre, j'ai inclus le contrôle ChainePasOK dans la procédure TextBox1_Change() que j'utilisai déjà pour la somme de contrôle. C'est la que j'ai pu voir qu'effectivement j'avais un message d'erreur même si la saisie était correct.
    Pas de panique puisque sur Developpez.com, on vous donne la solution avant même d'avoir le problème
    Merci encore a gFZT82
    EDIT: je viens de voir le fichier joint, et je vois que j'ai encore des progrès a faire, l'initialisation de l'usf et l'activation conditionnel du bouton, c'est bcp mieux! J'ai remis mon code dans la procédure TextBox1_Change() car le contrôle de somme avait disparut dans la manip.

  6. #6
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    J'ai remis mon code dans la procédure TextBox1_Change() car le contrôle de somme avait disparut dans la manip.
    Avant de remettre une portion de code que j'ai supprimée, assure toi que cette partie est bien utile. Pour cela, fais le test avec mon classeur exemple et dis-moi quelle est la fonctionnalité qui manque

    Cordialement.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Octobre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 46
    Par défaut
    Bonjour,

    Pour arrondir à la dizaine supérieure de X il suffit d'appliquer la formule :
    ((X \ 10)+1)*10

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/04/2015, 15h55
  2. svn: Sommes de contrôle de base différentes
    Par nauttilus dans le forum Subversion
    Réponses: 3
    Dernier message: 31/08/2011, 14h07
  3. Réponses: 1
    Dernier message: 16/03/2009, 20h33
  4. Contrôle: Liste de contrôles
    Par Amitom dans le forum Windows Forms
    Réponses: 3
    Dernier message: 22/01/2009, 14h45
  5. [contrôle onglet] atteindre contrôle
    Par stéphane_ais2 dans le forum Access
    Réponses: 2
    Dernier message: 09/01/2006, 11h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo