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

Conception Discussion :

revue d'habilitations incompatibles [XL-2010]


Sujet :

Conception

  1. #1
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut revue d'habilitations incompatibles
    Bonjour,

    Je cherche a vérifier qu'aucun n'employé n'a d'habilitions qui sont incompatibles.
    Je dispose d'un tableau avec une colonne "id de l'employé" et une autre "habilitation", un employé peut avoir plusieurs habilitations, il aura donc plusieurs lignes dans le tableau, une par habilitation
    Je dispose aussi d'un tableau a double entrée d'incompatibilité des habilitations
    cf image

    Malheureusement je ne peux pas utiliser Powerquery, mais je peux faire du VBA
    Ce ne sera pas moi l'utilisateur final, l'idéal serait d'avoir un traitement simple ou la personne a juste a remplacer les données du tableau d'habilitation et puisse facilement récupérer la liste des gens en anomalie et dans l'idéal de quel anomalie il s'agit


    Pour l'instant je m'oriente vers la solution suivante:
    -Rajout d'une colonne par habilitation TOP-nom de l'habilitation
    -Je fais un TCD où je met en ligne les ID et en colonnes chaque top, je me retrouve une ligne par employé et en colonnes 0 ou 1 sur chaque habilitation
    -Je fais une MFC par contradiction

    Mon soucis:
    - les MFC sont longues a faire, chiant a modifier en cas de changement, y a t'il un moyen d'exploiter directement le tableau ?
    - impossible de trier le tableau obtenu par couleur, certes tout les soucis sont visibles mais il faut se taper tout le tableau pour les voir, j'aurais aimé trouvé une solution par filtre


    Si qqn voit une meilleur solution, je suis preneur de toute idée qui pourrait m'aider a avancer

    Nom : hab.jpg
Affichages : 100
Taille : 52,9 Ko
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  2. #2
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 949
    Points
    55 949
    Billets dans le blog
    131
    Par défaut
    Salut.

    En 2010 et sans Power Query, je ne vois pas grand-chose d'autre que du VBA...

    Nom : 2022-03-16_204431.png
Affichages : 93
Taille : 9,9 Ko

    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
    Function EstCompatible(ID, Employes As Range, Compatibilites As Range) As Boolean
      Dim i As Long: i = 1
      Dim j As Long: j = 1
      Dim habLigne As Range, HabColonne As Range
     
      Set habLigne = Compatibilites.Offset(-1).Resize(1)
      Set HabColonne = Compatibilites.Resize(, 1)
      EstCompatible = True
      Do While i <= Employes.Rows.Count And EstCompatible
        If Employes(i, 1).Value = ID Then
          Do While j <= Employes.Rows.Count And EstCompatible
            If Employes(j, 1).Value = ID Then
            EstCompatible = Not Application.Index(Compatibilites, _
              Application.Match(Employes(i, 2).Value, HabColonne, 0), _
              Application.Match(Employes(j, 2).Value, habLigne, 0)) = "NOK"
            End If
            j = j + 1
          Loop
        End If
        i = i + 1
        j = 1
      Loop
    End Function
    "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
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut
    Merci, @Pierre Fauconnier pour cette proposition
    Je cherchais des idées, je ne m'attendais pas a ce qu'on me propose directement une solution c'est top.

    Par contre j'ai un soucis quand j'essaye d'utiliser la fonction, elle renvoie #valeur
    Voici ce que j'utilise: =EstCompatible( [@[ LOGIN AD DE L''AGENT]]; T_agent[[#Tout];[ LOGIN AD DE L''AGENT]:[PROFIL APPLICATIF]];T_hab[#Tout])Où "LOGIN AD DE L''AGENT" c'est l'id , "PROFIL APPLICATIF" la colonne avec les habilitations, les deux sont dans le tableau "T_agent" avec une colonne supplémentaire pour la formule; T_hab c'est le tableau avec les OK / NOK

    edit: si je ne prends pas la ligne d'entête du tableau d'habilitation je n'ai plus #valeur mais ça renvoie VRAI partout ce qui n'est pas bon non plus
    en fait je ne comprends pas cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set habLigne = Compatibilites.Offset(-1).Resize(1)
    avec le offset -1 il me prends une ligne au dessus tableau, ce qui me parait pas logique
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut
    Ok c'est bon il fallait bien enlever les entêtes ou le offset(-1) c'est pareil, j'avais des vrai partout car je n'ai aucune paire d'incompatibilité dans mon fichier
    Merci encore @Pierre Fauconnier

    Je vais essayer d'adapter la macro pour le problème suivant celui des incompatibilité de 3 habilitations et non plus deux
    J'ai déjà ma petite idée, je vais remplacer remplacer les OK / NOK par 0 et 1 et mettre 0.5 sur les habilitations qui ne vont pas par 3, comme ça si la somme fait 1 ou plus c'est pas bon
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut
    Comme promis ci-dessous les modifs apportées a la macro pour le cas concret

    Certaines habilitations étant incompatibles par 3, j'ai changé les OK/NOK par des valeurs numériques, 1 si incompatibles à deux, 0.5 si incompatibles par 3 de cette manière si la somme des incompatibilité dépasse ou égale 1 alors il y a un problème
    Ensuite j'ai trois habilitations différentes qui sont en fait la même chose mais il est possible de les cumuler ET ça fait parti de celles incompatibles par 3 du coup afin de ne pas de ne pas avoir une somme supérieur à 1 avec deux fois cette habilitation similaire, j'ai baissé leur valeur a 0.1 du coup ça abaisse mon seuil d'anomalie a 0.6
    La fonction renvoie mon score d'anomalie le fais le tri dans le tableau par la suite

    Autre point de modification, je n'ai pas que deux colonnes dans le tableau

    Nom : hab.jpg
