Macro copie de lignes/colonnes (débutant)

Bonjour à tous,

Je débute tout juste en macro donc je ne maîtrise pas du tout.

Je souhaiterais pouvoir copier un ensemble de lignes et colonnes quand une condition est respectée.

Je m'explique (et joins un fichier pour que ce soit plus simple) : j'ai des durées de plateau et je voudrais que si ma durée de plateau est inférieure à 8min alors je regroupe mes lignes. Il faudrait alors dans cette condition que ca me copie la première ligne et la dernière ligne d'un regroupement de plateau.

Je ne sais pas si c'est très clair donc je mets dans la deuxième feuille le résultat que j'attends.

Merci d'avance pour votre aide !

Marjow54

Bonjour Marjow, bonjour le forum,

Pas de pièce jointe !... Difficile de t'aider.

Quand on a pas de tête ... ^^

Re,

Arf ! C'est pire... Je n'arrive pas à faire le lien entre l'énoncé de ton problème et le résultat dans l'onglet Feuil2. Si tu veux les lignes inférieures à 8 minute (soit 480 s) ce n'est pas cohérent de retrouvé 1161, 1306... Il faudrait alors dans cette condition que ca me copie la première ligne et la dernière ligne d'un regroupement de plateau. Peux-tu être plus explicite !...

Re,

Merci de ta réponse.

Je veux que si la durée est inférieure à 8min alors c'est considéré comme le même plateau donc cette/ces ligne/s disparaît/ssent.

Le but final est de travaillé sur les poids de plateau. Donc comme je vais vouloir l'évolution du poids, il me faut le poids au plateau 1 et au plateau suivant. Puis 8min ou plus de pause. Puis de nouveau des fusions de plateau inférieurs à 8min.

Je ne sais pas si c'est mieux ?

MArjow54

Re,

Non c'est pas mieux... Si ton fichier exemple est correct (Feuil1 ce que tu as, Feuil2 ce que tu voudrais après macro), Je passe la main car je ne comprends pas...

Re,

En effet il y a une ligne en train dans la feuille 2, il faut supprimer la ligne 4 (durée 82sec). Donc au final je n'aurai que des durées de plateaux supérieures à 8min car toutes les petites durées auront été "fusionnées" (sauf la toute première ligne car c'est le point de départ).

Re,

Toujours pas clair pour moi mais essaie ça :

Sub Macro1()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim PL As Range 'déclare la variable PL (PLage)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim I As Integer 'déclare la variable I (Incrément)

Set OS = Worksheets("Feuil1") 'définit l'onglet source OS
Set OD = Worksheets("Feuil2") 'définit l'onglet destination OD
Set PL = OS.Range("A1").CurrentRegion 'définit la plage PL
PL.Copy OD.Range("A1") 'cipie la plage PL et la colle dans la cellule A1 de l'onglet destination OD
DL = OD.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée de la colonne A de l'onglet OD
For I = DL To 3 Step -1 'boucle inversée de la derenière ligne éditée à la ligne 3 en remontant
    If OD.Cells(I, "G").Value < 480 Then OD.Rows(I).Delete 'si la cellule en colonne G de la ligne I de la boucle est ingérieure a 480, supprime la ligne I
Next I 'prochaine ligne de la boucle
End Sub

Merci pour ta réponse mais ca ne marche pas.

Après avoir mis un peu de cervelle, une autre solution serait de dire que si dans ma colonne j'ai "mmplateau" alors je supprime la ligne, si c'est vide (mais contenant tout de même la formule =si), alors je ne supprime pas.

C'est faisable ?

Marjow54

Re,

J'ai gardé la première idée et adapté. Est-ce que ça va ?

Sub Macro1()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim PL As Range 'déclare la variable PL (PLage)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim I As Integer 'déclare la variable I (Incrément)

Set OS = Worksheets("Feuil1") 'définit l'onglet source OS
Set OD = Worksheets("Feuil2") 'définit l'onglet destination OD
Set PL = OS.Range("A1").CurrentRegion 'définit la plage PL
PL.Copy OD.Range("A1") 'copie la plage PL et la colle dans la cellule A1 de l'onglet destination OD
OD.Columns("H:H").Delete
DL = OD.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée de la colonne A de l'onglet OD
For I = DL To 2 Step -1 'boucle inversée de la derenière ligne éditée à la ligne 3 en remontant
    If OD.Cells(I, "G").Value < 480 Then OD.Rows(I).Delete 'si la cellule en colonne G de la ligne I de la boucle est ingérieure a 480, supprime la ligne I
Next I 'prochaine ligne de la boucle
End Sub

Merci,

Ca me dit "dépassement de capacité".... A quoi ca correspond ?

Bonjour,

Essaie en remplaçant cette partie :

Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim I As Integer 'déclare la variable I (Incrément)

Par celle-ci :

Dim DL As Long 'déclare la variable DL (Dernière Ligne)
Dim I As Long 'déclare la variable I (Incrément)

Gracias Pedro !

Merci,

Ca fait 10min que je l'ai lancé et ca ne fait rien à part écrire exécution en cours. C'est normal que ce soit si long (jai 93472lignes), ou c'est un plantage ?

Re,

Tu aurais dû préciser ça avant. Oui, cette méthode est extrêmement lente...

Comme dit dans le premier message je débute totalement en macro, donc normal que je ne sache pas quelles informations sont à préciser Mais du coup, est-ce que la méthode de simple suppression de ligne serait plus rapide ? Et si oui, comme la faire ?

Merci

Re,

Essaie ça :

Sub Macro1()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Long 'déclare la variable I (Incrément)
Dim LI As Long 'déclare la variable LI (LIgne)

Set OS = Worksheets("Feuil1") 'définit l'onglet source OS
Set OD = Worksheets("Feuil2") 'définit l'onglet destination OD
TV = OS.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
OD.Range("A1").Resize(1, 7).Value = Application.Index(TV, 1) 'renvoie dans A1 redimensionnée la première ligne du tableau des valeurs TV
LI = 2 'initialise la variable LI
For I = 2 To UBound(TV, 1) 'boucle sur toutes les ligne I du tableau des valeurs TV
    'si la valeur de la donnée ligne I colonne 7 (=> colonne G) est supérieure à 480, renvoie dans la cellule ligne LI, colonne 1 la ligne I du tableau des valeurs TV
    If CDbl(TV(I, 7)) > 480 Then OD.Cells(LI, 1).Resize(1, 7) = Application.Index(TV, I): LI = LI + 1
Next I 'prochaine ligne de la boucle
End Sub

Ca me renvoit incompatibilité de type...

Ca me renvoit incompatibilité de type...

Prends l'habitude de donner les éléments liés à l'erreur... Généralement, tu as la ligne de code qui pose problème surlignée en rouge. Aussi, un fichier représentatif de l'original faciliterai beaucoup le travail !!

D'accord,

La ligne surlignée est celle-ci OD.Range("A1").Resize(1, 7).Value = Application.Index(TV, 1) 'renvoie dans A1 redimensionnée la première ligne du tableau des valeurs TV.

J'ai envoyé le fichier au début de la conversation, ce n'est pas suffisant ? L'original a juste beaucoup plus de lignes

Rechercher des sujets similaires à "macro copie lignes colonnes debutant"