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 :

Lister noms sans doublons sur des plages discontinues


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Lister noms sans doublons sur des plages discontinues
    Bonjour le forum,

    Je sollicite votre aide pour une macro qui recupère une liste de noms avec un code personnel et qui élimine les doublons.
    La feuille 1 contient les données sous forme de tableaux, 4 plages sont définies, elles sont discontinues et représentent 6 colonnes (2 colonnes par plages).
    La macro récupère bien la première plage mais ne continue pas sur les 3 autres.
    Si une seule plage est définie sur 2 colonnes uniquement et que je fais par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'TabPlage = .Range("noms")
    alors le résultat attendu est correcte.

    Néanmoins, je souhaiterai un mise en page sur plusieurs colonnes.

    Comme un ex est plus probant, je joins un fichier.

    Merci pour votre aide
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut
    Si tu execute en mode pas a pas ou que tu breack sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            TabPlage = Application.Union(Range("premiereplage"), Range("deuxiemeplage"), Range("troisiemeplage"), Range("quatriemeplage")).Value
    et que tu regardes une fois cette ligne exécuté le contenu de TaPlage, tu vas te rendre compte que visiblement l'union n'est pas accepté lors de cette écriture, je veux pas dire de bêtise mais tu ne peux pas écrire ça avec une sélection discontinu.
    Pour faire ce que tu veux faire, il va falloir renseigner ta collection en 4 fois

    tabplage = premiereplage
    renseigner collection

    tabplage = 2emeplage
    ajouter es nouvelles entrées a ta colection

    tabplage = 3emeplage ..
    ....

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonsoir,
    merci Qwazerty pour l'info, je ne sais pas bien interpréter les messages d'erreur sous vba (débutant oblige )
    En modifiant le code comme ci dessous, ça fonctionne :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Option Explicit
     
    Sub RecupNom()
    Dim i As Integer, x As Integer
    Dim ColBase As New Collection
    Dim TabPlage, TabPlage2, TabPlage3, TabPlage4 As Variant, Container As Variant
    Dim Item As Variant
     
        With Sheets("Feuil1")
            TabPlage = .Range("premiereplage")
            TabPlage2 = .Range("deuxiemeplage")
            TabPlage3 = .Range("troisiemeplage")
            TabPlage4 = .Range("quatriemeplage")
        End With
     
     
    On Error Resume Next
        For i = 1 To UBound(TabPlage)
            If Not IsEmpty(TabPlage(i, 1)) Then
                ColBase.Add CStr(Trim(TabPlage(i, 1))) & "#" & CStr(Trim(TabPlage(i, 2))), CStr(Trim(TabPlage(i, 1))) & "#" & CStr(Trim(TabPlage(i, 2)))
            End If
        Next
    On Error Resume Next
        For i = 1 To UBound(TabPlage2)
            If Not IsEmpty(TabPlage2(i, 1)) Then
                ColBase.Add CStr(Trim(TabPlage2(i, 1))) & "#" & CStr(Trim(TabPlage2(i, 2))), CStr(Trim(TabPlage2(i, 1))) & "#" & CStr(Trim(TabPlage2(i, 2)))
            End If
        Next
    On Error Resume Next
        For i = 1 To UBound(TabPlage3)
            If Not IsEmpty(TabPlage3(i, 1)) Then
                ColBase.Add CStr(Trim(TabPlage3(i, 1))) & "#" & CStr(Trim(TabPlage3(i, 2))), CStr(Trim(TabPlage3(i, 1))) & "#" & CStr(Trim(TabPlage3(i, 2)))
            End If
        Next
    On Error Resume Next
        For i = 1 To UBound(TabPlage4)
            If Not IsEmpty(TabPlage4(i, 1)) Then
                ColBase.Add CStr(Trim(TabPlage4(i, 1))) & "#" & CStr(Trim(TabPlage4(i, 2))), CStr(Trim(TabPlage4(i, 1))) & "#" & CStr(Trim(TabPlage4(i, 2)))
            End If
        Next
    On Error GoTo 0
        For Each Item In ColBase
          Container = Split(Item, "#")
          x = x + 1
     
                 With Sheets("Feuil2")
                     .Range("A" & 5 + x) = Container(0)
                     .Range("B" & 5 + x) = Container(1)
                 End With
        Next
    End Sub
    Je ne sais pas si cela est très "optimisé" mais ça a l'air de fonctionner, le résultat semble correct.

    Merci pour ton aide

  4. #4
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Il est possible de simplifier comme ceci

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Option Explicit
     
    Sub RecupNom()
    Dim i As Integer, x As Integer
    Dim TabPlage As Variant
    Dim Item As Variant
    Dim NomsTab, NomTab
    Dim TabDest
     
        'On crée la liste des nom de plage
        NomsTab = Array("premiereplage", "deuxiemeplage", "troisiemeplage", "quatriemeplage")
     
        'On dimensionne un tableau qui resevra les résultats
        'Ligne et colonne sont volontairement inversé ici
        'La raison de cette inversion vient du fait qu'il n'est possible
        'de redimensionner que la derniere dimension d'un tableau
        'Ce tableau est en base 0
        ReDim TabDest(1, 0)
     
        'On Error Resume Next 'attention avec ca, si une erreur survient tu ne la vera pas
        For Each NomTab In NomsTab
            'On defini la plage sur laquelle on travail
            TabPlage = Range(NomTab).Value
            'On boucle sur le contenu de la plage
            For i = 1 To UBound(TabPlage)
                'si contenu de la case non vide
                If Not IsEmpty(TabPlage(i, 1)) Then
                    'On rajoute les données dans le tableau destination
                    TabDest(0, UBound(TabDest, 2)) = Trim(TabPlage(i, 1))
                    TabDest(1, UBound(TabDest, 2)) = Trim(TabPlage(i, 2))
                    'On prevoit une ligne supplémentaire
                    ReDim Preserve TabDest(1, UBound(TabDest, 2) + 1)
                End If
            Next
            'On supprime la derniere ligne qui avait ete rajouté et que l'on n'a pas utilisé
            ReDim Preserve TabDest(1, UBound(TabDest, 2) - 1)
     
            'On vide le contenu de tabplage 'facultatif, mais il est bien de le faire au moins a la fin de la procédure avant le end sub
            Set TabPlage = Nothing
        Next
        On Error GoTo 0
     
        'On met les valeurs contenu dans TabDes dans la Feuil2
        'Ici on transpose les données, afin de remettre les lignes et les colonne dans la bonne organisation
        With Sheets("feuil2")
            .Range("A5", .Cells(UBound(TabDest, 2) + 5, "B")).Value = WorksheetFunction.Transpose(TabDest)
        End With
     
    End Sub
    Renseigner un tableau a partir d'une plage, fonctionne aussi en sens inverse.

    Attention avec l'utilisation de "On error Resume Next" il faut etre bien sur que le code a été parfaitement débuggé avant de rajouter cette ligne, sinon les erreur ne remonte pas ou trop tard.
    Il n'est pas utile de repeter plusieur fois "On error resume next", il reste "actif" tant qu'on ne le modifie pas explicitement par exemple en mettant "On error goto 0"
    Lorsque dans ton code tu répètes plusieurs fois la même chose, dis toi que tu peux simplifier, soit en faisant une boucle, soit en appelant une sous function/procédure.

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

Discussions similaires

  1. Tri par nom sans doublons et le compter chaque visite
    Par epiouf dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 19/06/2009, 16h02
  2. [SSIS]Doublons sur des millions de ligne
    Par MeriConsult dans le forum SSIS
    Réponses: 5
    Dernier message: 19/12/2008, 08h04
  3. Select sans doublon sur un champ
    Par Carnot dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/10/2007, 22h36
  4. VBA,Graphiques :Series qui pointent sur des Range Discontinu
    Par CCHEVALIER dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/09/2005, 14h05
  5. Réponses: 2
    Dernier message: 19/08/2003, 18h04

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