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 :

Comparer deux colonnes et copier les lignes non présentes dans le tableau de référence


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
    Directeur de projet
    Inscrit en
    Janvier 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 4
    Par défaut Comparer deux colonnes et copier les lignes non présentes dans le tableau de référence
    Bonjour,

    Je ne parviens pas à mes fins alors j'en appel à votre science. Je suis en train d'automatiser l'import de données depuis un fichier Excel vers un autre. Ma première étape était d'ouvrir une boite de dialogue, de sélectionner un fichier contenant la feuille à importer et la copier dans l'onglet "import" de ma base, ce que je suis parvenu à faire. L'étape 2 est plus délicate, je tente de comparer les codes uniques qui figurent dans la colonne A de ma base avec ceux de mon import (même format) et si l'import possède un code qui n'est pas déjà dans ma base, je voudrais COPIER/COLLER la ligne à la suite de ma base.

    Je suis parvenu à récupérer une macro qui compare les colonnes mais qui ne copie que la donnée comparée dans un autre onglet, pas la ligne entière. Après moult essais, j'échoue encore et toujours à obtenir ce que je souhaite !

    Voilà mon code pour le moment :

    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
    Sub Copie()
    Dim TabloBase
    Dim TabloImp
    Dim i As Integer
    Dim j As Integer
    Dim Lig As Long
    Dim Trouve As Boolean
     
    ' la base de référence
    With Sheets("Base")
        TabloBase = .Range(.Cells(2, 1), .Cells(.UsedRange.Rows.Count, 1))
    End With
     
    ' les données importées
    With Sheets("import")
        TabloImp = .Range(.Cells(2, 1), .Cells(.UsedRange.Rows.Count, 1))
    End With
     
    Lig = 2
     
    ' boucle sur l'import
    For i = LBound(TabloImp) To UBound(TabloImp)
        Trouve = False
        ' boucle sur la base
        For j = LBound(TabloBase) To UBound(TabloBase)
            ' si l'import est présent dans la base
            If TabloEff(i, 1) = TabloForm(j, 1) Then
                ' on passe au suivant
                Trouve = True
                Exit For
            End If
        Next j
     
        ' si on a pas trouvé l'import dans la base
        If Trouve = False Then
            With Sheets("comparatif")
            ' on le liste dans un autre onglet appelé comparatif parce que je ne parviens pas à obtenir un meilleur résultat
                .Cells(Lig, 2) = TabloImp(i, 1)
            End With
            Lig = Lig + 1
        End If
    Next i
     
    End Sub
    Je souhaiterais modifier la fin du code pour que lorsqu'un import ne figure pas dans la base, sa ligne entière y soit copiée à sa dernière ligne vide....J'ai tenté pas mal de façon différentes mais aucune ne semble fonctionner car je maitrise mal la manipulation des objets row

    Merci de votre aide !!!

  2. #2
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour Nonid et bienvenu sur ce Forum,

    Je pense que cette discussion devrait être déplacée vers le sous Forum adéquat.

    objets row
    Row n'est pas un objet mais une propriété.

    Pour ce qui concerne ta question, je te conseillerais plutôt d'utiliser la méthode Find.
    Tu en trouveras le descriptif ici

    Cette méthode retourne un objet Range qui peut être rien si la recherche n'aboutit pas.
    Tu peux tester ensuite si elle retourne un objet Range dont tu pourras utiliser les propriétés (cellule décalée, ligne, colonne.....)

    Plus de précisions quant à l'objet Range sur cet espace documentaire

  3. #3
    Membre à l'essai
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Janvier 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 4
    Par défaut
    Merci de tes conseils, je vais chercher du coté de la méthode Find !

    Navré si j'ai posté ma question dans la mauvaise partie du Forum.

  4. #4
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Navré si j'ai posté ma question dans la mauvaise partie du Forum.
    Pas du tout.
    Dès que possible, je demanderai à un modérateur de déplacer cette discussion.

    Très bonne soirée à toi et au Forum.

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Même pas besoin de la méthode Find. Il suffit de la méthode WorksheetFunction.CountIf, méthode (rubrique aide VBA à lire) --->> si retourne 0 ---->> on copie la ligne entière

    EDIT : et il y a même plus rigolo à faire. Et sans la moindre boucle. Mais on y viendra (je dirai comment) une fois réussie la méthode "normale"

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ancien Etudiant
    Inscrit en
    Janvier 2019
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Ancien Etudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 152
    Par défaut
    Bonjour,

    Pour récupérer la ligne de données, une solution possible serait d'utiliser application.index qui permet de récupérer ( dans ce cas) une "ligne" d'un tableau (array).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    If Trouve = False Then
      With Sheets("comparatif")
      ' on le liste dans un autre onglet appelé comparatif parce que je ne parviens pas à obtenir un meilleur résultat
      '.Cells(Lig, 2) = TabloImp(i, 1)
       .Cells(Lig, 2).Resize(1, UBound(TabloImp, 2)) = Application.Index(TabloImp, i) '<=
      End With
      Lig = Lig + 1
    End If
    le resize servant à "réserver" la place nécessaire aux données du tableau.

    Attention, il faudra modifier l'initialisation du tableau TabloImp car dans ton code il ne comporte qu'une "colonne"

    A+

  7. #7
    Membre à l'essai
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Janvier 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 4
    Par défaut
    Après avoir appliqué les conseils avisés prodigués ici à propos de la méthode FIND, je suis arrivé à tout petit bout de code qui fait parfaitement le travail et qui pèse moins lourd !

    Je le propose ici au cas où un autre galérien voudrait une réponse à sa question.

    Il n'est pas très élégant mais a priori efficace donc...

    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
    Sub importer()
    ' Version fonctionnelle bien qu'il me reste à déclarer mes variables (oui je sais, c'est mal!)
     
    With ThisWorkbook.Sheets("Base1").Range("a1:a500")
    der = Sheets("import").[A65000].End(xlUp).Row
      For i = 2 To der
      n = Sheets("import").Range("A" & i).Value
      d = Sheets("Base1").[A65000].End(xlUp).Row + 1
        Set c = .Find(n, LookIn:=xlValues)
        If c Is Nothing Then
     
    Sheets("import").Rows(i).Copy Destination:=Sheets("Base1").Range("A" & d)
     
    d = d + 1
    End If
    Next i
    End With
     
    End Sub
    Par désir de pas mourir idiot je vais aussi tenter la méthode de Unparia !! je suis curieux

Discussions similaires

  1. [XL-2013] Copier coller ligne non présente d'un tableau à l'autre
    Par chanasb dans le forum Excel
    Réponses: 2
    Dernier message: 06/02/2019, 11h57
  2. Remonter les lignes non vides dans un tableau excel
    Par gilou41 dans le forum Excel
    Réponses: 6
    Dernier message: 23/04/2013, 14h42
  3. [XL-2003] Comparer deux feuilles et copier les valeurs équivalentes sur une troisième
    Par Julzz dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/08/2011, 14h02
  4. Comparer deux colonnes puis supprimer les lignes en trop
    Par Theka dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 12/07/2011, 13h38
  5. Réponses: 2
    Dernier message: 30/03/2009, 13h13

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