Remplir une plage en fonction de données deja presentes dans cette plage

Bonjour à tous:

voici une partie de ma problématique

Dans l'onglet "Planning", les formules ne marchent pour le moment que pour la plage I24:AM24.

Celle-ci se remplit en fonction des dates remplies dans l'onglet "BDD"

en fonction des dates et lorsque la colonne de la date concernée est

"T2" et Confirmé à "O"

Ca fonctionne après plusieurs heures de recherche

Les valeurs 1,25 1 et 1,75 n'ont pas d'importance pour la plage I24:AM24.

Je voudrais que si une autre personne réserve une période qui chevauche

la première, cela soit la plage I25:AM25 qui se remplisse.

Et si une troisième période chevauche la première et la deuxième (en même temps), il y ait un message "réservation impossible"

Je vous remercie pour votre aide

Bonjour,

Une solution consisterait à ajouter une colonne Impossibilité :

capture

Remplie avec ce code :

Option Explicit

Sub ValidationDesSejours()

Dim I As Integer, J As Integer
Dim DateEnCours As Date, DateSejour As Date, CelDebut As Date, CelFin As Date
Dim AireDebut As Range, AireFin As Range, AireLieu As Range, AireImpossible As Range, AireDebut2 As Range
Dim CelLieu As String

    Set AireDebut = Range("Base_de_données[Date_Arrivée]")
    Set AireFin = Range("Base_de_données[Date Départ]")
    Set AireLieu = Range("Base_de_données[Lieu]")
    Set AireImpossible = Range("Base_de_données[Impossibilité]")

    AireImpossible.ClearContents
    AireDebut.Interior.ColorIndex = xlNone
    AireFin.Interior.ColorIndex = xlNone

    Set AireDebut2 = AireDebut
    For J = AireDebut.Count To 2 Step -1

        CelDebut = CDate(AireDebut(J))
        CelFin = CDate(AireFin(J))
        CelLieu = AireLieu(J)
        Set AireDebut2 = AireDebut.Resize(J - 1, 1)
        For I = AireDebut2.Count To 1 Step -1
            If CelLieu = AireDebut2(I).Offset(0, 2) Then
                For DateEnCours = CDate(AireDebut2(I)) To CDate(AireDebut2(I).Offset(0, 1))
                    For DateSejour = CelDebut To CelFin
                        If DateSejour = DateEnCours Then
                           Debug.Print "J : " & J & " , airedebut : " & AireDebut(J).Address & ", Airedebut2 : " & AireDebut2(I).Address & ", Cellieu : " & CelLieu & ", " & AireDebut2(I).Offset(0, 2)
                           AireImpossible(J) = "Impossible"
                           With AireDebut2(I)
                                .Interior.Color = RGB(255, 0, 0)
                                .Offset(0, 1).Interior.Color = RGB(255, 0, 0)
                           End With
                           With AireDebut(J)
                                .Interior.Color = RGB(255, 0, 0)
                                .Offset(0, 1).Interior.Color = RGB(255, 0, 0)
                           End With
                           Exit For
                        End If
                    Next DateSejour
                Next DateEnCours
            End If
        Next I
        Set AireDebut2 = Nothing
    Next J

    Set AireDebut = Nothing: Set AireFin = Nothing: Set AireLieu = Nothing: Set AireImpossible = Nothing

    MsgBox "Vérification terminée !", vbInformation

End Sub

Dans l'onglet Planning, les formules ont été modifiées uniquement pour T2.

Bonjour Eric

je te remercie beaucoup pour cette macro qui correspond assez bien à ce que je veux

Comme je m'étais mis au Macro il y a 10 ans , j'ai perdu certaines notions et automatismes. Pourrais-tu du "FOR J" à "Exit For" expliquer les lignes importantes

Merci

D'autre part, si ça te demande pas trop de taf, est-il possible d'agencer de manière automatique les plages de réservation de telle sorte que si une période réservée

termine le 12/05 (remplie dans la premiere ligne du planning) et qu'une autre commence le 12/05, dans ce cas celle-ci se remplisse dans la 2eme ligne du Planning et non la première . En fait il n'y a pas besoin de colorié en rouge sur le planning quand ça ne va pas puisque c'est fait dans la BDD

J'essaie de cherche beaucoup de choses par moi-même et ça me prend un temps fou. Donc j'essaie de sectoriser chaque problématique :) et je ne suis qu'au début, même si en 2005 j'avais réalisé un beau truc certes incomplet mais déjà assez complexe pour mes modestes compétence ;)

Avec mes remerciements

Sans avoir à créer de nouvelles macros, le plus simple serait d'ajouter deux colonnes dans la base de données :

capture

En filtrant le mois d'arrivée et le lieu, on incrémente le numéro de ligne en fonction de l'état confirmé. cela signifie que la ligne 1 peut concerner un séjour commençant après un séjour en début de mois. Ce serait le cas pour le bungalow 4 si le séjour démarrant le 11/05 se confirmait.

capture

En ce qui concerne les formules :

Ligne 1 :

=SOMMEPROD((""<>Base_de_données[Date_Arrivée])*(I$11>=Base_de_données[Date_Arrivée])*(""<>Base_de_données[Date Départ])*(I$11<=Base_de_données[Date Départ])*($H$24=Base_de_données[Lieu])*(Base_de_données[Confirmé]="O")*(Base_de_données[Ligne]=1))

Ligne 2 :

=SOMMEPROD((""<>Base_de_données[Date_Arrivée])*(I$11>=Base_de_données[Date_Arrivée])*(""<>Base_de_données[Date Départ])*(I$11<=Base_de_données[Date Départ])*($H$24=Base_de_données[Lieu])*(Base_de_données[Confirmé]="O")*(Base_de_données[Ligne]=2))

Sinon, en ce qui concerne le code pour la vérification, le principe est de démarrer le contrôle par la fin et de démarrer une deuxième boucle en partant de la fin également mais toujours avec une ligne de moins que la première boucle pour vérifier que les dates ne se chevauchent pas.

Merci

1) Toutefois je n'ai pas compris comment (où est la condition) dans

Base_de_données[Ligne] la valeur passe de 1 à 2

2) De plus il semble que certaines anciennes valeurs dans le Planning ne sont pas "supprimée"
3) Quel avantage y aurait-il à faire une Macro plutôt que ces 2 colonnes ?
4) Si mon tableau fait 500 lignes, y a t il la possibilité de ne faire la vérification que lorsque dans une ligne donnée la colonne confirmée passe de N à O

Merci pour ces informations et le temps passé
Bonne journée
Sébastien

C'est du manuel.

Rechercher des sujets similaires à "remplir plage fonction donnees deja presentes cette"