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 :

Macro filtre copie erronée


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 46
    Points : 33
    Points
    33
    Par défaut Macro filtre copie erronée
    Bonjour Forum

    Je n'arrive pas à localiser l'erreur sur la macro suivante:


    Pourquoi les lettres autres que P, T, M, O sont prisent en considération
    Crdt

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 909
    Points
    55 909
    Billets dans le blog
    131
    Par défaut
    Bonjour

    C'est plus productif de placer le code de la macro sur le forum, plutôt que de placer ton fichier en pièce jointe.

    Il faudrait détailler ce que tu souhaites réaliser. Voici ta macro:
    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
    Sub copie()
    Dim plage As Range, cel As Range
    Dim dlg As Integer
    Set plage = Range("C2:C" & Range("C65536").End(xlUp).Row)
    For Each cel In plage
    Select Case cel.value
    Case Is = "T": course = "Trot"
    Case Is = "O": course = "Obstacle"
    Case Is = "P": course = "Plat"
    Case Is = "M": course = "Monte"
    End Select
    dlg = Worksheets(course).Range("A65536").End(xlUp).Row + 1
    Range(Cells(cel.Row, 1), Cells(cel.Row, 7)).Copy Worksheets(course).Range("A" & dlg)
    Next
    Sheets("Courses").Range("A2:G" & Range("A65536").End(xlUp).Row).ClearContents
    End Sub
    Je suppose que tu souhaites que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dlg = Worksheets(course).Range("A65536").End(xlUp).Row + 1
    Range(Cells(cel.Row, 1), Cells(cel.Row, 7)).Copy Worksheets(course).Range("A" & dlg)
    ne soit réalisé que pour les lettres T, O, P, M

    Dès lors, si c'est cela, tu peux utiliser 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
    19
    20
    Sub copie()
    Dim plage As Range, cel As Range
    Dim dlg As Integer
    Set plage = Range("C2:C" & Range("C65536").End(xlUp).Row)
    For Each cel In plage
    Select Case cel
        Case "T": course = "Trot"
        Case "O": course = "Obstacle"
        Case "P": course = "Plat"
        Case "M": course = "Monte"
        Case Else: course = ""
    End Select
    if course<>"" then
        dlg = Worksheets(course).Range("A65536").End(xlUp).Row + 1
        Range(Cells(cel.Row, 1), Cells(cel.Row, 7)).Copy
        Worksheets(course).Range("A" & dlg)
    end if
    Next
    Sheets("Courses").Range("A2:G" & Range("A65536").End(xlUp).Row).ClearContents
    End Sub
    Tu peux aussi te passer de is = dans le case, ce n'est pas nécessaire.

    Note que je n'ai pas vu la déclaration de Course. Si tu travailles sans la déclaration explicite de tes variables, tu devras affronter pas mal de problèmes de débogage un jour ou l'autre.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 46
    Points : 33
    Points
    33
    Par défaut
    Re
    Merci Pierre Fauconnier, mais ya un probleme,
    quand je clique sur sauver c'est la premiere ligne qui est simplement selectionnée! est un message d'erreur s'affiche:

    Erreur d'execution '438'
    Proprieté ou methode non gérée par cet objet
    Voir la ligne soulignée qui est en jaune en debogage:
    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
    Sub copie()
    Dim plage As Range, cel As Range
    Dim dlg As Integer
    Set plage = Range("C2:C" & Range("C65536").End(xlUp).Row)
    For Each cel In plage
    Select Case cel
        Case "T": course = "Trot"
        Case "O": course = "Obstacle"
        Case "P": course = "Plat"
        Case "M": course = "Monte"
        Case Else: course = ""
    End Select
    If course <> "" Then
        dlg = Worksheets(course).Range("A65536").End(xlUp).Row + 1
        Range(Cells(cel.Row, 1), Cells(cel.Row, 7)).Copy
        Worksheets(course).Range ("A" & dlg)
    End If
    Next
    Sheets("Course").Range("A2:G" & Range("A65536").End(xlUp).Row).ClearContents
    End Sub
    J'ai changé le nom de la feuille courses vers course
    Crdt

  4. #4
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 909
    Points
    55 909
    Billets dans le blog
    131
    Par défaut
    Désolé. Il y a un _ qui s'est perdu en route.

    Les bonnes lignes sont
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range(Cells(cel.Row, 1), Cells(cel.Row, 7)).Copy _
    Worksheets(Course).Range ("A" & dlg)
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 46
    Points : 33
    Points
    33
    Par défaut
    Re

    Merci Pierre

    C'est réglé le probleme, sauf que!
    Si je voulais que les lignes autres que PTMO ne disparaissent pas mais restent dans la feuille course?

    Possible?

  6. #6
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 909
    Points
    55 909
    Billets dans le blog
    131
    Par défaut
    Tu as une ligne avec ClearContents en dehors de la boucle. Il faudrait la placer à l'intérieur de For... Next, juste avant le Next et l'adapter pour qu'elle ne nettoie que les lignes qui contiennent T,O, P ou M...

    Attention que ClearContents vide les lignes, mais ne les supprime pas...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 46
    Points : 33
    Points
    33
    Par défaut
    Re forum

    Merci beaucoup pour ton aide, quoi que je suis faible en prog macro, et je doute pouvoir realiser cette derniere etape.

    Crdt

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 909
    Points
    55 909
    Billets dans le blog
    131
    Par défaut
    Réponds déjà à la question:

    Veux-tu vider les lignes ou veux-tu les supprimer?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 46
    Points : 33
    Points
    33
    Par défaut
    Re
    Les lignes vides je les suprime definitivement,
    les lignes qui reste je les garde "autre que P,T,M,O"
    Crdt,

  10. #10
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 909
    Points
    55 909
    Billets dans le blog
    131
    Par défaut
    Il suffit alors de supprimer les lignes qui sont copiées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If course <> "" Then
    dlg = Worksheets(course).Range("A65536").End(xlUp).Row + 1
    Range(Cells(cel.Row, 1), Cells(cel.Row, 7)).Copy _
    Worksheets(course).Range ("A" & dlg)
    cell.entirerow.delete
    End If
    Mais tu dois alors commencer par le bas de ton tableau et modifier un peu ta boucle, puisque tu supprimes des lignes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dim DerniereLigne as long, i as long
     
    Ligne = Range("C65536").End(xlUp).Row
    for i = derniereligne to 2 step -1
        ...
        ...
    next i
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #11
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 46
    Points : 33
    Points
    33
    Par défaut
    Re

    Merci beaucoup pierre,
    Pardon ya encors une erreur !

    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
    Sub copie()
    Dim plage As Range, cel As Range
    Dim dlg As Integer
    Set plage = Range("C2:C" & Range("C65536").End(xlUp).Row)
    For Each cel In plage
    Select Case cel
    Case "T": course = "Trot"
    Case "O": course = "Obstacle"
    Case "P": course = "Plat"
    Case "M": course = "Monte"
    Case Else: course = ""
    End Select
    If course <> "" Then
    dlg = Worksheets(course).Range("A65536").End(xlUp).Row + 1
    Range(Cells(cel.Row, 1), Cells(cel.Row, 7)).Copy _
    Worksheets(course).Range("A" & dlg)
    Cells.EntireRow.Delete
    End If
    Next
    Sheets("Course").Range("A2:G" & Range("A65536").End(xlUp).Row).ClearContents
    Dim DerniereLigne As Long, i As Long
     
    Ligne = Range("C65536").End(xlUp).Row
    For i = DerniereLigne To 2 Step -1
        ...
        ...
    Next i
    End Sub
    Crdt

  12. #12
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 46
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    Je crois qu'il me faut dabord apprendre c'est quoi une boucle pour reparer la macro!

    Crdt

  13. #13
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 46
    Points : 33
    Points
    33
    Par défaut
    Bonjour Forum,
    Je revien pour presenter la solutation adequate :

    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
    Sub copie() 
    Dim plage As Range, cel As Range 
    Dim dlg As Integer, course 
    Set plage = Range("C2:C" & Range("C65536").End(xlUp).Row) 
     
    For Each cel In plage 
        Select Case cel 
            Case Is = "T": course = "Trot" 
            Case Is = "O": course = "Obstacle" 
            Case Is = "P": course = "Plat" 
            Case Is = "M": course = "Monte" 
        End Select 
            If course <> 0 Then 
                dlg = Worksheets(course).Range("A65536").End(xlUp).Row + 1 
                Range(Cells(cel.Row, 1), Cells(cel.Row, 7)).Copy Worksheets(course).Range("A" & dlg) 
                cel.EntireRow.ClearContents 
            End If 
        course = 0 
    Next 
    End Sub
    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
    Sub copie() 
    Dim i As Integer, lg As Integer, dlg As Integer 
    Dim Ok As Boolean 
    lig = Range("C65536").End(xlUp).Row 
    For i = lig To 2 Step -1 
    Ok = 1 
    Select Case Range("C" & i) 
    Case Is = "T": course = "Trot" 
    Case Is = "O": course = "Obstacle" 
    Case Is = "P": course = "Plat" 
    Case Is = "M": course = "Monte" 
    Case Else: Ok = 0 
    End Select 
    If Ok <> 0 Then 
    dlg = Worksheets(course).Range("A65536").End(xlUp).Row + 1 
    Range(Cells(i, 1), Cells(i, 7)).Copy Worksheets(course).Range("A" & dlg) 
    Range(Cells(i, 1), Cells(i, 7)).Delete Shift:=xlUp 
    End If 
    Next 
    End Sub
    Crdt

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

Discussions similaires

  1. [XL-2010] Macro filtres successifs d'un TCD selon une plage de cellules, +copy-paste
    Par Faust13 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/08/2017, 20h42
  2. Macro qui copie une page et la modifie
    Par craac dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/10/2007, 10h14
  3. macro filtre auto
    Par Jojonini dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 06/09/2007, 11h43
  4. Liaison ou macros de copie-mise en page, il faut choisir
    Par dilejeu dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/06/2007, 11h50
  5. Macro de copie de céllules
    Par Zotto dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/04/2007, 14h51

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