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 :

Algorithme calcul 1 2 4 8 16 32.. [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 130
    Par défaut Algorithme calcul 1 2 4 8 16 32..
    Bonjour,

    Je vais essayer d'être clair...
    Via une macro VBA Excel, je procède à un certain nombre de contrôles sur différentes zones dans un fichier saisi par un utilisateur.
    A chaque contrôle, j'affecte un code erreur ainsi numéroté :
    Contrôle 1 = Code 1
    Contrôle 2 = Code 2
    Contrôle 3 = Code 4
    Contrôle 4 = Code 8
    Contrôle 5 = Code 16
    Contrôle 6 = Code 32
    Contrôle 7 = Code 64...

    En as d'erreur, j'additionne les codes.
    Ainsi, si une zone ne passe pas les contrôles 1, 2, 4 et 5, cette zone sera affectée du code retour 27 (1+2+8+16).

    Jusque là je ne peux pas faire autrement.

    Voici donc mon problème :
    Si l'utilisateur souhaite voir la liste des lignes pointées en erreur sur le contrôle 5 par exemple, je procède ainsi :
    Si code retour in (16,17,18,19,20,21,22,23,24,25,26,27,28,29,30...) en listant tous les cas possibles.

    N'existe-t-il pas une méthode plus simple ?
    Méthode évolutive car la liste des contrôles sera amenée à être complétée.

    Merci pour votre aide

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut

    Il faut tester bit à bit, en Excel ou en VBA

    En excel avec BITET(VAL1; VAL2)

    Nom : 2021-10-13_153129.png
Affichages : 174
Taille : 56,4 Ko


    En VBA avec AND

    Nom : 2021-10-13_153255.png
Affichages : 173
Taille : 1,7 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 130
    Par défaut Cela me semble bien
    Bonjour Pierre,

    Merci pour la célérité de votre réponse.


    Cela me semble bien.
    Mais comment coder cela en VBA ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Ca dépend de la configuration du classeur, du tableau...

    Une copie d'écran et une explication de la conception du classeur seraient bienvenues
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 242
    Par défaut
    hello,
    tu peux aussi passer par une représentation binaire du code. Comme ceci par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub CheckCtl()
    Dim CodeErreur As String
    CodeErreur = WorksheetFunction.Dec2Bin(27, 8)
    Debug.Print CodeErreur
    For x = 1 To 8
    If Mid(CodeErreur, x, 1) = 1 Then Debug.Print "erreur pour Ctrl" + CStr(9 - x)
    Next
    Résultat :
    00011011
    erreur pour Ctrl5
    erreur pour Ctrl4
    erreur pour Ctrl2
    erreur pour Ctrl1
    Ami calmant, J.P

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 130
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Ca dépend de la configuration du classeur, du tableau...

    Une copie d'écran et une explication de la conception du classeur seraient bienvenues
    J'ai plusieurs colonnes dont voici les principales
    Col A : Nom du responsable
    Col B : Date de début
    Col C : Date de fin

    Un bouton général pour lancer les contrôles globaux.
    A la fin des contrôles, un code erreur général est affiché pour chaque ligne en colonne 14.
    L'utilisateur dispose ensuite de x boutons pour afficher uniquement les lignes ne répondant pas à un contrôle particulier.

    Voici par exemple le code du bouton qui retourne la valeur 4 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    Application.ScreenUpdating = False
     
     
    For L = Nb_Lig To PremièreL Step -1
        Rows(L).Select
        Selection.EntireRow.Hidden = False
     
        Test_Err = 0
     
     
        If Sheets("Cal").Cells(L, 14) = 4 Then Test_Err = 1
        If Sheets("Cal").Cells(L, 14) = 5 Then Test_Err = 1
        If Sheets("Cal").Cells(L, 14) = 6 Then Test_Err = 1
        If Sheets("Cal").Cells(L, 14) = 7 Then Test_Err = 1
        If Sheets("Cal").Cells(L, 14) = 12 Then Test_Err = 1
        If Sheets("Cal").Cells(L, 14) = 13 Then Test_Err = 1
        If Sheets("Cal").Cells(L, 14) = 14 Then Test_Err = 1
        If Sheets("Cal").Cells(L, 14) = 15 Then Test_Err = 1
        If Sheets("Cal").Cells(L, 14) = 20 Then Test_Err = 1
        If Sheets("Cal").Cells(L, 14) = 21 Then Test_Err = 1
        If Sheets("Cal").Cells(L, 14) = 22 Then Test_Err = 1
        If Sheets("Cal").Cells(L, 14) = 23 Then Test_Err = 1
        If Sheets("Cal").Cells(L, 14) = 28 Then Test_Err = 1
        If Sheets("Cal").Cells(L, 14) = 29 Then Test_Err = 1
        If Sheets("Cal").Cells(L, 14) = 30 Then Test_Err = 1
        If Sheets("Cal").Cells(L, 14) = 31 Then Test_Err = 1
     
     
        If Test_Err = 0 Then
            Rows(L).Select
            Selection.EntireRow.Hidden = True
        End If
    Next L

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Désolé, je n'ai pas compris.

    En VBA, tu peux tester un code total par rapport à un code d'erreur particulier, puisque chaque bit correspond à un code.

    Pour tester un contrôle particulier, tu prends sa valeur (1, 2, 4, 8, ...) et tu la compares au total avec un AND... Si la valeur renvoie le contrôle particulier, c'est que son bit est à 1 dans le total, donc que le contrôle est validé.

    Nom : 2021-10-13_173251.png
Affichages : 153
Taille : 58,0 Ko




    Citation Envoyé par jurassic pork Voir le message
    [...]
    tu peux aussi passer par une représentation binaire du code. Comme ceci par exemple:[...]
    Oui, mais on ne peut pas avoir plus de 9 codes d'erreur, si on utilise DECBIN, qui utilise 9 bits pour les nombres positifs et 10 pour les négatifs, j'en parle dans ce billet
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 242
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Oui, mais on ne peut pas avoir plus de 9 codes d'erreur, si on utilise DECBIN, qui utilise 9 bits pour les nombres positifs et 10 pour les négatifs, j'en parle dans ce billet
    il y a une fonction qui permet de faire sauter cette limitation c'est la fonction Base
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim CodeErreur As String
    CodeErreur = WorksheetFunction.Base(27, 2, 8)
    Debug.Print CodeErreur
    CodeErreur = WorksheetFunction.Base(27 + 65536, 2, 20)
    Debug.Print CodeErreur
    Résultat :
    00011011
    00010000000000011011

    Ami calmant, J.P

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Tu peux aussi tester que x contrôles posent problème, toujours en jouant sur les bits

    Nom : 2021-10-13_180323.png
Affichages : 164
Taille : 12,0 Ko


    Citation Envoyé par Sites Voir le message
    [...]
    Col A : Nom du responsable
    Col B : Date de début
    Col C : Date de fin[...]
    Ce qui serait intéressant, c'est d'avoir les colonnes qui contiennent les contrôles. il n'est pas intéressant d'avoir ton code. On va te le réécrire en fonction de la configuration de tes données, d'où la demande d'une copie d'écran, éventuellement dépersonnalisée...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Et en plus, je l'ai déjà utilisée... Honte sur moi...


    Cela dit, dans le cas présent, je préfère le traitement avec AND, mais je retiens l'idée qui, du coup, rend ma traduction DEC-BIN par formule caduque, puisque BASE est là.

    Je vais corriger mon billet en ce sens, et je te remercie pour cette info (comme quoi, la bidouille, ça aide )
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    HS, mais bon...

    BASE n'accepte pas les nombres négatifs... Du coup, on peut utiliser ceci:

    Nom : 2021-10-13_212233.png
Affichages : 136
Taille : 3,2 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 130
    Par défaut
    Merci à tous.
    Finalement, j'ai utilisé le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If Mid(WorksheetFunction.Base(Sheets("Cal").Cells(Ligne, 14), 2, 8), 8, 1) = "1" Then 
    Traitement_Erreur
    End if
    en faisant varier la valeur du positionnement du bit à tester.
    Et cela fonctionne parfaitement bien.

    Encore merci

  13. #13
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Bonsoir,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Enum Bites
        B1 = 1
        B2 = 2
        B3 = 4
        B4 = 8
        B5 = 16
        B6 = 32
        B7 = 64
        B8 = 128
    End Enum
    Sub test()
    BX = WorksheetFunction.Dec2Bin(B1 + B5 + B8)
    Debug.Print BX = WorksheetFunction.Dec2Bin(B1 + B5 + B8), WorksheetFunction.Bin2Dec(BX) = B1 + B5 + B8
    Debug.Print (WorksheetFunction.Bin2Dec(BX) And B1 + B8) = B1 + B8
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub test2()
    Contrôle1 = Abs(Condition1 = True)
    Contrôle2 = Abs(Condition2 = False)
    Contrôle3 = Abs(Condition3 = True)
    Contrôle4 = Abs(Condition4 = True)
    Contrôle5 = Abs(Condition5 = True)
    Contrôle6 = Abs(Condition6 = True)
    Contrôle7 = Abs(Condition7 = True)
    BX = Contrôle7 & Contrôle6 & Contrôle5 & Contrôle5 & Contrôle3 & Contrôle2 & Contrôle1
    Debug.Print (WorksheetFunction.Bin2Dec(BX) And B2) = B2
     End Sub

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

Discussions similaires

  1. [Python 3.X] [Pandas] Algorithme calcul à partir de points
    Par Gr1nch3 dans le forum Calcul scientifique
    Réponses: 2
    Dernier message: 07/08/2016, 19h11
  2. [Débutant] Algorithme calcul config
    Par foxnono06 dans le forum C#
    Réponses: 2
    Dernier message: 19/05/2013, 15h17
  3. Algorithme calcul date paiement à partir conditions de paiement
    Par Cereal123 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 22/05/2010, 16h19
  4. Réponses: 7
    Dernier message: 28/03/2008, 10h29
  5. Recherche : Algorithme Calcul Semaine Fiscal - Calendrier
    Par Arvulis dans le forum Mathématiques
    Réponses: 1
    Dernier message: 26/06/2007, 11h31

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