Réservation V2 sans monthview
Bonjour,
Je suis en cours de finalisation de mon projet de fichier planning sans module monthview.
Il me reste un souci de gestion date. J'ai imaginé pouvoir répéter une réservation plusieurs fois, soit toutes les semaines paires ou impaires soit tous les mois.
Dans le cas des semaines j'ai un souci de "bornage" de fin de boucle. Par exemple, lorsque je souhaites faire une réservation toutes les semaines jusqu'à la fin septembre et que le jour de réservation est un vendredi la réservation commence du vendredi 19 juin et se termine le vendredi 2 octobre
Dans les cas d'une répétion tout les mois, Eriiic m'a proposé une fonction perso qui détermine le énième du jour de la date. Ce qui permettrai de boucler sur les jours plutôt que sur le numéro de la date. Exemple, une réservation le samedi 20 juin sur trois. Première date le samedi 20 juin, la deuxième date le lundi 20 juin et la troisième date le jeudi 20 aout
Le code de Eriiic
'AUTEUR: Eriiic via le forum excel-pratique
'DATE: 20/06/2015
'Titre: Réservations V2
Option Explicit
Sub test()
Debug.Print moisSuivantMmJS(#3/4/2015#) ' #m/d/yyyy#
End Sub
Function moisSuivantMmJS(dat As Date, Optional NbMois As Long = 1) As Variant
' à partir d'une date,
' fournit le même xième 'jour de la semaine' du mois suivant
' ex : moisSuivant("10/03/15") ==> 14/04/2015 (2e mardi du mois suivant)
' ex : moisSuivant("10/03/15",3) ==> 09/06/2015 (2e mardi 3 mois plus tard)
' *** limité au 4ème jour/sem du mois ***
' eriiic
Dim numJo As Long, d1 As Date
numJo = Day(dat) \ 7
If numJo > 3 Then
'limitation au 4ème dans le mois
moisSuivantMmJS = CVErr(xlErrNum) ' #NOMBRE!, hors domaine
Exit Function
End If
d1 = CDate("1/" & Format(DateAdd("m", NbMois, dat), "mm/yyyy")) ' 1er du mois
moisSuivantMmJS = d1 + (Weekday(dat, 2) - Weekday(d1, 2) + 7) Mod 7 + numJo * 7
End FunctionJe vous confis que je suis au seuil de mes compétences et que je nage
Le code de réservation établit avec Banzaï en 2013
Private Sub CommandButton_enreg_Click()
Dim i As Integer, NbMois As Integer, NbJour As Integer, FinBoucle As Integer
Dim Ligne_Insertion As Long
Dim ModeCalcul As Integer
Dim Semaine As Byte, Pas As Byte
Dim ladate As Date, Hdeb As Date, HFin As Date
Dim Cel As Range, Depart As String
ladate = CDate(Me.Label_date.Caption)
'Mettre une condition de remplissage tout les champs doivent être renseignés sauf les boutons options
If Me.ComboBox_debut.ListIndex = -1 Then
MsgBox "Veuillez indiquer l'heure de début de votre réservation, merci.", 64, ""
ElseIf Me.ComboBox_fin.ListIndex = -1 Then
MsgBox "Veuillez indiquer l'heure de fin de votre réservation, merci.", 64, ""
ElseIf Me.ComboBox_pro.ListIndex = -1 Then
MsgBox "Veuillez indiquer votre nom, merci.", 64, ""
ElseIf Me.ComboBox_type.ListIndex = -1 Then
MsgBox "Veuillez indiquer le type de votre réservation, merci.", 64, ""
ElseIf Me.ComboBox_meeting.Value = "" Then
MsgBox "Veuillez indiquer le nom de votre réservation, merci.", 64, ""
ElseIf Me.OpB_allweeks = True And ComboBox_month.ListIndex = -1 Then
MsgBox "Veuillez indiquer le mois de fin de la réservation, merci.", 64, ""
Else 'Si OK
With Sheets("BD_CAL")
Pas = 1 ' Par défaut
If Modif = True Then
Ligne_Insertion = Me.LabelLigne.Caption
Me.OpBUnefois = True ' On ne modifie qu'un rendez-vous
Else
Ligne_Insertion = .Range("A" & Rows.Count).End(xlUp).Row + 1
If Me.OpB_allmonth = True Then
FinBoucle = ComboBox_month.ListIndex
NbMois = 1
ElseIf Me.OpB_allweeks = True Then
FinBoucle = Application.WorksheetFunction.WeekNum(DateSerial(year(ladate), Month(ladate) + ComboBox_month.ListIndex + 1, 0)) - Application.WorksheetFunction.WeekNum(ladate)
NbJour = 7
Semaine = NOSEM(CDate(ladate))
If Me.CheckBox_pair = True Then ' Que les semaines paires
If Semaine Mod 2 <> 0 Then ' Si la semaine n'est pas paire
Label_date.Caption = DateAdd("d", 7, CDate(Label_date.Caption)) ' On prend la semaine suivante
ladate = Me.Label_date ' On rectifie le calendrier
End If
Pas = 2
ElseIf Me.CheckBox_impaire = True Then ' Que les semaines impaires
If Semaine Mod 2 <> 1 Then ' Si la semaine n'est pas impaire
Label_date.Caption = DateAdd("d", 7, CDate(Label_date.Caption)) ' On prend la semaine suivante
ladate = Me.Label_date ' On rectifie le calendrier
End If
Pas = 2
End If
End If
End If
' Boucle qui vérifie si une date n'est pas réservée
Hdeb = CDate(Me.ComboBox_debut)
HFin = CDate(Me.ComboBox_fin)
For i = 0 To FinBoucle Step Pas
ladate = DateAdd("m", (i * NbMois), CDate(Label_date.Caption) + (i * NbJour))
Set Cel = .Columns("A").Find(what:=ladate, LookIn:=xlValues, Lookat:=xlWhole)
If Not Cel Is Nothing Then
Depart = Cel.Address
Do
If Cel.Offset(0, 8) = NomSalle Then
If HFin > CDate(Cel.Offset(0, 1)) And Hdeb < CDate(Cel.Offset(0, 2)) Then
' Pas en mode modification ou la ligne testée n'est pas celle qui doit être modifiée
If Modif = False Or Cel.Row <> Ligne_Insertion Then
MsgBox "Réservation impossible :" & Chr(10) & "Créneau déjà occupé le " & ladate & " à " & Format(Hdeb, "h\Hmm"), 16, "A.Li.A"
Exit Sub
End If
End If
End If
Set Cel = .Columns("A").FindNext(Cel)
Loop While Depart <> Cel.Address
End If
Next i
With Application
ModeCalcul = .Calculation
.Calculation = xlCalculationManual
End With
' Boucle d'inscription des RDV
For i = 0 To FinBoucle Step Pas
.Cells(Ligne_Insertion, 1) = DateAdd("m", (i * NbMois), CDate(Label_date.Caption) + (i * NbJour))
.Cells(Ligne_Insertion, 2) = ComboBox_debut.Value
.Cells(Ligne_Insertion, 3) = ComboBox_fin.Value
.Cells(Ligne_Insertion, 4) = ComboBox_pro.Value
.Cells(Ligne_Insertion, 5) = ComboBox_type.Value
.Cells(Ligne_Insertion, 6) = ComboBox_meeting.Value
.Cells(Ligne_Insertion, 7).Formula = "=IF(A" & Ligne_Insertion & "="""","""",I" & Ligne_Insertion & "&A" & Ligne_Insertion & "&""|""&COUNTIFS($A$2:A" & Ligne_Insertion & ",A" & Ligne_Insertion & ",$I$2:I" & Ligne_Insertion & ",I" & Ligne_Insertion & "))"
.Cells(Ligne_Insertion, 8).Formula = "=I" & Ligne_Insertion & "&A" & Ligne_Insertion & " &ROUND(B" & Ligne_Insertion & ",4)"
.Cells(Ligne_Insertion, 9) = NomSalle
Ligne_Insertion = Ligne_Insertion + 1
Next i
' le tri suivant la date et heure début
Ligne_Insertion = .Range("A" & Rows.Count).End(xlUp).Row
.Range("A2:J" & Ligne_Insertion).Sort key1:=.Range("A2"), order1:=xlAscending, dataoption1:=xlSortNormal, _
key2:=.Range("B2"), order2:=xlAscending, dataoption2:=xlSortNormal, Header:=xlNo
End With
Application.Calculation = ModeCalcul
If Me.OpB_allmonth = True Or Me.OpB_allweeks = True Then
MsgBox "Réservation " & NomSalle & " :" & Chr(10) & Chr(10) & "de " & Format(ComboBox_debut, "HH:mm") & " à " & Format(ComboBox_fin, "HH:mm") & Chr(10) & "du " & Format(Label_date, "Dddd dd mmmm yyyy") & Chr(10) & "au " & Format(ladate, "Dddd dd mmmm yyyy"), 64, ""
Else: MsgBox "Réservation " & NomSalle & " :" & Chr(10) & Chr(10) & "de " & Format(ComboBox_debut, "HH:mm") & " à " & Format(ComboBox_fin, "HH:mm") & Chr(10) & "le " & Format(ladate, "Dddd dd mmmm yyyy"), 64, ""
End If
Unload Me
End If
End SubVoilà pour ma demande,
Merci d'avance aux VBAistes.
Leakim
Bonjour Leakim,
Je ne dois pas être réveillé
Dans tout ce que tu dis, que souhaites exactement ?
Bonjour BrunoM45,
Dans tout ce que je dis, j'aimerai pouvoir avoir une piste pour inclure dans le code un test de fin de boucle pour les semaines et faire appel à la fonction de eriiic pour que la boucle des mois.
Je sais que c'est pas facile d'aborder un projet aussi avancé... C'est parfois pas simple de s'imprégner.
Merci de ton intérêt,
Leakim
Bonjour,
Pas sûr (même certain) de bien comprendre non plus...
Le but de la fonction demandée à l'époque était : en lui fournissant une date au 2ème mardi du mois par exemple, retourner la date de 2ème mardi du mois suivant.
Si tu veux une réservation toutes les semaines ou tous les 15 jours tu fais +7 ou +14 et ça tombera le même jour de semaine.
Pourquoi tu voudrais utiliser cette fonction ? Elle n'est pas du tout adaptée à ça.
Le principe éventuel : quand tu fais ta boucle calcule en premier le 01 du mois suivant (donc 01-10-15 pour ton exemple) et si ta date calculée est >= tu ne l'inscris pas et tu sors de la boucle.
Mais tu ferais mieux de demander le nombre de réservations voulues ou la date de fin et la respecter (libre à l'utilisateur de saisir le 12 ou le 30 du mois) et sortir dès que c'est atteint.
Sinon tu devrais donner un exemple complet et précis pour ton pb.
eric
Bonjour Eriiic,
Je suis visiblement pas clair
Tu as raison pour les réservations semaines, ta fonction n'est pas faite pour cela. Je vais creuser ta proposition du nombre de semaines.
Pour les mois c'est bien ce que tu dis que je veux faire... mais je suis perdu sur les modif dans le code.
Pour l'exemple tu trouveras sur le fichier que j'ai joins avec c-joint.
Merci pour ton suivi,
Leakim
Ah oui, je n'ai pas ouvert.
Tu devrais mettre un petit modop sur l'utilisation, quelle procédure est en cause, son emplacement. Et un exemple de saisie avec le résultat mauvais et celui attendu.
Ca évite que les personnes intéressées passent 1/4h-1/2h à essayer de comprendre et de partir sur un mauvais truc.
Mais ça reste ouvert à tout le monde, j'ai d'autres trucs en route.
C'était surtout pour essayer d'éclaircir le sujet comme j'avais qq souvenirs.
eric
suite...
Je me suis penché un peu dessus.
Si j'ai bien compris (pas sûr) avec :
ElseIf Me.OpB_allweeks = True Then
FinBoucle = Application.WorksheetFunction.WeekNum(DateSerial(year(ladate), Month(ladate) + ComboBox_month.ListIndex + 1, 0)) - Application.WorksheetFunction.WeekNum(ladate)
NbJour = 7parfois tu te retrouves en octobre alors qu'une fin a été demandée en septembre et tu veux -1 à FinBoucle ?
Si c'est ça, essaie avec cette rustine à mettre après ces 3 lignes. Sans exemple qui va mal je n'ai pas eu le courage de contrôler et modifier ta formule de calcul de boucle.
If Format(DateAdd("m", (FinBoucle * NbMois), CDate(Label_date.Caption) + (FinBoucle * NbJour)), "mmmm") <> LCase(ComboBox_month) Then FinBoucle = FinBoucle - 1eric
Bonjour Eriiic et les autres,
Je dois confirmer que je suis vraiment pas vendeur sur mon projet
En même temps en faisant comme çà, j'ai reçu des propositions auxquelles je n'ai pas pensées
Je voulais te remercier Eriiic pour ta rustine
MERCI !
Je valide résolu sur la moitié de mon problème bug réservation semaine
Reste mon bug avec les réservations mensuelles.
En espérant avoir encore de votre soutien.
Cordialement,
Leakim
Bonjour,
Parce qu'il y avait 2 questions ?
J'ai beau relire je ne vois pas la 2nde...
eric
Bonjour,
Décidément, je suis nul pour communiquer
Je vais continuer sur avec un autre post. Car, oui j'ai toujours un bug pour les réservations sur plusieurs mois. J’avais en tête d'utiliser la fonction perso que Eriiic avait proposé, mais je ne parviens pas à l'intégrer à mon code.
Je clôture ce post qui est résolu et je reviens avec mon ultime bug en espérant être clair dans ma demande. J'ai compris qu'il faut que je fasse un tuto.
Merci encore et à bientôt,
Leakim