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 :

Déplacer une ligne dans une autre feuille en fonction de deux critères


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Déplacer une ligne dans une autre feuille en fonction de deux critères
    Bonjour, j'ai presque trouvé mon bonheur dans ce forum.
    une macro qui me permet en fonction d un critere ("1 avant") dans la colonne A de la feuil 1 de filtrer puis deplacer dans la feuil2.
    J'aimerais rajouté un critere ("annulée" ou "cloturée") dans la colonne B de la feuil1
    (j'ai beau passer par l'enregistreur de macro pour trouver une solution je ne trouve pas)

    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
    Sub Transfert()
    Dim LastLig As Long
    Dim cDest As Range
     
    Application.ScreenUpdating = False
    With ThisWorkbook
        'cDest: La celllule de destination: première cellule vide de la colonne A de Feuil2
        With .Worksheets("Feuil2")
            Set cDest = .Cells(.Rows.Count, "A").End(xlUp)(2)
        End With
        With .Worksheets("Feuil1")
            'Enlève l'éventuel filtre automatique
            .AutoFilterMode = False
            'LastLig, ligne de la dernière cellule remplie de colonne A de Feuil1
            LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
            'On fait un filtre automatique sur la colonne A de Feuil1 avec comme critère "1 avant"
            .Range("A5:A" & LastLig).AutoFilter Field:=1, Criteria1:="1 avant"
     
            'Si au moins une ligne résultat du filtre (en plus de la ligne 1 des titres)
            If .Range("A5:A" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then
                With .Range("A5:A" & LastLig).SpecialCells(xlCellTypeVisible).EntireRow
                    'On copie toutes les lignes visibles vers cDest (sauf la ligne des titres)
                    .Copy cDest
                    'on supprime toutes les lignes visibles (sauf la ligne des titres)
                    .Delete
                End With
            End If
            'on vide notre variable cDest
            Set cDest = Nothing
            'On enlève le filtre automatique
            .AutoFilterMode = False
        End With
    End With
    End Sub
    merci de votre aide

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 125
    Points : 9 953
    Points
    9 953
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    voici pour filtrer dans ta colonne A les cellules répondant à ces trois chaines de caractère
    je n'ai pas testé, dis moi si c'est ok

    L'idée est de regrouper l'ensemble de tes chaines de caractère dans un array, et d'appliquer le tri sur les valeurs de ce array
    Ainsi, tu peux facilement modifier la liste de tes chaines (ajouts/suppression/modification) en changeant la ligne 9 du code ci-dessous


    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
     
    Sub Transfert()
    Dim LastLig As Long
    Dim cDest As Range
    Dim ListeFiltre() As String
     
    Application.ScreenUpdating = False
     
    ListeFiltre = Array("annulée","cloturée", "1 avant")
     
    With ThisWorkbook
        'cDest: La celllule de destination: première cellule vide de la colonne A de Feuil2
        With .Worksheets("Feuil2")
            Set cDest = .Cells(.Rows.Count, "A").End(xlUp)(2)
        End With
        With .Worksheets("Feuil1")
            'Enlève l'éventuel filtre automatique
            .AutoFilterMode = False
            'LastLig, ligne de la dernière cellule remplie de colonne A de Feuil1
            LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
            'On fait un filtre automatique sur la colonne A de Feuil1 avec comme critère "1 avant"
            .Range("A5:A" & LastLig).AutoFilter Field:=1, Criteria1:=ListeFiltre, Operator:=xlFilterValues
     
            'Si au moins une ligne résultat du filtre (en plus de la ligne 1 des titres)
            If .Range("A5:A" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then
                With .Range("A5:A" & LastLig).SpecialCells(xlCellTypeVisible).EntireRow
                    'On copie toutes les lignes visibles vers cDest (sauf la ligne des titres)
                    .Copy cDest
                    'on supprime toutes les lignes visibles (sauf la ligne des titres)
                    .Delete
                End With
            End If
            'on vide notre variable cDest
            Set cDest = Nothing
            'On enlève le filtre automatique
            .AutoFilterMode = False
        End With
    End With
    End Sub

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 922
    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 : 12 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Une autre solution avec la méthode AdvancedFilter (Filtre avancé) d'après moi plus simple à gérer pour exporter des données et offre bien plus d'avantages
    Exemple pour un filtre sur la colonne G ayant comme critères "Juridique" et "Ventes"
    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
    Sub ExportByAdvancedFilter_Exemple_2()
     ' Procédure utilisant comme zone des critères de la plage de cellules
     '   située à partir de la 2ème colonne qui suit la plage des données
     Dim rngSource As Range, rngCriteria As Range, rngTarget As Range
     Dim myFormula As String ' Variable contenant la formule
     myFormula = "=OR(G2=""Juridique"",G2=""Ventes"")"
     With ThisWorkbook
      Set rngSource = .Worksheets("Data").Range("A1").CurrentRegion
      Set rngTarget = .Worksheets("Export").Range("A1")
     End With
     With rngSource
      Set rngCriteria = .Offset(columnOffset:=.Columns.Count + 1).Resize(2, 1)
     End With
     ' Ecriture dans la zone de critère
     rngCriteria(1) = "_fn_": rngCriteria(2).Formula = myFormula
     ' Suppression des cellules de la feuille cible
     rngTarget.Worksheet.Cells.Clear
     ' Exportation suivant les critères
     rngSource.AdvancedFilter xlFilterCopy, rngCriteria, rngTarget
     ' Efface la zone des critères
     rngCriteria.Clear
     ' Suppresion des références aux variables objets
     Set rngSource = Nothing: Set rngCriteria = Nothing: Set rngTarget = Nothing
    End Sub
    Comment traduire une formule excel pour l'insérer dans du code VBA voir Ecrire une formule dans Excel à l'aide d'une procédure VBA
    Lire éventuellement Les filtres avancés ou élaborés dans Excel

  4. #4
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Excusez moi je viens de voir que dans l'enoncé il manquait le numero de colonne (B) pour les seconds critères

  5. #5
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 125
    Points : 9 953
    Points
    9 953
    Billets dans le blog
    5
    Par défaut
    Dans ce cas, et si tu ne passes pas par la méthode de Philippe et souhaite conserver la tienne

    tu repars de ton code et tu ajoutes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .Range("A5:A" & LastLig).AutoFilter Field:=2, Criteria1:="annulée", Operator:=xlOr, Criteria2:="cloturée"
    en dessous de ton premier filtrage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .Range("A5:A" & LastLig).AutoFilter Field:=1, Criteria1:="1 avant"

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 922
    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 : 12 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Et pour le cas où tu souhaiterais passer par le filtre élaboré, il faut simplement modifier la valeur de la variable myFormula
    Exemple pour une exportation des lignes dont les enregistrements de la colonne D sont égal à "F" et ceux de la colonne G sont égal à "Juridique" ou "Ventes"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myFormula = "=AND(D2=""F"",OR(G2=""Juridique"",G2=""Ventes""))"

  7. #7
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Re
    j ai essayé d integrer l idée de Joel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A5:A" & LastLig).AutoFilter Field:=2, Criteria1:="annulée", Operator:=xlOr, Criteria2:="cloturée"
    mais ca n a pas marché...
    Philippe tu peux me passer ton fichier stp ?

  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
    12 922
    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 : 12 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Philippe tu peux me passer ton fichier stp ?
    Si tu as été sur le lien que je t'ai donné, il y a un classeur qui illustre le tutoriel.
    Dans la procédure que j'ai affichée et qui est je pense suffisamment structurée, il y a trois valeurs à modifier.
    Ligne 6 la formule, ligne 8 le nom de la feuille source, ligne 9 le nom de la feuille cible et cela fonctionnera tout seul.
    Attention que chez moi, toutes les feuilles commencent à la cellule A1 avec comme première ligne les étiquettes de colonnes et bien entendu il ne peut y avoir aucune cellules fusionnées.
    Si ta liste commence en A5 et que la ligne 5 contient les étiquettes de colonnes (et qu'il n'y a pas de cellules remplies au-dessus) il y a lieu de modifier en ligne 8 de la procédure A1 par A5
    Pour la formule dans ton cas, il faudra donc faire référence à la ligne 6 (première ligne des données)
    La formule en Excel est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =ET(B6="1 avant";OU(A6="annulée";A6="cloturée"))
    et traduit pour la procédure VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =AND(B6="1 avant",OR(A6="annulée",A6="cloturée"))
    Soit ligne 6 de la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myFormula = "=AND(B6=""1 avant"",OR(A6=""annulée"",A6=""cloturée""))"
    Si cela ne correspond pas à tes attentes, je te conseille de faire un premier test manuellement après avoir lu le tutoriel.

    [EDIT]
    j ai essayé d integrer l idée de Joel
    mais ca n a pas marché...
    "Cela n'a pas marché" ne veut rien dire.
    As-tu eu une erreur du programme, dans ce cas là quel n° d'erreur, quel message et à quelle ligne ?
    ou bien l'exportation n'a pas eu lieu.

    Il est important d'être explicite dans tes explications

Discussions similaires

  1. copié une ligne d'une table dans une autre
    Par Invité dans le forum Requêtes
    Réponses: 1
    Dernier message: 21/11/2009, 20h48
  2. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  3. [E-00] Syntaxe pour insérer une ligne ou une colonne dans une feuille
    Par Benjycool dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/02/2009, 09h27
  4. [MySQL] inserer une ligne d'une table dans une autre table
    Par piero53 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 14/12/2008, 18h29
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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