Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
J'ai récupéré une macro qu'on m'avait gentimment écrite sur le forum il y a quelques temps et j'ai tenté de l'adapter à mon actuel problème.
J'essaie d'extraire les lignes qui me vont bien mais je n'y arrive pas. Je sens que je commence à comprendre comment ça fonctionne mais bon ca veut toujours pas.
J'ai également fais deux macros à l'aide de l'enregistreur que j'ai mis à la suite de la première. Le souci est que j'ai testé sur quelques lignes seulement. Par conséquent, ces deux macros ne fonctionneront pas correctement si, et ce sera le cas, je me retrouve avec plus de ligne que dans l'exemple.
Bref j'ai réellement besoin de votre aide. Je vous joins le fichier.
Merci pour votre aide.
Sub extrait()
' Extrait les données vers le l'onglet "Feuil2" Ne fonctionne pas !
Dim plage As Range, c As Range
Dim cDest As RecentFile
Dim DerCol As Long
Dim bEntete As Boolean
With Feuil1
' Copie l'en tête
Rows("6:6").Select
Selection.Copy
Sheets("Feuil2").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Range("A1").Select
' Remplace "production" par "start time"
ActiveCell.FormulaR1C1 = "Start time"
Range("A1").Select
Set plage = .Range("A1:A" & .Range("A" & .Rows.Count).End(xlUp).Row)
For Each c In plage
If c = Left("Year", 4) Then
If Not bEntete Then
DerCol = c.End(xlToRight).Column
c.Resize(1, DerCol).Copy Feuil2.Range("A" & Rows.Count).End(xlUp)
bEntete = True
End If
Set c = c.Offset(3)
Do
.Range(c, .Cells(c.Row, DerCol)).Copy Feuil2.Range("A" & Rows.Count).End(xlUp).Offset(1)
Set c = c.Offset(3)
Loop While c = " "
End If
Next c
End With
' fais avec l'enregistreur de macro
' ajoute une colonne qui donne le mois correspondant à la date de la colonne A
With Feuil2
Columns("B:B").Select
Selection.Insert Shift:=xlToRight
Range("B1").Select
ActiveCell.FormulaR1C1 = "Mois"
Range("B2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.NumberFormat = "General"
Range("B2").Select
ActiveCell.FormulaR1C1 = "=MONTH(RC[-1])"
Range("B2").Select
Selection.AutoFill Destination:=Range("B2:B10")
Range("B2:B10").Select
Columns("B:B").Select
With Selection
.HorizontalAlignment = xlCenter
End With
Range("B12").Select
' ajoute un colonne permettant une recherchev
Columns("C:C").Select
Selection.Insert Shift:=xlToRight
Range("C1").Select
ActiveCell.FormulaR1C1 = "Centre de charge"
Range("C2").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[6],Référence!R2C1:R10C2,2,FALSE)"
Range("C2").Select
Selection.AutoFill Destination:=Range("C2:C10")
Range("C2:C10").Select
Range("A2").Select
End With
End Sub
Ca va un peu mieux mais ca m'extrait toujours rien.
Ca marche parfaitement. Merci à vous deux pour vous être penché sur mon problème.
Par contre, honnêtement, il y a pas mal de chose que je ne comprends pas.
Par ex la variable n = 2. Pourquoi = 2 ? Du coup, je ne comprends pas non plus la définition de la plage range ("A" & n).
Ensuite je crois comprendre que tu définis une autre variable "x"... Je vois alors du range("A" & n) et du range("B" & x). Je suis franchement perdu.
Pierrejean, (ou Efgé) sans vouloir abusé, aurais-tu (vous) l'extrême gentillesse de bien vouloir détaillé tout ça par quelques explications, histoire que je ne repose pas les mêmes questions la prochaine fois.
En plus, j'ai une autre extraction dans le même genre à faire, et je voudrais bien éviter de venir vous embêter tous avec mes pbs.
Dans l'attente de te/vous lire, un très gros merci pour les heures et les heures de travail en moins, sans compter les possibilités d'erreur. Merci beaucoup.
Merci pour les explications pierrejean. Je reviendrais sans doute plus tard dessus.
Petite question en attendant celles plus spécifiques sans doute à la macro en elle même.
Pour la colonne "mois", l'affichage renvoi juste le chiffre/nombre correspondant au mois. Dans l'hypothèse ou je devrais traiter des années différentes, comment puis-je changer le code pour qu'il renvoi quelque chose de la forme "mm-aaaa" ?
J'ai essayé (un peu hasard) de mettre :
Mais ça n'a pas l'air de bien vouloir. Quelle est la solution ?
Comment puis-je faire également pour qu'une textbox, ou peut être plus simplement que les cellules se colorent ou rouge lorsque la recherchev renvoie une erreur. (réf non trouvée).
J'ai modifié le code de la sorte pour le moment :
Code:
Sheets("Feuil2").Range("C" & x).FormulaLocal = "=RECHERCHEV(D" & x & ";Référence!A2:B41;2;faux)"
Je n'avais pas à la base pris la bonne colonne comme référence pour la recherche, d'où le changement de I en D.
Bon après décortiquage, j'ai "quelques" questions. J'espère que ce post ne sera pas trop rebutant.
Code:
'balayage de la colonne A de la feuille1 (because With et .)
'a partir de la ligne2 jusqu'a la derniere ligne non vide
For n = 2 To .Range("A65536").End(xlUp).Row
Je suppose qu'on aurait pu prendre entre la ligne 1 et 6 ?
Question que je sens bête : "n" est forcément une ligne ou s'agit-il d'une variable que l'on définit ? Car si c'est une variable, où définit-on qu'il s'agit d'une ligne ? Je sais pas si je me fais comprendre ?
Copie la sélection sur A1 de la feuille 2.
Comment ça se passe s'il trouve plusieurs fois "Start Time" dans la colonne A ? Ca recopie et recolle en écrasant à partir de "A1" ?
Code:
.Range("B" & n - 1 & ":N" & n - 1).Copy Destination:=Sheets("Feuil2").Range("D1")
Là je comprends pas trop le range même si je pense que ca sert à décaller d'un ligne vers le haut pour récupérer le "Start Time" et écraser "Production" qui aurait du se trouver en A1. Mais je suis pas vraiment sur.
Code:
Else
If IsDate(.Range("A" & n)) Then
Sinon si en colonne A et à partir de la ligne 2 (je coince là dessus) le format est une date alors
Code:
'x est la derniere ligne non vide de la colonne A de la feuil2 +1
'soit la 1ere ligne vide
x = Sheets("Feuil2").Range("A65536").End(xlUp).Row + 1
Donc là je comprends bien que tu définis "x" comme étant une variable. En l'occurrence qui correspond à la ligne 2 de la feuille 2.
Code:
'copie sur cette ligne des infos de la feuil1
.Range("A" & n).Copy Destination:=Sheets("Feuil2").Range("A" & x)
Là je ne comprends pas. Dans ce code, qu'est-ce qui permet de définir les valeurs que tu veux copier. Il n'y a pas de référence à :
Code:
If .Range("A" & n) = "Start Date" Then
Code:
.Range("B" & n & ":N" & n).Copy Destination:=Sheets("Feuil2").Range("D" & x)
'saisie dans les colonnes B et C
Je suis perdu sur ton 1er range et par conséquent sur l'endroit où il doit copier. Colonne D à partir de la 1ère cellule vide ? Mais tu parles de B & C.
Là je comprends que tu définis le format de la colonne B de la feuille 2. Mais tu "parles" de la colonne A avec un "sheets("Feuil2"). Alors que pour moi à l'origine, la date est dans la colonne A de la feuille 1. Je suis à nouveau perdu.
Code:
Sheets("Feuil2").Range("C" & x).FormulaLocal = "=RECHERCHEV(D" & x & ";Référence!A2:B41;2;FAUX)"
A quoi correspondent les caractères & x & ? x est sans doute là pour définir la 1ère cellule vide. Le reste je vois pas.
Code:
If IsError(Sheets("Feuil2").Range("C" & x).Value) Then Sheets("Feuil2").Range("C" & x).Interior.ColorIndex = 3
Ok pour ça.
Bon j'espère ne pas être trop embêtant avec de telles questions de débutant. Je pense que je pige maitenant déjà un peu mieux quelques principes. Déjà rien que relire ligne par ligne le code aide un peu, même si je pense que tes explications vont me faire repenser le contraire.
Bon après décortiquage, j'ai "quelques" questions. J'espère que ce post ne sera pas trop rebutant.
Code:
'balayage de la colonne A de la feuille1 (because With et .)
'a partir de la ligne2 jusqu'a la derniere ligne non vide
For n = 2 To .Range("A65536").End(xlUp).Row
Je suppose qu'on aurait pu prendre entre la ligne 1 et 6 ?
Question que je sens bête : "n" est forcément une ligne ou s'agit-il d'une variable que l'on définit ? Car si c'est une variable, où définit-on qu'il s'agit d'une ligne ? Je sais pas si je me fais comprendre ?
n est une variable qui prendra toutes les valeurs entieres comprises entre 2 et le N° de la derniere ligne non vide
Copie la sélection sur A1 de la feuille 2.
Comment ça se passe s'il trouve plusieurs fois "Start Time" dans la colonne A ? Ca recopie et recolle en écrasant à partir de "A1" ?
Il est supposé que "Start Date" n'apparait qu'une fois
Code:
.Range("B" & n - 1 & ":N" & n - 1).Copy Destination:=Sheets("Feuil2").Range("D1")
Là je comprends pas trop le range même si je pense que ca sert à décaller d'un ligne vers le haut pour récupérer le "Start Time" et écraser "Production" qui aurait du se trouver en A1. Mais je suis pas vraiment sur.
Code:
[I][COLOR=blue]Effectivement lorsqu'on trouve StartDate la sconde partie des titres se trouve une ligne au dessus d'ou le n-1[/COLOR][/I]
Else
If IsDate(.Range("A" & n)) Then
Sinon si en colonne A et à partir de la ligne 2 (je coince là dessus) le format est une date alors cela aurait pu etre a partir de la ligne 6 mais s'il veanit fantaisie de supprimer une ligne cela fonctionnerait quand même
Code:
'x est la derniere ligne non vide de la colonne A de la feuil2 +1
'soit la 1ere ligne vide
x = Sheets("Feuil2").Range("A65536").End(xlUp).Row + 1
Donc là je comprends bien que tu définis "x" comme étant une variable. En l'occurrence qui correspond à la ligne 2 de la feuille 2. plus exactement a la ligne qui suit la deniere ligne non vide (x sera recalculé apres chaque ecriture)
Code:
'copie sur cette ligne des infos de la feuil1
.Range("A" & n).Copy Destination:=Sheets("Feuil2").Range("A" & x)
Là je ne comprends pas. Dans ce code, qu'est-ce qui permet de définir les valeurs que tu veux copier. Il n'y a pas de référence à : C'est n qui definit la ligne a copier (rappel n va de 2 a la derniere lig......)
Code:
If .Range("A" & n) = "Start Date" Then
Code:
.Range("B" & n & ":N" & n).Copy Destination:=Sheets("Feuil2").Range("D" & x)
'saisie dans les colonnes B et C
Je suis perdu sur ton 1er range et par conséquent sur l'endroit où il doit copier. Colonne D à partir de la 1ère cellule vide ? Mais tu parles de B & C. le premier range S'adresse a la feuil 1 (le . avant range a cause du with) non je parle de B a N
Là je comprends que tu définis le format de la colonne B de la feuille 2. Mais tu "parles" de la colonne A avec un "sheets("Feuil2"). Alors que pour moi à l'origine, la date est dans la colonne A de la feuille 1. Je suis à nouveau perdu. tu oublies que l'on vient de recopier la date de feuil1 a feuil2
Code:
Sheets("Feuil2").Range("C" & x).FormulaLocal = "=RECHERCHEV(D" & x & ";Référence!A2:B41;2;FAUX)"
A quoi correspondent les caractères & x & ? x est sans doute là pour définir la 1ère cellule vide. Le reste je vois pas. ecrire range("A" & n) revient a ecrire range("A1") si n vaut 1
Code:
If IsError(Sheets("Feuil2").Range("C" & x).Value) Then Sheets("Feuil2").Range("C" & x).Interior.ColorIndex = 3
Ok pour ça.
Bon j'espère ne pas être trop embêtant avec de telles questions de débutant. Je pense que je pige maitenant déjà un peu mieux quelques principes. Déjà rien que relire ligne par ligne le code aide un peu, même si je pense que tes explications vont me faire repenser le contraire.
Merci beaucoup pour ces explications pierrejean.
Je viens de les lire à la volée et déjà ça m'éclaire plus. Je pense revoir tout ça demain matin. Vraiment merci pour ton temps.
Bonne soirée.
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD