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 :

procédure recherche et suppression [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut procédure recherche et suppression
    bonjours

    j'ai écrit un code mais il ne marche qu'a moitié et je ne sais pas pourquoi
    normalement il devrait me supprimer des lignes dans deux feuilles mais il ne me le fait que sur une feuille. Je dois dire que ça m'embête un peu.

    donc voilà le code

    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
    Sub suppession_doublons()
    Dim plage, plagebis As Range
    Dim derlig As Long
    Dim lavaleur As Variant
    Dim rg As Range
     
     
    derlig = Range("A" & Rows.Count).End(xlUp).Row
    Set plage = Range(Cells(1, 1), Cells(derlig, 5))
    tableau = plage.Value
        For i = 1 To derlig
            For j = 2 To 5
                For Each sh In Worksheets(Array("EXP-DIF", "AAR", "RST"))
                If tableau(i, 2) = 1 Then
                   If tableau(i, 3) = 1 Or tableau(i, 4) = 1 Then
                        lavaleur = tableau(i, 1)
                            If tableau(1, j) = sh.Name Then
                                sh.Select
                                    Range("A:A").Select
                                    For Each rg In Selection
                                        If rg = lavaleur Then
                                        rg.EntireRow.Delete
                                        End If
                                    Next rg
                             End If
                   End If
                End If
                Next sh
               Next j
        Next i
    End Sub
    je pense que c'est peut être dû à l'ordre des boucles mais je ne sais pas comment faire

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 764
    Par défaut
    Bonjour,

    Je pense qu'avant de deleter, tu dois activer la feuille !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Worksheet("nom de la feuille 1").Activate
    rg.EntireRow.Delete
    Worksheet("nom de la feuille 2").Activate
    rg.EntireRow.Delete

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    non en faite non j'ai fait une petite erreur

    mon programme fonctionne nickel

    BUT!!!!

    il est vraiment trop long à charger

    est ce qu'il est possible de le simplifier au maximum pour gagner du temps

    voila merci d'avance

  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
    Bonjour Huitre,

    Ce qui nécessite beaucoup de ressource, à mon avis, c'est ton balayage de ta colonne A.
    Ceci outre le fait que le ne sert à rien, comme presque toujours.

    Essaie plutôt d'adapter l'aide en ligne de Findnext

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    j'ai remodifié mon programme (je n'ai pas utiliser le findnext)
    j'ai l'impression que ça s'execute plus vite mais ça ne supprime rien

    voilà les changement effectué ( en vert )


    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
    Sub suppession_doublons()
    Dim plage, plagebis As Range
    Dim derlig, derlg As Long
    Dim lavaleur As Variant
    Dim rg As Range
    
    
    derlig = Range("A" & Rows.Count).End(xlUp).Row
    Set plage = Range(Cells(1, 1), Cells(derlig, 5))
    tableau = plage.Value
        
        For i = 1 To derlig
            For j = 2 To 5
                For Each sh In Worksheets(Array("EXP-DIF", "AAR", "RST"))
                If tableau(i, 3) = 1 Then
                   If tableau(i, 2) = 1 Or tableau(i, 4) = 1 Then
                        lavaleur = tableau(i, 1)
                            If tableau(1, j) = sh.Name Then
                                sh.Select
                                    derlg = Range("A" & Rows.Count).End(xlUp).Row
                                    Set plagebis = Range(Cells(1, 1), Cells(derlig, 6))
                                    tableaubis = plagebis.Value
                                    For k = 1 To derligne
                                        If tableaubis(i, 1) = lavaleur Then
                                        tableaubis(i, 1).Select
                                        Selection.EntireRow.Delete
                                        End If
                                    Next k
                             End If
                   End If
                End If
                Next sh
               Next j
        Next i
    End Sub

  6. #6
    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
    Salut,

    Comme tu voudras.

    De plus, ta boucle utilise une variable k et ton code à l'intérieur de celle-ci utilise une variable i.

    Encore une fois, arrête les

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    ben j'ai changé le code à ce niveau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    If tableau(1, j) = sh.Name Then
    sh.Select
    derlg = Range("A" & Rows.Count).End(xlUp).Row
    Set plagebis = Range(Cells(1, 1), Cells(derlg, 6))
         For Each rg In plagebis
             If rg = lavaleur Then
                rg.EntireRow.Delete
             End If
    Next
    End If

    mais bon ça ne change rien et puis je ne vois pas comment enlever mes select et utiliser l'instruction find

    étant donné que les boucles vont parcourir ligne par ligne ce qui constitue une réele gene en terme de gain de temps

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Sans avoir regardé en détail ton code.
    Pour supprimer les lignes d'une feuille Excel à l'aide d'une boucle, on part de la dernière ligne vers la première et pas l'inverse. Sinon tu détruis des lignes qui ne doivent pas l'être.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    oui mais je ne pense pas que ça économisera enormément de temps

    moi je voudrais savoir comment faire en sorte que ce qui est en ligne 7 fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    derlg = Range("A" & Rows.Count).End(xlUp).Row
    Set plagebis = Range(Cells(1, 1), Cells(derlig, 6))
    tableaubis = plagebis.Value
    For k = 1 To derligne
        If tableaubis(k, 1) = lavaleur Then
               tableaubis(k, 1).Rows.Delete
         End If
     Next k

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonsoir,
    moi je voudrais savoir comment faire en sorte que ce qui est en rouge fonctionne
    derlg = Range("A" & Rows.Count).End(xlUp).Row
    Set plagebis = Range(Cells(1, 1), Cells(derlig, 6))
    tableaubis = plagebis.Value
    For k = 1 To derligne
    If tableaubis(k, 1) = lavaleur Then
    tableaubis(k, 1).Rows.Delete
    End If
    Next k
    Je viens de t'expliquer plus haut qu'il faut partir de la dernière ligne vers la première.
    Soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For k = derligne To 1 step -1
    Mais sans avoir regardé plus avant ton programme
    En bouclant de la première à la dernière cela ne peut pas fonctionner.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  11. #11
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    j'ai essayé comme tu m'as dit malheureusement ça ne change strictement rien lol

  12. #12
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    En plus de ce que a dit Corona, Tableaubis est une variable tableau et non une plage de cellule.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableaubis(k, 1).Rows.Delete
    C'est du n'importe quoi

    EDIT: Mets en PJ un extrait de ton fichier

  13. #13
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    alors voilà le fichier correspondant avec le code

    la feuille de référence correspond à Feuille-Doublons

    oui tu as posé le probleme c'est une variable tableau comment faire alors pour supprimer les lignes correspondantes avec une variable tableau


    Merci d'avance

  14. #14
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour

    Si tu as Excel 2007 ou 2010, et en utilisant un filtre automatique avec un tableau comme paramètre, ci-joint proposition (j'avoue que ton explication de ce que tu veux supprimer n'est pas claire)
    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
    Sub SupprDoublons()
    Dim LastLig As Long, i As Long, k As Long, T As Long
    Dim N As Byte, j As Byte, m As Byte
    Dim TabB, TabS, TabN()
    Dim Str As String
     
    T = Timer
    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With
    TabS = Array("RST", "EXP-DIF", "AAR")            'LES COLONNES DE FEUILLES DOUBLONS DOIVENT ETRE ORGANISEES COMME CECI en B RST en C EXP-DIF et en D AAR
    N = UBound(TabS)
    With ThisWorkbook.Worksheets("Feuille-DOUBLONS")
        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
        TabB = .Range(.Cells(1, 1), .Cells(LastLig, N + 2))
        For j = 2 To N + 2
            For i = 2 To LastLig
                If TabB(i, j) > 0 Then
                    k = k + 1
                    ReDim Preserve TabN(1 To 2, 1 To k)
                    TabN(1, k) = TabB(i, 1)
                    TabN(2, k) = TabB(1, j)
                    If j < N + 2 Then
                        For m = j + 1 To N + 2
                            TabB(i, m) = 0
                        Next m
                    End If
                End If
            Next i
        Next j
    End With
    'On boucle sur les feuilles RST,EXP et AAR et on recrée un tableau critère du filtre
    For j = 0 To N
        For i = 1 To k
            If TabN(2, i) = TabS(j) Then Str = Str & "|" & TabN(1, i)
        Next i
        Str = Mid(Str, 2)
        If Len(Str) > 0 Then
            With Sheets(TabS(j))
                .AutoFilterMode = False
                LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
                .Range("A1:A" & LastLig).AutoFilter Field:=1, Criteria1:=Split(Str, "|"), Operator:=xlFilterValues
                If .Range("A1:A" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then .Range("A2:A" & LastLig).SpecialCells(xlCellTypeVisible).EntireRow.Delete
                .AutoFilterMode = False
            End With
        End If
        Str = vbNullString
    Next j
    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
    End With
    MsgBox "Traitement terminé en " & Timer - T & " secondes"
    End Sub

  15. #15
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    Salut merci pour ta réponse.

    mais le deboguage pointe sur cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("A1:A" & LastLig).AutoFilter Field:=1, Criteria1:=Split(Str, "|"), Operator:=xlFilterValues
    petite précision j'ai excel 2003

    merci d'avance

  16. #16
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Vous ne lisez pas...
    Si tu as Excel 2007 ou 2010
    Sur ton fichier joint ici, tu quand même ne doute pas que j'ai testé au préalable?

    Quelle est ta version d'Excel?

  17. #17
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    j'ai excel 2003 dsl

  18. #18
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Si tu expliquais clairement dans quelle condition tu souhaites supprimer les lignes de ta feuille parce-que pour ma part en lisant ton code je ne vois pas très bien ce que tu veux faire.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  19. #19
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    alors

    j'ai 4 feuilles

    "feuilles-doublons","rst","pch","exp-dif"

    les feuilles "rst","pch","exp-dif" ont la même structure

    la feuilles "feuilles-doublons" contient 5 colonnes

    la premiere intitulé "doublons" ou clés répertorie tous les numéros de récépissés
    les colonnes RST, EXP DIF,AAR recensent le nombre de fois ou les numéros de récépissés apparaissent dans respectivement les feuilles RST,EXP DIF, AAR

    donc le but c'est de parcourir la feuille "feuilles-doublons" et de faire le traitement suivant:
    si la clé ou doublons apparait en AAR et qu'elle est présente en EXP DIF ou la feuille RST alors on la supprime en AAR ou en RST


    voilà

    cordialement,
    huître

  20. #20
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Sur la feuille DOUBLONS, le tableau (colonnes B, C, D) est alimenté comment ? des fonctions Excel ou bien par cette même macro ?
    La cellule D1 de cette même feuille contient EXP-DIF alors que la feuille dont il est question se nomme EXP-DEF c'est une erreur ?
    Tu écris
    donc le but c'est de parcourir la feuille "feuilles-doublons" et de faire le traitement suivant:
    si la clé ou doublons apparait en AAR et qu'elle est présente en EXP DIF ou la feuille RST alors on la supprime en AAR ou en RST
    Cela veut dire que si c'est à la fois dans RST et AAR il n'y a pas de suppression de ligne ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/11/2006, 12h54
  2. Réponses: 17
    Dernier message: 08/06/2006, 10h34
  3. [IO]Recherche et suppression de lignes
    Par anthyme dans le forum Général Python
    Réponses: 9
    Dernier message: 20/04/2006, 18h47
  4. [VB]Recherche et suppression de caracteres
    Par tim69000 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 09/02/2006, 15h56

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