simplification d'une formule de concatenation et amélioration

guitoubas

XLDnaute Nouveau
Bonjour à vous

Bon je progresse petit à petit sur mon fichier, mais j'ai à nouveau besoin de votre aide !
J'ai réussi a mettre au point une formule de concaténation de dates avec retour à la ligne (merci l'historique du forum) mais la je sèche un peu!

Explication de mon fichier :
dans l'onglet Bdd plusieurs colonnes avec une date pour la prise de solo du poste et des dates qui correspondent à une alternance à ce poste (5 alternances possibles en tout)
Dans l'onglet secrétariat une cellule correspondant aux périodes d'occupation du poste et une autre correspondant aux périodes d'alternance (ie formules de concaténation).
Mes questions :
1 Y a t'il plus simple comme formule de concatenation
2 J'ai un problème de date en effet plusieurs jours se chevauchent, il faudrait que je sois capable de retrancher un jour pour ne plus avoir de chevauchement
3 Comment faire pour ne pas prendre en compte les cellules vides (cf Son nom 2)

J'espère avoir été clair, n'hésitez pas à me le dire si ca n'est pas le cas!

Le fichier en PJ

Merci !
 

Pièces jointes

  • exforum.zip
    29.3 KB · Affichages: 28

eriiic

XLDnaute Barbatruc
Re : simplification d'une formule de concatenation et amélioration

Bonjour,

Une proposition avec une fonction personnalisée :
Code:
Function concatDates(plage As Range) As String
    Dim c As Range, ancien As Date, pair As Boolean, chevauchement As Boolean
    pair = True
    For Each c In plage
        If Not IsDate(c) Then Exit For
        pair = Not pair
        If pair Then
            concatDates = concatDates & " au " & Format(DateValue(c), "dd/mm/yy") & vbLf
            ancien = c
        Else
            chevauchement = (c.Value = ancien)
            concatDates = concatDates & "Du " & Format(DateValue(c - chevauchement), "dd/mm/yy")
        End If
    Next c
End Function
Ex syntaxe: =concatDates(BDD!C5:N5)
Tu peux saisir la plage à souris, et ensuite recopier la formule vers le bas

Comme tu n'as pas expliqué ce que tu voulais pour les chevauchements j'ai supposé que si dateDébut = dateFinPrécédente alors dateDébut= dateDébut+1
Si ce n'est pas ça enleve tout ce qui concerne la variable 'chevauchement'

eric
 
Dernière édition:

guitoubas

XLDnaute Nouveau
Re : simplification d'une formule de concatenation et amélioration

