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 :

Couper/coller (Feuil1>Feuil2) sous condition


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Technicien réseau
    Inscrit en
    Juillet 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 18
    Par défaut Couper/coller (Feuil1>Feuil2) sous condition
    Coucou à tous,

    J’écume les forums VBA et mes pdf depuis un bon moment pour trouver mon bonheur, mais je reste bredouille.

    Je souhaiterais mettre en place une sous procédure à ma macro qui :
    - analyserait tous les champs de ma colonne 53 (onglet 1) à la recherche des valeurs différentes de 202.
    - Couperait les lignes complètes dont la valeur de la colonne 53 aurait répondu <> 202
    - Et enfin collerait ces lignes dans l’onglet 2 de ce même classeur.

    A noter: Les 2 onglets ont exactement la même structure, intitulé, etc, ...

    J’ai trouvé quelque script ça et la mais aucun ne tournait. Je suis loin d’avoir le bagage, mais je crains que le fait de « couper » pour envoyer en onglet 2 génère des lignes vide dans l’onglet 1 (et je ne sais comment l’éviter).

    Voilà, J’espère ne pas avoir été trop avare en renseignement, si je viens à vous c'est véritablement parce que je piétine.

    A vot’ bon cœur et merci ,
    Sophie

  2. #2
    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 176
    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 176
    Billets dans le blog
    53
    Par défaut
    Bonsoir,
    Petit exemple à adapter

    Ici les deux bases de données sont considérées comme commençant à A1
    Le nom des 2 constantes sont à changer ainsi que le test de la ligne 16 mis 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
    Option Explicit
    Const shtFromName As String = "db"
    Const shtToName As String = "Feuil2"
    Sub Test()
     Dim shtFrom As Worksheet, shtTo As Worksheet
     Dim rowFrom As Long, rowTo As Long, lastRow As Long
     With ThisWorkbook
      Set shtFrom = Worksheets(shtFromName)
      Set shtTo = Worksheets(shtToName)
     End With
     lastRow = shtFrom.Range("A1").CurrentRegion.Rows.Count
     rowTo = 2
     With shtFrom
      .Rows(1).Copy shtTo.Rows(1) ' Copie de la première ligne
      For rowFrom = lastRow To 2 Step -1
       If .Cells(rowFrom, 5) > 35 Then
        .Rows(rowFrom).Copy shtTo.Rows(rowTo): rowTo = rowTo + 1
        .Rows(rowFrom).Delete Shift:=xlUp
       End If
      Next
     End With
    End Sub
    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

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 107
    Par défaut
    Essaies de te baser sur quelque chose comme ça

    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
    Sub Test()
     
        Dim Ws As Worksheet
        Dim Wt As Worksheet
        Dim i As Long
     
        Set Ws = ThisWorkbook.Worksheets("Feuil1")
        Set Wt = ThisWorkbook.Worksheets("Feuil2")
     
        With Ws
            For i = .Cells(.Rows.Count, 1).End(xlUp).Row To 2 Step -1 ' On commence par la fin, cela permet de supprimer des lignes sans poser de problème dans la boucle.
                If .Cells(i,53).value <> 202 Then 'Si la valeur de la cellule est différente de 202
                    .Rows(i).EntireRow.Copy Destination:=Wt.Cells(Wt.Cells(.Rows.Count, 1).End(xlUp).Row + 1, 1)
                    'On copie toute la ligne en dessous de la dernière ligne non vide de la feuille 2
                    .Rows(i).Delete
                    'Puis on supprime la ligne
                End If
            Next i
        End With
     
     
    End Sub

  4. #4
    Membre averti
    Profil pro
    Technicien réseau
    Inscrit en
    Juillet 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 18
    Par défaut
    Oh chouette ! Merci à vous deux pour votre sollicitude

    Je test les 2 scripts sur une mini base de quelques lignes, colonnes. J'ai quelques questions, parce qu'il se passe des trucs mais pas comme ça devrait.

    J'ai repris le code de AlphaScorpi (parce que j'ai plus de difficulté de compréhension sur celui de Corona que je remercie au passage cela dit), et l'exclusion des valeurs <> 202 vers l'onglet 2 fonctionne impeccablement bien. Par contre la ligne titre est passé aussi en onglet 2 et sous les données (qui sont sans dessus dessous).
    J'ai joins le fichier avec le code associé pour que les choses soient plus concrètes.

    J'ai des difficultés à comprendre certains points sur lesquels j'aimerais avoir (si c'est possible évidement ) un éclairage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = .Cells(.Rows.Count, 1).End(xlUp).Row To 2 Step -1
    La boucle par en choisissant la cellule le plus en bas sur la première colonne Cells(.Rows.Count, 1). Puis la sélection remonte en haut de la colonne End(xlUp), j'ai donc une plage de cellule constituée de toute la première colonne avec des cellules non vide uniquement) ... puis là, "point.row" .. je suis perdue.
    J'ai bien compris le To 2 Step -1, pour dire d'aller du bas vers le haut quand il boucle par contre.

    Ou plutôt, est ce que le For i = à prendre comme un mouvement de remontée, depuis la dernière cellule au bas en remontant vers le haut pour chaque "i" ?

    Humm... c'est confus, je vous l'acorde.

    En tout cas un gros et grand merci à vous
    Sophie.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 107
    Par défaut
    Ce code est adapté à ta Demo

    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 Test()
     
        Dim Ws As Worksheet
        Dim Wt As Worksheet
        Dim i As Long
        Dim LigneEnTete As Long
     
        Set Ws = ThisWorkbook.Worksheets("Feuil1")
        Set Wt = ThisWorkbook.Worksheets("Feuil2")
        LigneEnTete = 4 ' On precise sur quelle ligne est l'en-tete
     
        With Ws
            For i = .Cells(.Rows.Count, 1).End(xlUp).Row To LigneEnTete + 1 Step -1 ' On commence par la fin jusque sous la ligne d'en-tete, cela permet de supprimer des lignes sans poser de problème dans la boucle.
                If .Cells(i, 4).Value <> 202 Then 'Si la valeur de la cellule est différente de 202
                    .Rows(i).EntireRow.Copy Destination:=Wt.Cells(Wt.Cells(.Rows.Count, 1).End(xlUp).Row + 1, 1)
                    'On copie toute la ligne en dessous de la dernière ligne non vide de la feuille 2
                    .Rows(i).Delete
                    'Puis on supprime la ligne
                End If
            Next i
        End With
     
     
    End Sub

    Pour ce qui est de cette instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     For i = .Cells(.Rows.Count, 1).End(xlUp).Row To LigneEnTete + 1 Step -1


    - On compte le nombre de ligne de la feuille



    - On se place sur la derniere ligne de la feuille, colonne 1



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(.Rows.Count, 1).End(xlUp)
    - Puis on remonte jusque la première cellule non vide colonne 1



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(.Rows.Count, 1).End(xlUp).Row
    - Et enfin on identifie la ligne de cette cellule




    Donc si l’en-tête de ton tableau est ligne 8.
    Que la dernière cellule non vide colonne 1 est en ligne 78

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = .Cells(.Rows.Count, 1).End(xlUp).Row To LigneEnTete + 1 Step -1
    Va correspondre à "Effectuer la boucle pour toutes les valeurs de i entre 78 et 8+1 en retirant 1 a la valeur de i à chaque boucle"

  6. #6
    Membre averti
    Profil pro
    Technicien réseau
    Inscrit en
    Juillet 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 18
    Par défaut
    C'est remarquable ! Le code est efficace, et les explications qui vont avec me permettent de réellement comprendre la procédure.
    Merci mille fois
    Sophie

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 26/04/2014, 17h00
  2. Copier/coller dans plusieurs feuilles sous condition
    Par lilou86 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 16/11/2009, 12h18
  3. copier/coller lignes sous condition colonne vers autre feuille
    Par juniorglobal08 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 21/05/2009, 17h29
  4. [XL-2003] Copier coller une ligne sous condition
    Par geraldferri dans le forum Excel
    Réponses: 12
    Dernier message: 21/04/2009, 11h17
  5. [VBA-E] Copier coller sous conditions de couleur
    Par titeZ dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 10/04/2007, 18h27

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