Affichages : 77
Taille : 50,9 Ko

    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
    Function EstCompatible(ID, Employes As Range, Compatibilites As Range) As Double
      Dim i As Long: i = 1
      Dim j As Long: j = 1
      Dim nbcol As Integer
      Dim habLigne As Range, HabColonne As Range
     nbcol = Employes.Columns.Count
      Set habLigne = Compatibilites.Offset(0).Resize(1)
      Set HabColonne = Compatibilites.Resize(, 1)
      EstCompatible = 0
      Do While i <= Employes.Rows.Count And EstCompatible < 2
        If Employes(i, 1).Value = ID Then
          Do While j <= Employes.Rows.Count And EstCompatible < 2
            If Employes(j, 1).Value = ID Then
     
            EstCompatible = EstCompatible + Application.Index(Compatibilites, _
              Application.Match(Employes(i, nbcol).Value, HabColonne, 0), _
              Application.Match(Employes(j, nbcol).Value, habLigne, 0))
            End If
            j = j + 1
          Loop
        End If
        i = i + 1
        j = 1
      Loop
    End Function
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  6. #6
    Community Manager

    Avatar de Malick
    Homme Profil pro
    Community Manager
    Inscrit en
    Juillet 2012
    Messages
    9 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Community Manager
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9 133
    Points : 83 972
    Points
    83 972
    Billets dans le blog
    15
    Par défaut
    Salut à tous,

    En voilà encore une belle démonstration de la puissance du VBA.

    Merci Pierre pour le tuyau et halaster08 pour le retour sur son code final.
    Vous avez envie de contribuer au sein du Club Developpez.com ? Contactez-nous maintenant !
    Vous êtes passionné, vous souhaitez partager vos connaissances en informatique, vous souhaitez faire partie de la rédaction.
    Il suffit de vous porter volontaire et de nous faire part de vos envies de contributions :
    Rédaction d'articles/cours/tutoriels, Traduction, Contribution dans la FAQ, Rédaction de news, interviews et témoignages, Organisation de défis, de débats et de sondages, Relecture technique, Modération, Correction orthographique, etc.
    Vous avez d'autres propositions de contributions à nous faire ? Vous souhaitez en savoir davantage ? N'hésitez pas à nous approcher.

  7. #7
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut
    J'ai oublié de préciser un point important, mon tableau n'est qu'a moitié rempli (la partie diagonale supérieur) car en passant par aux valeurs numériques, si le tableau est complétement rempli ça double le score
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  8. #8
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 949
    Points
    55 949
    Billets dans le blog
    131
    Par défaut
    Salut.

    En fait, pour chaque ligne en A, tu dois commencer à la colonne (Ligne+1) pour ne traiter qu'une fois chaque paire. Sans cela, tu les parcours 2 fois (une fois A-Z et une fois Z-A, etc). Ca évite en plus de boucler deux fois de trop (je n'avais pas été attentif à cela lorsque j'ai donné mon premier code)

    A (ligne2) => On commence en C (Z)
    Z (ligne3) => On commence en D (Z)


    Une autre technique consisterait à diviser ton score par 2
    "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...
    ---------------

  9. #9
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 660
    Points : 5 783
    Points
    5 783
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    En fait, pour chaque ligne en A, tu dois commencer à la colonne (Ligne+1) pour ne traiter qu'une fois chaque paire. Sans cela, tu les parcours 2 fois (une fois A-Z et une fois Z-A, etc). Ca évite en plus de boucler deux fois de trop (je n'avais pas été attentif à cela lorsque j'ai donné mon premier code)
    Oui j'y avais pensé, mais par manque de temps, je n'avais pas pris le temps d'y réfléchir.

    Le code ci-dessous le prends en compte, je vois un gain non négligeable en temps de calcul:
    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
    Function EstCompatible(ID, Employes As Range, Compatibilites As Range) As Double
      Dim i As Long: i = 1
      Dim j As Long: j = 1
      Dim nbcol As Integer
      Dim habLigne As Range, HabColonne As Range
     nbcol = Employes.Columns.Count
      Set habLigne = Compatibilites.Offset(0).Resize(1)
      Set HabColonne = Compatibilites.Resize(, 1)
      EstCompatible = 0
      Do While i <= Employes.Rows.Count 
        If Employes(i, 1).Value = ID Then
          j=i+1
          Do While j <= Employes.Rows.Count
            If Employes(j, 1).Value = ID Then
     
            EstCompatible = EstCompatible + Application.Index(Compatibilites, _
              Application.Match(Employes(i, nbcol).Value, HabColonne, 0), _
              Application.Match(Employes(j, nbcol).Value, habLigne, 0))
            End If
            j = j + 1
          Loop
        End If
        i = i + 1
        j = 1
      Loop
    End Function
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  10. #10
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 949
    Points
    55 949
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    [...]je vois un gain non négligeable en temps de calcul[...]
    Bien sûr puisque l'on boucle au moins 2 fois moins (il ne sert à rien de tester A avec A, Z avec Z, ...). J'aurais dû y penser plus tôt, surtout que j'ai déjà eu le cas plusieurs fois lors du parcours de matrices de cette sorte... Méat Coule pas, comme ne dirait pas l'incontinent...
    "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...
    ---------------

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

Discussions similaires

  1. [TFileStream] : LoadFromStream et read : incompatible ?
    Par jmdeffet dans le forum Langage
    Réponses: 4
    Dernier message: 18/11/2004, 10h30
  2. [eclipse3.0][EclipseUML Omondo 3RC3 studio]incompatibles ???
    Par crapboulba dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 13/07/2004, 10h47
  3. [LG]Problême "types incompatibles"
    Par pierrOPSG dans le forum Langage
    Réponses: 7
    Dernier message: 23/04/2004, 21h34
  4. [Revue de code] Quels outils pour de grosses applis?
    Par franckR dans le forum Choisir un environnement de développement
    Réponses: 1
    Dernier message: 21/03/2004, 10h03
  5. [Socket]Incompatible type ?
    Par Edouard Kaiser dans le forum Réseau
    Réponses: 30
    Dernier message: 21/02/2004, 20h58

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