Merci eric pour ta réponse, je viens de tester et ca marche bien pour le premier nom !
Par contre, pour le deuxième; il manque la dernière période dans poste 1, j'ai juste Du 30/12/10 et rien derrière. j'ai rajouté la date du deuxième poste (je ne l'avais pas mise dans le premier fichier, peut être cela vient il de la ?

Pour le chevauchement, le problème vient du fait que l'utilisateur doit rentrer les dates d'alternance
Exemple pour le poste 1 l'alternance 1 est du 08/06 au 14/06, les dates d'occupation du poste devrait donc être du 01/05 au 07/06 et du 15/06 au 22/06
Suis je clair?
En tout cas merci bien pour le travail déjà accompli !
Je remets le fichier avec la fonction et la nouvelle date

Merci !
 

Pièces jointes

  • exforumv2.zip
    30.5 KB · Affichages: 31
  • exforumv2.zip
    30.5 KB · Affichages: 32
  • exforumv2.zip
    30.5 KB · Affichages: 37

eriiic

XLDnaute Barbatruc
Re : simplification d'une formule de concatenation et amélioration

Re,

En fait je m'étais basé sur ton exemple en pensant que c'était ce que tu voulais obtenir...
J'ai modifié la fonction et ajouté un paraètre optionnel 'occupation' :
- occupation=VRAI retourne l'occupation du poste corrigé d'1 jour sauf pour les extrémités de la plage
- occupation = FAUX ou absent retourne les alternances en excluant les extrémités (les plages doivent donc être identiques)

Si le nombre de dates est impair je complète par 'au ...'

La syntaxe devient :
=concatDates(BDD!C5:N5;VRAI) pour l'occupation
ou
=concatDates(BDD!C5:N5) pour les alternances

Je pense qu'on s'approche de ce que tu veux, par contre contrôle différents cas pour voir la dernière ligne car vu que tu n'as donné aucune consigne sur comment traiter les différentes fins...

eric
 

Pièces jointes

  • exforumv2.zip
    24.2 KB · Affichages: 41
  • exforumv2.zip
    24.2 KB · Affichages: 33
  • exforumv2.zip
    24.2 KB · Affichages: 37
Dernière édition:

guitoubas

XLDnaute Nouveau
Re : simplification d'une formule de concatenation et amélioration

Bon je ne réponds que maintenant car je suis au boulot et j'ai eu pas mal d'emmerdes ce soir.

Le chevauchement marche presque parfaitement, j'ai encore un soucis entre les dates du poste 1 et 2 (cf exemple ou le poste 1 se termine le 31/08 et le poste 2 commence le meme jour)

Je me suis permis d'enlever la parti de code suivante
Code:
'  If Right(concatDates, 1) = " " Then
     '   concatDates = concatDates & "au ..."
   ' Else
     '   concatDates = Left(concatDates, Len(concatDates) - 1)
    'End If
La fonction me renvoyait un #VALEUR si il manquait une ou plusieurs dates d'alternances, sans ca ca marche nickel de plus je ne tenais pas forcément au au... si la periode est en cours.
Pour le reste, j'ai trouvé trois cas ou ca ne marchait pas,

  • Si on effectue l'alternance 1 et 4 sans faire la 2 ni la 3 ni la 5, les dates d'occupation du poste 1, de l'aternance ne sont pas corrects
  • Si l'on effectue aucune alternance entre le poste 1 et 2
  • Enfin j'ai fait un dernier test si on effectue la derniere alternance juste avant le poste 2 ca ne marche pas non plus
j'ai mis mon exemple à jour pour que tu puisses les voir (ie nom 3, 4 et 5 )

Je te remercie encore une fois du mal que tu te donnes c'est vraiment sympa, j'essaye de comprendre par moi même pour avancer suel mais ca n'est pas facile.
J'espere ne pas abuser mais serait il possible d'ajouter quelques commentaire a ton code pour faciliter ma compréhension?

Guillaume
 

Pièces jointes

  • exforumv3.zip
    25.7 KB · Affichages: 31
  • exforumv3.zip
    25.7 KB · Affichages: 36
  • exforumv3.zip
    25.7 KB · Affichages: 32

eriiic

XLDnaute Barbatruc
Re : simplification d'une formule de concatenation et amélioration

Bonjour,

Certaines de ces erreurs sont plus ou moins normales car je considérais qu'il fallait arreter dès le 1er vide.
Pour la date occup poste 2 ce n'est pas =BDD!N5 la formule à utiliser ?
Par contre pour tes différents cas j'aimerais bien que tu mettes le résultat souhaité, c'est plus visuel.

eric

Edit : J'ai fais une correction, si tu peux contrôler.
Reste à savoir ce que tu veux en date occ poste 2 (?)

Pour les commentaires j'ai un peu de mal,
En première version je pensais que tu ne voulais que formater les dates d'occupation.
Le principe était le suivant :
- si la cellule est en position impaire c'est un début de période
- si la cellule est en position paire c'est une fin de période
Jusque là tout était simple...
En v2 j'ai compris que tu voulais également l'alternance.
Pour utiliser le même code il fallait éliminer les extrémités, les cellules paires devenaient impaires et vice-versa, et ça que dans le cas de l'alternance.
Et pour le cas des occupations faire +/- 1 jours mais pas sur les extrémités
D'où l'apparition de variables et de tests durs à lire dans le code, et tout aussi durs à commenter.
J'espère que cette explication t'éclairera suffisamment.
eric
 

Pièces jointes

  • exforumv3.zip
    30.7 KB · Affichages: 34
  • exforumv3.zip
    30.7 KB · Affichages: 32
  • exforumv3.zip
    30.7 KB · Affichages: 34
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 323
Messages
2 087 291
Membres
103 510
dernier inscrit
baloty