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 :

copier/ coller ligne selon condition à l'aide variable


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    educateur technique
    Inscrit en
    Novembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : educateur technique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut copier/ coller ligne selon condition à l'aide variable
    Bonjour a tous

    Tout d'abord, merci pour les informations et les conseils qui figurent sur ce site. Je les ai beaucoup parcourus depuis 1 mois. Je suis en train d'essayer d'élaborer des macros Excel, non sans mal!!

    Alors, j'ai retourné mon problème de différentes façons, au fur et à mesure de mes découvertes et j'ai abouti à une macro qui ne fonctionne pas pour l'instant.

    Avant de vous exposer mon problème, je précise que je viens chercher ici un soutien et des explications me permettant de comprendre mes erreurs. Le but étant de continuer à progresser.

    Voilà mon problème :
    je souhaite copier les lignes de l'ensemble des feuilles d'un classeur (sauf la première feuille nommer «*en cours*») et les insérer dans celle-ci.
    La copie de ces lignes se fait si une date indiquée dans colonne «*G*» est comprise entre deux valeurs stockées dans les cellules E2(j-8) et E3(j+30).
    Le collage se fait dans la première ligne vide dans la feuille «*en cours*» .
    De plus, je souhaite réaliser cela à l'aide de variables. C'est ce qui semble être le plus indiqué pour progresser en programmation et aussi pour ne pas surcharger le presse papier du PC.

    Merci de vos commentaires et remarques

    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 oct_28()
     
    Dim commande_client_2013 As Workbook
    Dim limite_inf As Date
    Dim limite_sup As Date
    Dim EN_COURS As Worksheet
    Dim lN_SOURCE As Range
    Dim LN_CIBLE As Range
     
    Dim sht As Worksheet
     
      limite_inf = Range("E3").Value
      limite_sup = Range("E2").Value
     
        Nblignes = 25000
        For i = 1 To Nblignes
     
     For Each sht In Worksheets
     
      If sht.Name <> "EN_COURS" And Cells(i, 7).Value > limite_inf And Cells(i, 7).Value < limite_sup Then
     
     Cells(i, 7).EntireRow = lN_SOURCE
     
     
    Set LN_CIBLE = Worksheets("en cours").Cells(1, 1).CurrentRegion.SpecialCells(xlCellTypeLastCell).Offset(1).EntireRow
     
    LN_CIBLE.Value = lN_SOURCE.Value
     
      End If
     
     Next sht
     
       Next i
     
    End Sub


    De nouveau merci

  2. #2
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour Yann, bonjour le forum,

    Remarques :
    • Tu boucles d'abord sur les lignes puis sur les onglets. C'est étrange mais pourquoi pas... Cela veut dire que tu vérifies la ligne 1 de tous les onglets, puis la ligne 2 de tous les onglets, etc. Il me semble plus logique de vérifier toutes les lignes de l'onglet 1, puis toutes les lignes de l'onglet 2, etc.
    • l'erreur la plus grave vient du fait que tu n'indiques pas l'onglet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For Each sht In Worksheets
    If sht.Name <> "EN_COURS" And Cells(I, 7).Value > limite_inf And Cells(I, 7).Value < limite_sup Then
    devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For Each sht In Worksheets
    If sht.Name <> "EN_COURS" And sht.Cells(I, 7).Value > limite_inf And sht.Cells(I, 7).Value < limite_sup Then
    • tu déclares lN_SOURCE de type Range, il te faut la définir avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set lN_SOURCE = Cells(I, 7).EntireRow
    plutôt que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(I, 7).EntireRow = lN_SOURC

    Je te propose une méthode beaucoup plus rapide qui utilise un tableau plutôt des plages de cellules
    :
    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
    Sub Macro1()
    Dim EC As Object 'déclare la variable EC (onglet En Cours)
    Dim LI As Date 'déclare la variable LI (Limite Inférieure)
    Dim LS As Date 'déclare la variable LS (Limite Supérieure)
    Dim O As Object 'déclare la variable O (Onglets)
    Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
    Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
    Dim J As Integer 'déclare la variable J (incrément)
     
    Set EC = Sheets("EN COURS") 'définit l'onglet EC
    LI = EC.Range("E3").Value 'définit la limite inférieure LI
    LS = EC.Range("E2").Value 'définit la limite supérieure LS
    For Each O In Sheets 'boucle 1 : sur tous les onglets du classeur
        If Not O.Name = EC.Name Then 'condition 1 : si l'onglet n'est pas l'onglet "EN COURS"
            'définit la dernière ligne éditée DL de la colonne 1 (=A) de l'onglet O
            DL = O.Cells(Application.Rows.Count, 1).End(xlUp).Row
            TC = O.Range("A1").CurrentRegion 'définit le tableau de cellules TC
            For I = 1 To UBound(TC, 1) 'boucle 2 : sur toutes les lignes du tableau TC
                'condition 2 : si la valeur en colonne 7 de TC est comprise entre les limites
                If TC(I, 7) > LI And TC(I, 7) < LS Then
                    'définit la cellule de destination DEST
                    Set DEST = EC.Cells(EC.Range("A1").CurrentRegion.SpecialCells(xlCellTypeLastCell).Row + 1, 1)
                    For J = 1 To UBound(TC, 2) 'boucle 3 : sur toutes les colonnes du taleau TC
                        'récupère la valeur ligne I colonne J du tableau dans DEST décalée de J-1 colonnes à droite
                        DEST.Offset(0, J - 1).Value = TC(I, J)
                    Next J 'prochaine colonne de la boucle 3
                End If 'fin de la condition 2
            Next I 'prochaine ligne de la boucle 2
        End If 'fin de la condition 1
    Next O 'prochain onglet de la boucle 1
    End Sub
    À plus,

    Thauthème

    Je suis Charlie

  3. #3
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    Bonjour, bonjour !

    Pour tout Copier / Coller d'une feuille vers une autre sous condition,
    que ce soit en manuel ou par code, ne pas oublier le filtre avancé !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  4. #4
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour le fil, bonjour le forum,

    Oui Marc, c'est exact, mais il faut que les données aient une première ligne contenant les étiquettes. Ce qui ne semble pas être le cas de Yann car, au vu de son code initial, il commence à la ligne 1 et pas la 2...
    À plus,

    Thauthème

    Je suis Charlie

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    educateur technique
    Inscrit en
    Novembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : educateur technique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Réponse à Thautheme
    Bonjour a tous , bonjour Thautheme

    Tout d'abord pardon de reprendre le fil de cette discussion avec beaucoup de retard à cause d’événements perso . Je ne m'étends pas plus sur ce sujet.

    En tout cas un grand merci pour vos réponses. J'ai pris le temps d'apporter les corrections à mon code ce qui permet de le faire fonctionner.
    Le problème est que les lignes sont collées à partir de la ligne 25000. Il y a forcément un lien avec ma variable" i nbre de ligne" que je n'ai pas réussi à contourner.

    le deuxième petit souci est que mes lignes collées ne conservent pas les couleurs, format,... de la ligne qui est copié dans la feuille "en cours".
    Si vous pouviez m'aiguiller de nouveau ce serait vraiment sympa. Surtout s'il y a des commentaires sur ma syntaxe et la construction de mon code. Je suis preneur et je veux continuer à progresser.

    Concernant le programme clef en main... là j'avoue ne pas tout maîtriser mais j'ai compris (non sans mal!!!) la construction et le code.
    Mais il ne fonctionne pas. Il y a une erreur à la ligne 20 "For I...

    Dans l'attente de vous lire

    Merci

    yann

Discussions similaires

  1. Couper coller une ligne selon condition
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 03/05/2019, 08h50
  2. [XL-2003] Copier une colonne en ligne selon condition
    Par ballix22 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/03/2013, 14h30
  3. copier des lignes selon deux conditions
    Par ghatfan99 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 06/10/2011, 10h58
  4. 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
  5. copier des lignes selon condition
    Par malek1913 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/02/2008, 16h45

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