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 !

23planning-test.xlsm (20.06 Ko)

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 Sub

A+

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 Sub

A+

GE-NIAL

Franchement c'est super, merci beaucoup Galopin01.

A++

Rechercher des sujets similaires à "macro vba tests boucle"