Détection d'occurences identiques consécutives

Signaler
Messages postés
5
Date d'inscription
mercredi 21 décembre 2011
Statut
Membre
Dernière intervention
26 décembre 2011
-
Messages postés
5
Date d'inscription
mercredi 21 décembre 2011
Statut
Membre
Dernière intervention
26 décembre 2011
-
Bonjour à tous,

J'aurais besoin de votre aide afin de modifier une macro.
Voici mon problème :
Actuellement la macro cherche dans "Planning", une durée et un lieu (2conditions) afin de remplir "Frais" selon un barème contenu dans un 3ème onglet. (Planning et Frais se présentent exactement de la même manière avec en A des dates et en 1 des noms)

Seulement j'aimerais la modifier afin qu'elle ne tienne plus compte que du lieu (sachant que dans Planning on n'affiche plus la durée) mais en revanche qu'elle détecte si ce lieu apparait consécutivement plusieurs fois ou pas (sur une période de 5 jours) et selon qu'elle affecte la bonne valeur. En fait je ne sais pas comment lui faire prendre en compte cette notion de consécutif.

Pour éclaircir mes propos cette macro rempli un planning avec des montants en fonction d'un autre planning où sont présents des lieux.

Actuellement j'ai ce code :

Sub Frais()
Dim Cel As Range
Dim Cel1 As Range
Dim Lieu As String
Dim Duree As String
Dim Lg As Long
Dim Cl As Integer
Dim Plg As Range
Dim WsG As Worksheet
Dim WsF As Worksheet

  Application.ScreenUpdating = False
  Set WsF = Sheets("Frais")
  
  With Sheets("Planning")
    Lg = .Range("A" & Rows.Count).End(xlUp).Row
    Cl = .Cells(1, Columns.Count).End(xlToLeft).Column
    On Error Resume Next
    Set Plg = .Range(.Range("B2"), .Cells(Lg, Cl)).SpecialCells(xlCellTypeConstants, 23)
    On Error GoTo 0
  End With
  If Plg Is Nothing Then
    MsgBox "Pas d'info dans la page Planning"
    Exit Sub
  End If
  For Each Cel In Plg
    Lieu = Split(Cel, "/")(1)
    Duree = Split(Cel, "/")(0)
    Set Cel1 = Range("H1:Q1").Find(what:=Duree, LookIn:=xlValues, lookat:=xlWhole)
    If Not Cel1 Is Nothing Then
      Cl = Cel1.Column
      Set Cel1 = Range("F2:F17").Find(what:=Lieu, LookIn:=xlValues, lookat:=xlWhole)
      If Not Cel1 Is Nothing Then
        Lg = Cel1.Row
        Cells(Lg, Cl).Select
        WsF.Range(Cel.Address) = ActiveCell
      Else
        MsgBox "Lieu " & Lieu & " non trouvé"
      End If
    Else
      MsgBox "Durée " & Duree & " non trouvée"
    End If
  Next Cel
End Sub


J'espère avoir été assez clair et que vous pourrez m'apporter une solution.
Merci d'avance pour votre aide car je n'ai vraiment pas le niveau pour effectuer cette modif' !

7 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut

Confus.
"qu'elle détecte si ce lieu apparait consécutivement plusieurs fois ou pas (sur une période de 5 jours)"
Consécutif : Qui ce suit
Alors que veut dire "consécutif sur 5 jours" ?
Les lieux doivent-ils être les mêmes pendant 5 jours ?
Ou bien suffit-il qu'un lieu revienne 2 fois de suite (plus proche de la définition) ?
Ou encore qu'un lieu apparaisse au moins deux fois parmi 5 ?
Tout ceci change la méthode de recherche.
Au pire, il faudra mémoriser les 5 lieux puis faire une double boucle For-Next imbriquées pour comparer chaque lieu aux autres.

"et selon qu'elle affecte la bonne valeur"
Il n'y a que toi qui comprenne ce que cela veut dire.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
5
Date d'inscription
mercredi 21 décembre 2011
Statut
Membre
Dernière intervention
26 décembre 2011

Salut Jack,

Je vais tenter d'éclaircir mes élucubrations :)

En fait j'ai un planning où chaque ligne correspond à un jour. Les lignes qui correspondent à des Samedi et Dimanche sont grisées et contiennent des formules. Le test de la macro doit donc s'effectuer sur 5 lignes (Lundi, Mardi, ...) puis sauter 2 lignes (Samedi et Dimanche) puis recommencer le test sur les 5 lignes suivantes et ainsi de suite dans l'onglet Planning, dans le but de compléter l'onglet Frais.

Lorsque je parle de jours consécutifs, un exemple :
Contexte :
J'ai dans un onglet 3 un tableau qui en colonnes à des durées : 1, 2, 3, 4, 5 jours et en lignes des lieux : Site1, Site2, ...
Et donc à l'intéreur des valeurs.

Si un collaborateur est présent sur le Site1 Lundi et Mardi, puis sur le Site2 Mercredi et Jeudi, puis à nouveau sur le Site1 Vendredi alors la macro doit me renvoyer :
Pour Lundi : Valeur Site1/2jours
Pour Mardi : Valeur Site1/2jours
Pour Mercredi : Valeur Site2/2jours
Pour Jeudi : Valeur Site2/2jours
Pour Vendredi : Valeur Site1/1jour

S'il est présent toute la semaine sur le Site1:
Pour Lundi : Valeur Site1/5jours
Pour Mardi : Valeur Site1/5ours
Pour Mercredi : Valeur Site1/5jours
Pour Jeudi : Valeur Site1/5jours
Pour Vendredi : Valeur Site1/5jours

""et selon qu'elle affecte la bonne valeur"
Il n'y a que toi qui comprenne ce que cela veut dire."
Pour l'affectation de la bonne valeur je gèrerais ensuite, c'était pour préciser qu'elle doit me renvoyer une valeur présente dans un autre onglet.

J'espère que c'est un petit peu plus clair :s

PS: je suis un débutant en VBA donc n'hésites pas à bien m'expliquer la marche à suivre pour modifier la macro et les actions qu'entrainent les lignes de code (que j'en profite pour étoffer ma culture VBA!).

