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 :

Amélioration / Correction macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2013
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2013
    Messages : 30
    Par défaut Amélioration / Correction macro
    Bonjour,

    J'ai codé la macro suivante, mais j'aimerai améliorer la syntaxe du code et surtout des boucles car le fichier original contient beaucoup de données ce qui ralentit le traitement.

    Si les HardCoderz du forum peuvent y apporter des corrections/améliorations, tout en m'expliquant pourquoi, je suis preneur !

    Comment ce code doit marcher ?
    1) Dans le sheet "Feuil1" j'ai des données de la colonne A à P (P contient une référence unique pour chaque ligne)

    2) Dans "Feuil2" je copie des données de la colonne A à N (N contient une référence unique pour chaque ligne)

    3)je lance le code


    ==> Dans "Feuil2" il y a des références que l'on retrouve dans "Feuil1". La macro a pour but de supprimer les références de la colonne N dans ""Feuil2" qui sont déjà présentent dans "Feuil1".


    Merci et j'attends vos feedback

    Cheers !



    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 test_ctrl1()
     
    '**** declaration des variables ****
    Dim I As Integer
    Dim ref_deal As String
     
    Application.ScreenUpdating = False
     
    '**** scan et delete des references ****
    For I = 2 To 40 Step 1
    ref_deal = Worksheets("Feuil2").Cells(I, 14)
    Set MonDeal = Worksheets("Feuil1").Range("P2:P3000").Find(ref_deal, LookIn:=xlValues)
    If Not MonDeal Is Nothing Then Worksheets("Feuil2").Range("N2:N40").Find(ref_deal, LookIn:=xlValues).EntireRow.Delete 'j'aimerai supprimer la ligne correspondante que de la colonne A à N
    If I = 40 Then Exit For
    Next I
     
    Set MonDeal = Nothing
    For I = 2 To 20 Step 1
    ref_deal = Worksheets("Feuil2").Cells(I, 14)
    Set MonDeal = Worksheets("Feuil1").Range("P2:P3000").Find(ref_deal, LookIn:=xlValues)
    If Not MonDeal Is Nothing Then Worksheets("Feuil2").Range("N2:N21").Find(ref_deal, LookIn:=xlValues).EntireRow.Delete 'supprimer la ligne correspondante que de la colonne A à N
    If I = 20 Then Exit For
    Next I
     
    Set MonDeal = Nothing
    For I = 2 To 15 Step 1
    ref_deal = Worksheets("Feuil2").Cells(I, 14)
    Set MonDeal = Worksheets("Feuil1").Range("P2:P3000").Find(ref_deal, LookIn:=xlValues)
    If Not MonDeal Is Nothing Then Worksheets("Feuil2").Range("N2:N20").Find(ref_deal, LookIn:=xlValues).EntireRow.Delete 'supprimer la ligne correspondante que de la colonne A à N
    Next I
     
    MsgBox ("Le traitement est terminé")
     
    End Sub
    Fichiers attachés Fichiers attachés

  2. #2
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For I = 2 To 40 Step 1
    ref_deal = Worksheets("Feuil2").Cells(I, 14)
    Set MonDeal = Worksheets("Feuil1").Range("P2:P3000").Find(ref_deal, LookIn:=xlValues)
    If Not MonDeal Is Nothing Then Worksheets("Feuil2").Range("N2:N40").Find(ref_deal, LookIn:=xlValues).EntireRow.Delete 'j'aimerai supprimer la ligne correspondante que de la colonne A à N
    If I = 40 Then Exit For
    Next I
    Ton code devrait bien être réduit... Par contre il m'a l'air bien inutile aussi, si le refdeal est écrit plusieurs fois il ne sera supprimé qu'une fois

    Par contre tes autres boucles... font la même chose.. je ne comprends pas pouirquoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    On error resume next
    For I = 2 To 40
    Worksheets("Feuil1").Range("P2:P3000").Find(Worksheets("Feuil2").Cells(I, 14), LookIn:=xlValues).EntireRow.Delete
    Next I

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu
    bonjour
    puisque tu travaille sur des grands nombres de lignes tu devrais essayer de travailler avec des variables tableaux voir de dictionnaires
    a mediter

    un peu comme ceci
    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
     
    Sub tri()
        Dim tablofinal(3000, 16) 'un tablofinale prevu pour comporter 300ligne et 16 colonnes
        Dim tabloatrié, tablobase 'les deux tablo a comparer
        tablobase = Sheets("Feuil2").Range("n2:n40") 'les argument de comparaison seront dans ce tablo
        tabloatrié = Sheets("Feuil1").Range("a2:P3000") 'ce tablo represent la feuil1 sur 3000 ligne et 16 colonne
        For i = LBound(tablobase) To UBound(tablobase) 'on boucle sur les 40 lignes du tablobase
            For e = LBound(tabloatrié) To UBound(tabloatrié) 'on boucle sur les 3000 lignes du tabla a trier
                If tabloatrié(e, 16) <> tablobase(i) Then 'on compare chaque lignes du tablobase a a chaque ligne du tabloatrié en colonne 16
                    a = a + 1
                    For Z = 1 To 16
                        tablofinal(a, Z) = tabloatrié(e, Z) 'on retranscrit les données du tabloatrié dans le tablofinal si la colonne 16 ne corespond pas a l'index du tablobase
                    Next Z
                Next i
            Next e
    Sheets("Feuil1").Range("a2:p3000") = "" 'on efface tout sur le sheet feuil1 a partir de a2
    Sheets("Feuil1").Range("a2").Resize(3000, 16) = tablofinal ' on recalque les donnée du tablo final sur le sheets feuil1 sans les indesirables du tablode base
    End Sub

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Membre averti
    Inscrit en
    Août 2013
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2013
    Messages : 30
    Par défaut
    Bonjour,

    Merci pour vos réponses constructives.

    @patricktoulon
    Ton explication m'a permise de découvrir de nouvelle fonction ! je la garde sous la souris
    Cependant, je ne comprends pas tout et le traitement est un peu trop complexe par rapport à mon réel besoin...

    @EngueEngue

    Quelle est la différence entre : (+ rapide ? - d'octets ?...???)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    For I = 2 To 40 Step 1
    ref_deal = Worksheets("Feuil2").Cells(I, 14)
    Set MonDeal = Worksheets("Feuil1").Range("P2:P3000").Find(ref_deal, LookIn:=xlValues)
    If Not MonDeal Is Nothing Then Worksheets("Feuil2").Range("N2:N40").Find(ref_deal, LookIn:=xlValues).EntireRow.Delete 'j'aimerai supprimer la ligne correspondante que de la colonne A à N
    If I = 40 Then Exit For
    Next I
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    On error resume next
    For I = 2 To 40
    Worksheets("Feuil1").Range("P2:P3000").Find(Worksheets("Feuil2").Cells(I, 14), LookIn:=xlValues).EntireRow.Delete
    Next I

    Par contre tes autres boucles... font la même chose.. je ne comprends pas pouirquoi
    Avec la V1 du code (cf. premier poste) si "ref_deal" était trouvé, la ligne était supprimée ce qui faisait tout décaler de +1.

    Exemple:
    Pour I = 4
    - la "ref_deal" en N4 de "feuil2" est trouvée dans "feuil1"
    - La ligne entière de "feuil2" est supprimée
    ===> la "ref_deal" en N5 devient N4 !
    ======> je loupe donc une ligne !

    Pour remédier à cela j'ai juste fait une boucle en sens inverse :

    Par contre, j'aimerai que :

    If Not MonDeal Is Nothing Then Worksheets("Feuil2").Range("N2:N40").Find(ref_deal, LookIn:=xlValues).EntireRow.Delete

    ne supprime pas toute les colonnes de la ligne mais uniquement celles de A à N pour la ligne correspondante à "ref_deal"

    Pouvez-vous m'aider svp ?


    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 test_ctrl1()
     
    '**** declaration des variables ****
    Dim I As Integer
    Dim ref_deal As String
     
    Application.ScreenUpdating = False
     
    '**** scan et delete des references ****
    For I = 2 To 40 Step 1
    ref_deal = Worksheets("Feuil2").Cells(I, 14)
    Set MonDeal = Worksheets("Feuil1").Range("P2:P3000").Find(ref_deal, LookIn:=xlValues)
    If Not MonDeal Is Nothing Then Worksheets("Feuil2").Range("N2:N40").Find(ref_deal, LookIn:=xlValues).EntireRow.Delete 'supprimer la ligne correspondante que de la colonne A à N
    If I = 40 Then Exit For
    Next I
     
    Set MonDeal = Nothing
     
    For I = 40 To 2 Step -1
    ref_deal = Worksheets("Feuil2").Cells(I, 14)
    Set MonDeal = Worksheets("Feuil1").Range("P2:P3000").Find(ref_deal, LookIn:=xlValues)
    If Not MonDeal Is Nothing Then Worksheets("Feuil2").Range("N21:N2").Find(ref_deal, LookIn:=xlValues).EntireRow.Delete 'supprimer la ligne correspondante que de la colonne A à N
    If I = 2 Then Exit For
    Next I
     
    Set MonDeal = Nothing
     
    MsgBox ("Le traitement est terminé")
     
    End Sub

  5. #5
    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
    Une autre proposition.

    Le code met en colonne O la formule =NB.SI(Feuil1!$P$2:$P$xxx;$N2)
    Filtre cette colonne sur les valeurs <>0
    Supprime les lignes visibles
    Supprime le filtre automatique
    Efface le reste de la colonne O
    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
    Sub Test()
    Dim N As Long, M As Long
    Dim Lignes As Range
     
    Application.ScreenUpdating = False
    With Feuil1
        N = .Cells(.Rows.Count, "P").End(xlUp).Row
    End With
     
    With Feuil2
        .AutoFilterMode = False
        M = .Cells(.Rows.Count, "N").End(xlUp).Row
     
        With .Range("O1:O" & M)
            .Formula = "=COUNTIF(Feuil1!$P$2:$P$" & N & ",$N1)"
            .AutoFilter Field:=1, Criteria1:="<>0"
        End With
        With .AutoFilter.Range
            On Error Resume Next
            Set Lignes = .Offset(1, 0).Resize(.Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible).EntireRow 'On peut enlever le Resize si on la ligne après tes données est vide et peut être aussi supprimée
            On Error GoTo 0
        End With
        If Not Lignes Is Nothing Then Lignes.Delete
        .AutoFilterMode = False
        .Range("O1:O" & M).ClearContents
    End With
    End Sub

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    Par contre, j'aimerai que :

    If Not MonDeal Is Nothing Then Worksheets("Feuil2").Range("N2:N40").Find(ref_deal, LookIn:=xlValues).EntireRow.Delete

    ne supprime pas toute les colonnes de la ligne mais uniquement celles de A à N pour la ligne correspondante à "ref_deal"

    Pouvez-vous m'aider svp ?
    "EntireRow.Delete "supprime la ligne complete
    pour effacer rien que la plage A a N il te faut recupere l'index de ligne par le find
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not MonDeal Is Nothing Then range("a" & MonDeal.row &":N" & MonDeal.row).clear
    Au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

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

Discussions similaires

  1. Amélioration/Correction syntaxe macro
    Par daddygraffiti dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/08/2013, 22h06
  2. Recherche de l'aide pour améliorer une macro excel
    Par Yul80 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/09/2008, 10h21
  3. question amélioration d´une macro
    Par jager57 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/08/2008, 11h06
  4. améliorer une macro
    Par casavba dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/08/2007, 06h02
  5. Améliorer une macro
    Par Thomas69 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 30/05/2007, 22h33

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