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 :

suprimer une ligne identique sur deux tableaux


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut suprimer une ligne identique sur deux tableaux
    bonsoir
    j'ai deux tableaux
    et sur le tableau 1 il y a des lignes identique à celle du tableau 2
    je voudrais supprimer les lignes du tableau 1 qui sont identiques au tableau 2

    merci pour votre aide

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Une ligne entière est un range, or un range est un tableau à deux dimensions. Si on sait que deux tableaux peuvent se comparer l'un à l'autre sans boucle, on sait aussi que deux ranges peuvent se comparer.
    Tu peux donc comparer une ligne entière à une autre ligne entière.
    Y'a plus qu'à
    Comme je m'en vais pour le we je ne suis pas certain de pouvoir t'aider plus que ça mais tu trouveras bien quelqu'un
    Bonne journée

  3. #3
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    ok, je vais creuser sur la commande "range", mais je ne vois pas comment sans une boucle demander de verifier si la ligne 1 du tableau 2 se trouve sur une des lignes du tableau 1 et par une boucle ça me parait super lourd de cette manière

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    En fait tu ne testes que les lignes dont la cellule de la colonne 1 correspond.
    J'avais quelques minutes alors teste déjà ça mais je pense qu'on doit pouvoir encore simplifier.
    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
    Option Explicit
     
    Sub Test()
    Dim FL1 As Worksheet, FL2 As Worksheet, ok As Boolean
    Dim Plage As Range, c As Range
    Dim NoLig As Long, NoCol As Integer, Dercol As Integer
        Set FL1 = Worksheets("Feuil1")
        Set FL2 = Worksheets("Feuil2")
     
        'On prend le + grand N° de colonne
        Dercol = IIf(FL1.Cells.SpecialCells(xlCellTypeLastCell).Column > FL2.Cells.SpecialCells(xlCellTypeLastCell).Column, _
            FL1.Cells.SpecialCells(xlCellTypeLastCell).Column, FL2.Cells.SpecialCells(xlCellTypeLastCell).Column)
     
        Set Plage = FL2.Range(FL2.Cells(1, 1), FL2.Cells(FL2.Cells.SpecialCells(xlCellTypeLastCell).Row, 1))
        With Plage 'on recherche une donnée de la colonne A de FL1 dans la colonne A de FL2
            For NoLig = 1 To FL1.Cells.SpecialCells(xlCellTypeLastCell).Row
                Set c = .Find(FL1.Cells(NoLig, 1))
                If Not c Is Nothing Then
                    ok = True
                    For NoCol = 1 To Dercol
                        ok = ok And (FL1.Cells(NoLig, NoCol) = FL2.Cells(c.Row, NoCol))
                        if not ok then exit for 'permet de réduire le tps d'exécution
                    Next
                    'et là, si ok, tu fais ce que tu veux
                    If ok Then _
                        MsgBox "La ligne " & c.Row & " de la feuille " & FL2.Name & _
                        " correspond à la ligne " & NoLig & " de la feuille " & FL1.Name
                End If
            Next
        End With
    End Sub
    Ce coup-ci, tu devras continuer tout seul

  5. #5
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    grandiose

    merci

    dis moi, crois tu qu'il serais possible de faire la même chose, mais conditionner à la valeur de la cellule a dans chaque tableau

    car dans mon pocessus complet ailleur, j'ai un travail similaire, mais les colones ayant été déplacé et d'autre supprimé, ils ne se reconnaisse pas

    le dénominateur commun est la colonne a

    en revenant au code que tu as mis (et pour comprendre et progresser)
    tu utilise des alias (FL1 et FL2 pour les feuilles), c'est très malin. On peux conservé cette technique pour toutes les application simple comme sheets alias.select par exemple ?

    sinon j'enrage d'avoir du mal a bien comprendre le fonctionnement de ton code

    de plus j'ai mis après then_
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        Rows(c).Select
       Selection.Delete Shift:=xlUp
    mais ça n'ai pas correct
    c n'est pas la variable qui desiqne la ligne ??

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    c représente un range, ici la cellule. Si tu affiches c.address, tu as l'adresse de la cellule c.address. Donc pour supprimer la ligne, utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Rows(c.row).Delete Shift:=xlUp
    Et évite les sélections qui ne servent qu'à alourdir le code dans 90% des cas.
    Dans le cas présent utilise FL2.Rows(...
    Bonne soirée

  7. #7
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    impecable, merci

    donc maintenant je vais essayer de pousser le code pour qu'il supprime les lignes d'un tableau qui ont la cellule a identique au deuxieme tableau

    le souci c'est que je ne comprend absolument pas comment fonctionne cette partie de ton code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       Dercol = IIf(FL1.Cells.SpecialCells(xlCellTypeLastCell).Column > FL2.Cells.SpecialCells(xlCellTypeLastCell).Column, _
            FL1.Cells.SpecialCells(xlCellTypeLastCell).Column, FL2.Cells.SpecialCells(xlCellTypeLastCell).Column)

    c'est la première fois que je vois SpecialCells, ainsi que xlCellTypeLastCell

    mais bon on va plancher dessus

    je mettrais résolu lorsque je rajouterais (si j'y arrive) le code que je cherche au final

    pour finir, je ne comprend pas pourquoi tu me precise

    "Dans le cas présent utilise FL2.Rows(..."

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Citation Envoyé par bosk1000
    le souci c'est que je ne comprend absolument pas comment fonctionne cette partie de ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       Dercol = IIf(FL1.Cells.SpecialCells(xlCellTypeLastCell).Column > FL2.Cells.SpecialCells(xlCellTypeLastCell).Column, ...
    Là, pour être certain de comparer toute la ligne en cours, on doit être certain de comparer toutes les données de la ligne. Or on ne connaît pas la longueur de la ligne (le nbre de colonnes) sauf à la vérifier pour chacune d'elles. Il va plus vite de prendre la ligne la plus longue de la plage de données. Si les cellules sont vides dans les deux feuilles, la correspondance sera également acquise pour des lignes identiques.
    Pour IIf, je te conseille de regarder dans l'aide en ligne, c'est très bien expliqué.
    Citation Envoyé par bosk1000
    je ne comprend pas pourquoi tu me precises
    "Dans le cas présent utilise FL2.Rows(..."
    Quant on travaille sur deux feuilles de calculs, il est grandement préférable de désigner la feuille concernée (et je ne dis pas de l'activer !). D'autant que j'ignore quelle est la feuille active, ce dont, avec ce code, je me moque.
    Bonne journée

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/08/2014, 21h36
  2. [Free Pascal] Détecter les lignes identiques dans deux tableaux de texte
    Par jeanmich dans le forum Free Pascal
    Réponses: 11
    Dernier message: 10/01/2009, 15h43
  3. mettre une requête SQL sur deux lignes
    Par MAMANHOU dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/11/2008, 15h37
  4. Réponses: 4
    Dernier message: 19/05/2006, 10h10
  5. afficher une ligne contante sur le graphe d'un DBChart ?
    Par bigfoot dans le forum Bases de données
    Réponses: 5
    Dernier message: 23/12/2004, 16h33

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