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 / deleter les lignes de deux bases de données.


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 163
    Points : 72
    Points
    72
    Par défaut Comparer / deleter les lignes de deux bases de données.
    Bonjour,
    J'ai un problème sous VBA excel. En fait j'ai deux bases de données, l'une sur une feuille nommée "base1" et l'autre sur une feuille nommée "base2", ce que je souhaiterais faire c est pour chaque ligne (critères colonne A à AA) de la base 1, si elle existe sur la base 2 (critères A à AA),je la garde sinon je delete la ligne de la base1.
    Merci pour vos conseil et votre aide.
    Bonne journée.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    J'ai déjà eu ce genre de problématique, j'ai fait une petite adaptation de mon code pour toi... à finaliser éventuellement.

    J'ai utilisé un biais pour les comparaisons : vu que le nombre de lignes à comparer peut être important, et vu le nombre de colonnes, j'ai préféré pour chaque ligne concaténer les colonnes dans une nouvelle feuille, et ce pour les deux bases.
    Du coup l'utilisation de la commande Find devient possible, c'est nettement plus rapide que deux boucles imbriquées dans le cas d'un nombre de lignes conséquent.

    J'espère que le code n'est pas trop obscur, je manque de temps pour tout commenter là.

    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
     
    Sub Macro1()
     
    Dim lignesSupprimees(0 To 65535) As Long
     
    'on désactive certaines fonctions d'excel qui pourraient le ralentir en écriture :
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.Interactive = False
    Application.Calculation = xlCalculationManual
    Application.Cursor = xlWait
     
     
    Sheets.Add After:=Sheets(Sheets.Count)
    sh1 = ActiveSheet.Name
    Sheets.Add After:=Sheets(Sheets.Count)
    sh2 = ActiveSheet.Name
     
    ' 1 - PREPARATION :
    'on copie en les concaténant les données de base1 dans sh1
    For Each r1 In Sheets("base1").UsedRange.Rows
        varTampon = ""
        For i = 1 To 27 'de la colonne A à la colonne AA
            varTampon = varTampon & Sheets("base1").Cells(r1.Row, i) & ";"
        Next i
        Sheets(sh1).Cells(r1.Row, 1) = varTampon
    Next
     
    'on copie en les concaténant les données de base2 dans sh2
    For Each r2 In Sheets("base2").UsedRange.Rows
        varTampon = ""
        For i = 1 To 27 'de la colonne A à la colonne AA
            varTampon = varTampon & Sheets("base2").Cells(r2.Row, i) & ";"
        Next i
        Sheets(sh2).Cells(r2.Row, 1) = varTampon
    Next
     
    ' 2 - COMPARAISON :
    j = 0
    For Each r3 In Sheets(sh1).UsedRange.Cells
        Set c = Sheets(sh2).Range("A:A").Find(what:=r3.Value, lookat:=xlWhole)
            If c Is Nothing Then
                'si pas de correspondance trouvée, on note qu'il faut supprimer la ligne
                lignesSupprimees(j) = r3.Row
                j = j + 1
            End If
    Next
     
    'dans un 2ème temps on va supprimer les lignes dans base1 :
    j = 0
    Do While lignesSupprimees(j) <> 0
        Sheets("base1").Rows(lignesSupprimees(j) - j).Delete 'note : la suppression décalant les lignes vers le haut, il convient d'en tenir compte avec le -j
        j = j + 1
    Loop
     
    'on supprime les deux feuilles créées pour les comparaisons
    Sheets(sh1).Delete
    Sheets(sh2).Delete
     
    Sheets("base1").Activate
     
    'on réactive les fonctions désactivées précédemment :
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Application.Interactive = True
    Application.Calculation = xlCalculationAutomatic
    Application.Cursor = xlDefault
     
     
    End Sub

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    Edit : je viens de tester avec vraiment beaucoup de lignes... ça mouline encore.
    Donc bon, il doit y avoir mieux que de concaténer les colonnes dans une nouvelle feuille... c'est sûrement ça qui prend beaucoup de temps.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/07/2014, 09h05
  2. Réponses: 2
    Dernier message: 28/12/2012, 11h06
  3. Comparer les écart entre deux bases de données
    Par pretor dans le forum Excel
    Réponses: 8
    Dernier message: 28/09/2010, 14h51
  4. Réponses: 3
    Dernier message: 10/04/2009, 13h26

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