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 :

Imports données sans doublon [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Novembre 2014
    Messages : 6
    Par défaut Imports données sans doublon
    Bonjour à tous,


    Utilisateur plutôt débutant d'Excel VBA, je pianote beaucoup sur ce logiciel par plaisir.
    Je consulte depuis longtemps ce forum et je viens de m'inscrire car je ne trouve pas de réponse à mon problème.

    Voici mon problème :

    J'ai un premier onglet que j'appelle "à intégrer" dans lequel se trouve un tableau de 8 colonnes (de A à H).
    Ce tableau peut avoir jusqu'à une trentaine de ligne.
    Il s'agit d'une feuille dans laquelle arrivent des données issues d'un fichier txt.

    Dans mon deuxième onglet que j'appelle "Data" , j'ai le même tableau avec d'autres données et une colonne supplémentaire en I qui contient du numérique.

    Ce que je cherche à faire via VBA :

    Intégrer les lignes de l'onglet "à intégrer" dans l'onglet "Data" en m'assurant avant qu'il n'existe pas déjà dans l'onglet "Data" une ligne comportant les mêmes valeurs en colonnes B, C, E, G et H.
    Si une ligne existe déjà avec les mêmes valeurs dans ces colonnes, je dois alors incrémenter la colonne I (valeur numérique) de cette ligne de +1.
    Si aucune ligne ne correspond, je dois alors ajouter cette ligne dans l'onglet "Data" avec la valeur 1 en colonne I.


    Voià voilà, j'espère que ce problème donnera du plaisir aux plus expérimentés


    Merci à vous.
    Nonouf

  2. #2
    Invité
    Invité(e)

  3. #3
    Membre émérite
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Par défaut
    Bonsoir
    Essayes ceci, j'ai écrit cela en vitesse pour les colonnes B et C, tu devras adapter ensuite.
    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
    Sub A_INTEGRER()
     
     
    Dim Base As Worksheet
    Dim data As Worksheet
    Dim BL As Range
    Dim ACVAL As Range
    Dim i As Integer
    Set Base = ThisWorkbook.Sheets("à intégrer")
    Set data = ThisWorkbook.Sheets("Data")
    Set BL = Base.Range(" B1")
    BL = BL.Offset(0)
    Set ACVAL = data.Range("B1")
    ACVAL = ACVAL.Offset(0)
     
    For i = 0 To 30
    If BL.Offset(i, 0) & BL.Offset(i, 1) = ACVAL.Offset(i, 0) & ACVAL.Offset(i, 1) Then
    ACVAL.Offset(i, 8) = ACVAL.Offset(i, 8) + 1
    Else
    ACVAL.Offset(i + 1, 0) = BL.Offset(i, 0)
    ACVAL.Offset(i + 1, 1) = BL.Offset(i, 1)
    End If
    i = i + 1
    Next i
     
    End Sub
    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Bonsoir !

    Nonouf, j'ai une manière efficiente et particulière de le faire (peu de lignes de code),
    déjà exposée avec succès sur un forum étranger mais pas encore sur celui-ci !
    C'est en fait une variante de l'utilisation d'un objet connu mais via une propriété non documentée officiellement,
    du moins à l'époque. J'attendais un cas concret pour poster une contribution …

    Cependant j'aurais besoin de connaitre la version d'Excel - devant pourtant être indiquée dans le titre de la discussion
    (conformément aux règles du forum !) - et si c'est bien sous Windows
    (pour Mac c'est mort ! Quoique j'ai sous le coude une autre méthode un peu mois rapide mais convenable …)
    ainsi qu'un classeur xlsx (sans code) comportant les feuilles sources et une feuille résultat désiré.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Novembre 2014
    Messages : 6
    Par défaut
    Bonjour,

    Merci pour ces premières contributions

    A rdurupt :
    Je crois que je n'ai pas le niveau pour adapter ton code

    A Eric :
    C'est un peu plus à ma portée, je vais faire des essais, ca m'a donné des idées.

    A Marc :
    Ca m'intérèsse !

    Je vous joins un fichier exemple comme demandé.
    Dans l'onglet résultat, j'ai mis les changements en rouge.
    A la fin du traitement, la feuille A INTEGRER est de nouveau vierge.
    Je suis sous Win 7 et Excel 2010.


    Merci à vous.
    Nonouf
    Fichiers attachés Fichiers attachés

  6. #6
    Invité
    Invité(e)
    Par défaut
    la solution que tu cherche est dans les exemples!

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    Sub test()
    Dim Init As Boolean
    Dim DerL As Long
    '***************************************************
    'Vérification de l'existant avant import CSV
    Init = False
    Set MyRange = Sheets("Feuil1").UsedRange
    Debug.Print "********************"
    Debug.Print "Sur la ligne"
    For L = 1 To MyRange.Rows.Count
        Debug.Print Highlander(Init, MyRange.Range(MyRange(L, 1), MyRange(L, MyRange.Columns.Count)))
    Next
     
    Set MyRange = Sheets("Feuil2").UsedRange
    Debug.Print "********************"
    Debug.Print "Sur la ligne"
    For L = 1 To MyRange.Rows.Count
       If Highlander(Init, MyRange.Range(MyRange(L, 1), MyRange(L, MyRange.Columns.Count))) = False Then
      DerL = Sheets("Feuil1").Cells(Sheets("Feuil1").Cells.Rows.Count, 1).End(xlUp).Row + 1
        MyRange.Range(MyRange(L, 1), MyRange(L, MyRange.Columns.Count)).Copy Sheets("Feuil1").Cells(DerL, 1)
       End If
    Next
     
    End Sub
     
    Function Highlander(Init As Boolean, ParamArray Plage()) As Boolean
    '..................................................
    'La méthode Highlander, il ne peut en rester qu'un.
    'Retourne True si doublon.
    '..................................................
     
    Static CollectDoublon As Collection
    Dim T As String
    Dim PlageIndex As Long
    Dim myPlage As Range
    Dim Col As Integer
    Dim Tableau
    If Init = False Then
    Init = True
       Set CollectDoublon = Nothing
       Set CollectDoublon = New Collection
    End If
     
     
    T = "T"
    For PlageIndex = 0 To UBound(Plage)
    If TypeName(Plage(PlageIndex)) = "Range" Then
           Set myPlage = Plage(PlageIndex)
     
           For Col = 1 To myPlage.Columns.Count
            T = T & "_" & Trim("" & myPlage(1, Col))
           Next
        Else
            If TypeName(Plage(PlageIndex)) = "Variant()" Then
               Tableau = Plage(PlageIndex)
            Else
                If TypeName(Plage(PlageIndex)) Like "*()" Then
                    Tableau = Plage(PlageIndex)
                Else
                    Tableau = Split(Plage(PlageIndex) & ";", ";")
                End If
            End If
             For Col = 0 To UBound(Tableau)
               If Trim("" & Tableau(Col)) <> "" Then T = T & "_" & Trim("" & Tableau(Col))
             Next
        End If
    Next
    On Error Resume Next
    CollectDoublon.Add T, T
    If Err <> 0 Then Highlander = True
    On Error GoTo 0
    End Function
    la méthode Highlander tu n'y touche pas tu l'utilise c'est tout!

  7. #7
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    L'astuce évoquée serait un peu too much dans ce cas car une clef sur l'immatriculation - unique donc - est suffisante !

    Par contre dans la feuille A INTEGRER il n'y a pas de corrélation pour la première ligne (Nissan) avec la feuille DATA,
    juste une erreur dans ce fichier exemple fait à la va-vite ?

    Sinon en utilisant les fonctions de feuilles de calculs, le code serait plus simple que le post #6 …
    La méthode RemoveDuplicates ne convient pas car il ne s'agit pas d'une simple copie !

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

Discussions similaires

  1. [XL-2010] Import de données sans doublons
    Par triaguae dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/08/2014, 16h36
  2. extraction d'une liste de données sans doublons et triées
    Par lps02 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 24/04/2012, 22h51
  3. [XL-2003] Exporter une liste de données sans doublons après un filtre sur une deuxième feuille
    Par mandrake57 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/07/2011, 13h36
  4. créer une série de chiffre aléatoire dans une plage donnée, sans doublon
    Par ProgElecT dans le forum Vos contributions VB6
    Réponses: 4
    Dernier message: 02/07/2008, 10h02
  5. [Conception] Insertion de données sans doublon
    Par Yukhaa dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 19/10/2006, 08h35

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