Merci beaucoup pour ton aide.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
"alors la macro doit me renvoyer"
Une Sub ne peut pas renvoyer de valeur. Il faut la transormer en Function

Toujours pas clair.
J'ai compris ce que tu veux faire, mais comment veux-tu matérialiser "Valeur Site1/2jours" ?
Par CE texte ?
Donne des exemples plus concret, voire en collant une image de ce à quoi tu voudrais que cela ressemble (voir site d'hébergement d'images, par exemple http://www.zimagez.com/)
Messages postés
5
Date d'inscription
mercredi 21 décembre 2011
Statut
Membre
Dernière intervention
26 décembre 2011

http://www.zimagez.com/galerie/Exemples-CodeSource-29064-0.php</code>


J'ai mis les 4 onglets qui nous intéressent.

La macro doit donc compléter l'onglet3, j'ai compléter quelques valeurs à la main pour que ce soit plus explicite et afin qu'on voit bien ce qu'elle doit faire. La macro devrait sur cet exemple me renvoyer une valeur dans toutes les cellules vertes.
Messages postés
5
Date d'inscription
mercredi 21 décembre 2011
Statut
Membre
Dernière intervention
26 décembre 2011

Erratum : petite erreur dans l'onglet1, le titre de la colonne D, c'est "Site + Stage" et non plus "Durée + Site"
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Le principal est de faire ta boucle pour scruter chaque donnée.
Un For-Next fera l'affaire.
Il te suffit de mémoriser le nom du site à chaque passage et de le comparer au suivant - en fait tu compares le nom du site avec celui mémorisé au tour d'avant, c'est à dire à la cellule précédente.

# S'il est identique, tu incrémentes un compteur sans rien faire d'autre

#S'il est différent :
- Tu construis la chaine en concaténant le nom du site précédent avec ton compteur -> "Site1/xJours",
- Tu vas écrire cette chaine dans autant de cellules précédentes que l'indique ton compteur
- tu remets à zéro (ou 1) ton compteur pour le nouveau site.

Tout ceci est un jeu de For-Next, de If-Then, de Range.Offset
Messages postés
5
Date d'inscription
mercredi 21 décembre 2011
Statut
Membre
Dernière intervention
26 décembre 2011

Ok merci Jack, je n'ai pas accès au fichier actuellement mais je vais essayer de reconstruire un code grâce à tes conseils. Je te tiens au courant.

Merci et bonnes fêtes