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 :

2 dictionnaires dans une macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de frunch
    Homme Profil pro
    Développeur / comptable
    Inscrit en
    Janvier 2022
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur / comptable
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2022
    Messages : 174
    Par défaut 2 dictionnaires dans une macro
    Bonjour à tous,
    Je suis pas encore familier des dicos et j'arrive pas à l'utiliser 2 fois dans la même macro. La 1ere c'est pour que les noms des salariés ne soient pas sélectionnés 2 fois dans la liste, la 2éme pour avoir le numéro de l'enregistrement non utilisé.
    Que je crée 2 dictionnaires ou que je fasse un remove all avant la 2éme utilisation, seul le 1er dictionnaire fonctionne.
    Il y a aussi le souci du texte ou numérique. Pour le texte il y a dico.CompareMode = TextCompare, mais pour le numérique ?

    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
       'verif doublons salariés en liste
            Set dico = CreateObject("scripting.dictionary")
            dico.CompareMode = TextCompare
           For i = 0 To Me.LstSals.ListCount - 1
              If Not dico.exists(Me.LstSals.List(i)) Then
                dico.Add Me.LstSals.List(i), ""
              ElseIf dico.exists(Me.LstSals.List(i)) Then
                'dic.items
                MsgBox "Il ne peut y avoir 2 fois le même salarié dans la liste.": GoTo fin
              End If
          Next i
        'numero tache inutilisé
            'dico.RemoveAll
            Set dico2 = CreateObject("scripting.dictionary")
            With Sheets("Taches")
             ' If .FilterMode Then .ShowAllData
               t = .Range("e1:e" & drn1)
               For i = 2 To UBound(t)
                     If Not dico2.exists(t(i, 1)) Then
                         dico2.Add t(i, 1), ""
                     End If
               Next i
                 For j = 1 To 1000
                     If Not dico2.exists(j) Then
                         Me.numT.Value = j
                         Exit For
                     End If
                 Next j
             End With
    Pour les tests, ouvrez le formulaire en clic droit dans le fichier. forum.xlsm
    Merci de votre aide

  2. #2
    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,
    qu'est-ce qui ne fonctionne pas avec le deuxième dictionnaire ? parce que moi avec ce code :
    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
       Dim i%, j%, ws1 As Worksheet
         Dim drn1%, t, dico2 As Object
         Set ws1 = Sheets("Taches")
         drn1 = ws1.Range("B" & Rows.Count).End(xlUp).Row 'taches
         Set dico2 = CreateObject("scripting.dictionary")
            With ws1
             ' If .FilterMode Then .ShowAllData
               t = .Range("e1:e" & drn1)
               For i = 2 To UBound(t)
                     If Not dico2.exists(t(i, 1)) Then
                         dico2.Add t(i, 1), ""
                     End If
               Next i
                 For j = 1 To 1000
                     If Not dico2.exists(j) Then
                         Me.numT.Value = j
                         Exit For
                     End If
                 Next j
             End With
        Debug.Print "1er numéro de tâche libre : ", j
    j'obtiens bien 5 qui est le premier numéro de tâche libre dans ta feuille tâches.
    En ce qui concerne le CompareMode quand la clé est un nombre pas la peine de l'utiliser.
    Et puis dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
         For i = 0 To Me.LstSals.ListCount - 1
              If Not dico.exists(Me.LstSals.List(i)) Then
                dico.Add Me.LstSals.List(i), ""
              ElseIf dico.exists(Me.LstSals.List(i)) Then
                'dic.items
                MsgBox "Il ne peut y avoir 2 fois le même salarié dans la liste.": GoTo fin
              End If
          Next i
    Pas la peine de faire un ElseIf (car c'est la même condition qui est testée) un simple Else suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
         For i = 0 To Me.LstSals.ListCount - 1
              If Not dico.exists(Me.LstSals.List(i)) Then
                dico.Add Me.LstSals.List(i), ""
              Else
                'dic.items
                MsgBox "Il ne peut y avoir 2 fois le même salarié dans la liste.": GoTo fin
              End If
          Next i
    Ami calmant, J.P

  3. #3
    Membre très actif
    Avatar de frunch
    Homme Profil pro
    Développeur / comptable
    Inscrit en
    Janvier 2022
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur / comptable
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2022
    Messages : 174
    Par défaut
    Bonjour Jurassik pork
    Merci pour ta réponse.
    Ce qui marche pas c'est que le champ n° de tâche du formulaire ne se remplit pas. Même le debug print n'affiche rien pour moi.
    Oui les 2 codes fonctionnent séparément, mais mis ensemble, seul le 1er fonctionne.
    Merci

  4. #4
    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
    C'est normal que cela ne fonctionne pas : dans tes tests de vérification tu testes le n° de taches alors que c'est lui que l'on va déterminer, il faut mettre cette partie en commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      '  ElseIf Me.tach.Value = "" Then 'num tach autom
       '     MsgBox "Veuillez saisir une tâche."
        '    Me.tach.SetFocus
         '   GoTo fin

  5. #5
    Membre très actif
    Avatar de frunch
    Homme Profil pro
    Développeur / comptable
    Inscrit en
    Janvier 2022
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur / comptable
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2022
    Messages : 174
    Par défaut
    c'est Me.numT.Value le numéro de tache
    me.tach.value c'est le nom de la tache.

  6. #6
    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
    OK
    Citation Envoyé par frunch Voir le message
    c'est Me.numT.Value le numéro de tache
    me.tach.value c'est le nom de la tache.
    Mode opératoire ? parce que chez moi cela a l'air de fonctionner et dans le code concernant les dictionnaires je ne vois rien d'anormal. Et le debug.Print devrait au moins afficher une valeur numérique

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

Discussions similaires

  1. Ajout de Critères dans une Macros "Dictionnaires"
    Par lifestar dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/03/2019, 16h22
  2. Exécuter une sub d'un module dans une macro
    Par pnoel-bi dans le forum Access
    Réponses: 3
    Dernier message: 03/03/2006, 10h39
  3. Code asm dans une macro C
    Par progfou dans le forum C
    Réponses: 11
    Dernier message: 01/03/2006, 18h50
  4. Comment insérer une macro excel dans une macro word?
    Par max2245 dans le forum VBA Word
    Réponses: 15
    Dernier message: 07/01/2006, 17h44
  5. pb dans une macro excel VB
    Par syl221 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/10/2005, 17h29

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