Macro VBA tests en boucle
Bonjour,
J’ai besoin de votre aide pour créer une macro car je suis nul en VBA et je ne pense pas qu’il existe de formule pour ce que je veux faire.
Voici mon problème :
Je dois établir un planning pour des formateurs par jour.
Dans un premier onglet « Export » j’ai :
En colonne A la date de début du stage, en colonne B la date de fin du stage et en colonne C le nom du formateur.
Dans un deuxième onglet « Planning » j’ai :
En colonne A un calendrier (suite de date) et en ligne 1 le nom des collaborateurs.
Ce que j’aimerais c’est une macro qui me marque « Disponible » ou « En formation » en fonction de la date en A2 et du nom en B1 par rapport au 1er onglet.
En gros une fonction : =IF(AND(B1=Export!C2;Planning!A2>=Export!A2;Planning!A2<=Export!B2);"En formation";"Disponible")
Mais qu’elle répète ce test sur tout le tableau jusqu’à remplir les conditions (avoir le même nom et avoir la date égale ou comprise entre le jour de début et le jour de fin) et donc marquer « En formation » sinon marquer « Disponible ».
J’espère avoir été assez clair, je vous joins un fichier Excel pour faciliter la compréhension.
Merci d’avance pour votre aide qui m’enlèverait une grosse épine du pied !
Bonjour,
Cette macro récupère les jours "en formation"
Sub test()
Dim c As Range, o As Range, iRow!, iCol!, S$, k As Date, kk%
For Each o In Worksheets("Export").Range("A2:A125")
k = o.Value
iRow = CLng(k) - 40785 + 2
S = Worksheets("Export").Cells(o.Row, 3)
With Worksheets("Planning").Range("A1:J1")
Set c = .Find(S)
If Not c Is Nothing Then
iCol = c.Column
.Cells(iRow, iCol) = "En formation"
kk = o.Offset(, 1) - o
If kk > 0 Then
For i = 1 To kk
.Cells(iRow + i, iCol) = "En formation"
Next
End If
Else
MsgBox S & " inconnu !"
End If
End With
Next
End SubA+
Bonjour Galopin01,
Merci beaucoup pour ton aide et ta rapidité !
J'ai testé ta macro dans mon tableu d'origine et malheureusement elle ne fonctionne pas à chaque fois, elle oublie certaine date et notamment si la date de début est différente de la date de fin.
Une idée de ce qui pourrait provoquer ces oublis ?
Est-ce que tu pourrais m'expliquer rapidement ta macro pour que j'essaye de la comprendre ?
Merci d'avance.
Autant pour moi, en modifiant les plages de données ça fonctionne nickel.
Cependant, si tu as le temps, j'aimerais bien que tu m'expliques quand même la macro, même succintement.
Merci.
Juste une petite requête en plus, est-il possible d'étendre les plages de données pour le cas où de nouveaux formateurs seraient intégrés et le planning prolongé (ce qui va arriver c'est programmé) afin que la macro les prenne en compte mais sans devoir la modifier et sans qu'elle nous indique "inconnu" lorsque les cellules sont vides ?
Bonjour,
Le code commenté et modifié :
Sub test()
Dim c As Range, o As Range, iCol!, iLRS!, iRow!, S$, k As Date, kk%
'Pour chaque cellule dans la colonne A de la feuille "Export" (source)
With Worksheets("Export")
'Détection de la dernière ligne de (source)
iLRS = .Range("A" & .Rows.Count).End(3).Row
End With
'Pour chaque cellule dans la colonne A de (source)
For Each o In Worksheets("Export").Range("A2:A" & iLRS)
'on mémorise la date
k = o.Value
'On en déduit la ligne correspondant à cette date dans la feuille "Planning" (cible)
iRow = CLng(k) - CLng(Worksheets("Planning").Range("A2")) + 2
'On mémorise le prénom "S" correspondant à k
S = Worksheets("Export").Cells(o.Row, 3)
'On recherche ce prénom dans (cible)
With Worksheets("Planning").Rows(1)
Set c = .Find(S)
'Si on le trouve alors
If Not c Is Nothing Then
'On mémorise la colonne cible
iCol = c.Column
'et on écrit à la ligne correspondante...
.Cells(iRow, iCol) = "En formation"
'On mémorise la différence de date dans (source)
kk = o.Offset(, 1) - o
'Si cette différence de date est supérieure à 0
If kk > 0 Then
For i = 1 To kk
'On écrit dans chacune des lignes suivantes de (cible)
.Cells(iRow + i, iCol) = "En formation"
Next
End If
End If
End With
Next
End SubA+
GE-NIAL
Franchement c'est super, merci beaucoup Galopin01.
A++