VBA : copier/etirer des valeurs sur une plage variable
Bonjour,
Cela fait très longtemps que je n'ai pas fait de VBA et on me pose une colle sur quelque chose qui va vous paraitre surement très simple!
Dans mon fichier j'ai un onglet engagement qui représente la production que nous devons réalisé chaque mois pour différent produits (S1, S2....en colonne A) et une quantité à produire (colonne D)
Je dois recopier ces symboles et quantité qui peuvent tous les 2 varier tous les jours dans l'onglet "Engagement mensuel".
Pour le moment pas de soucis.
Je dois ensuite extraire de l'onglet "planning mois en cours" les jours travaillés, ce que j'ai fait et je copie ces valeurs dans l'onglet "Engagement mensuel" en J6.
Mon problème arrive à ce moment là, je dois pouvoir afficher pour chaque jour travailler l'ensemble des symboles.
les valeurs pouvant varier d'un jour à l'autre et d'un mois à l'autre je ne sais pas comment etirer la 1ère date jusqu'à la fin des symboles de production puis réimporter de nouveau les symboles et copier/etirer la date suivante et ce jusqu'au dernier jour du mois... j'ai tenter de trouver une macro de boucle, mais je m'y suis perdue!
Merci par avance pour votre aide
Elodie
Bonsoir Elodie,
Je te propose le code suivant :
Sub syenga()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim oLO As ListObject 'Variable Listobject pour le tableau des "Symboles"
Dim oRangeArticle As Range, oRangeQty As Range, oRangeDate As Range, oCell As Range
Dim lRow As Long, i As Integer, lNbRows As Long, lLastRow As Long
Set O = Worksheets("Engagement mensuel") 'définit l'onglet O
lLastRow = O.Cells(O.Rows.Count, 10).End(xlUp).Row 'On récupère la dernière ligne de dates
Set oRangeDate = O.Range(O.Cells(7, 10), O.Cells(lLastRow, 10)) 'On affecte la plage de dates
lRow = 2 'On initalise le compteur de lignes
Set oLO = ThisWorkbook.Sheets("Engagement").ListObjects("Engagement") 'On affecte le tableau des "Engagements"
Set oRangeArticle = oLO.DataBodyRange.Columns(1) 'On affecte la colonne des "Engagements" contenant les articles
lNbRows = oRangeArticle.Rows.Count 'On calcule le nombre de lignes d'articles
Set oRangeQty = oLO.DataBodyRange.Columns(4) 'On affecte la colonne des "Engagements" contenant les quantités
'On boucle sur les dates
For Each oCell In oRangeDate
If IsDate(oCell.Value) Then 'On vérifie que la valeur est bien une date
Set DEST = O.Cells(lRow, 2)
oRangeArticle.Copy DEST 'On copie la plage des articles dans DEST
Set DEST = O.Cells(lRow, 3)
oRangeQty.Copy DEST 'On copie la plage des quantités dans DEST
'On recopie la date courante dans la première colonne pour le nombre de lignes voulu
For i = lRow To lRow + lNbRows - 1
O.Cells(i, 1) = oCell.Value
Next
'On incrémente la ligne courante
lRow = lRow + lNbRows
End If
Next
'On fait le ménage
Set oCell = Nothing
Set oRangeDate = Nothing
Set oRangeArticle = Nothing
Set oRangeQty = Nothing
Set O = Nothing
Set oLO = Nothing
End SubJe joins mon classeur de test
Bonjour Gérard,
ça marche parfaitement!
Je te remercie je n'aurai jamais été capable d'écrire un tel code
Bonne journée
Elodie