Tranche horaire dans planning
Bonjour le forum,
J'ai un problème avec mon planning pour réserver sur 30 minutes et je ne trouve pas la solution.
J'ai une erreur d'execution 5,argument ou appel de procédure incorrect.
ci joint le code
Option Explicit
Private MaPlage As Range
Private CouleurUser As Integer
Dim Lig As Long, LigDeb As Long, LigFin As Long, Col As Integer, ColDebH As Integer, ColFinH As Long, IndCol As Integer
Private Sub CmBAnnuler_Click()
Unload Me
End Sub
Private Sub CmbValider_Click()
'Tester si tous les combo sont rempli avant d'appeler la fonction
If Me.ComboNomUtilisateur.Value = "" Then
Me.ComboNomUtilisateur.SetFocus
MsgBox "Merci de remplir le nom de l'utilisateur !"
Exit Sub
End If
If Me.ComboDateDébut.Value = "" Then
Me.ComboDateDébut.SetFocus
MsgBox "Merci de remplir la date de début !"
Exit Sub
End If
If Me.ComboDateFin.Value = "" Then
Me.ComboDateFin.SetFocus
MsgBox "Merci de remplir la date de fin !"
Exit Sub
End If
If Me.ComboHeureDébut.Value = "" Then
Me.ComboHeureDébut.SetFocus
MsgBox "Merci de remplir l'heure de debut !"
Exit Sub
End If
If Me.ComboHeureFin.Value = "" Then
Me.ComboHeureFin.SetFocus
MsgBox "Merci de remplir l'heure de fin !"
Exit Sub
End If
' Appeler la fonction
If ValidationReservation(Me.ComboNomUtilisateur, Me.ComboDateDébut, Me.ComboHeureDébut, Me.ComboDateFin, Me.ComboHeureFin) Then
Me.ListBoxVh.Visible = True
Me.LbInfo.Visible = True
Me.LbReservation.Visible = True
Else
MsgBox "Aucune réservation n'est possible dans cette plage horaire"
Me.ListBoxVh.Visible = False
Me.LbInfo.Visible = False
Me.LbReservation.Visible = False
Exit Sub
End If
End Sub
Public Function ValidationReservation(Nom As String, MaDateDeb As Date, HeureDebut As Date, MaDateFin As Date, HeureFin As Date) As Boolean
Dim MaFeuille As Worksheet, TabF As String
Dim IsLibre As Boolean
' Remplissage du tableau des feuilles à ne pas prendre en compte
TabF = "Jours ouvrés;Menu;Data;Params;Cadre;Impression"
'
' Calcul de la ligne de date de DEBUT
LigDeb = 3 + DatePart("y", MaDateDeb)
LigFin = 3 + DatePart("y", MaDateFin)
'
' Calcul la colonne d'heure DEBUT
ColDebH = Me.ComboHeureDébut.ListIndex + 2
'
' Calcul la colonne d'heure FIN
ColFinH = Me.ComboHeureFin.ListIndex + 1
'
' Vider la listbox de choix
Me.ListBoxVh.Clear
' Pour chaque feuille du classeur
For Each MaFeuille In Worksheets
IsLibre = True ' Mettre la variable à VRAI ici
' Si c'est une feuille de planning
If InStr(1, TabF, MaFeuille.Name, vbTextCompare) = 0 Then
' Pour chaque ligne de réservation
For Lig = LigDeb To LigFin
' Pour chaque colonne
For Col = ColDebH To ColFinH
' Si la cellule n'est pas vide
If MaFeuille.Cells(Lig, Col).Value <> "" Or MaFeuille.Cells(Lig, Col).MergeCells Then
IsLibre = False
Exit For
End If
Next Col
Next Lig
' La réservation est-elle possible
If IsLibre Then Me.ListBoxVh.AddItem (MaFeuille.Name)
End If
Next MaFeuille
ValidationReservation = (Me.ListBoxVh.ListCount > 0)
End Function
Private Sub ComboDateDébut_Change()
Me.ComboDateFin.Text = Me.ComboDateDébut.Text
End Sub
Private Sub ComboHeureDébut_Change()
If Me.ComboHeureFin.Value = "" Then
Me.ComboHeureFin.Text = Me.ComboHeureDébut.Text
End If
If TimeValue(Me.ComboHeureFin) < TimeValue(Me.ComboHeureDébut) Then
MsgBox "L'heure de fin ne peut pas être inférieure à l'heure de début", vbCritical, "ATTENTION ..."
Me.ComboHeureFin.Text = Me.ComboHeureDébut.Text
End If
End Sub
Private Sub ComboNomUtilisateur_AfterUpdate()
Dim NbVal As Integer, Rep
' Si le combobox est vide
If Me.ComboNomUtilisateur.Value = "" Then Exit Sub
' Max d'utilisateurs = 55
NbVal = Application.Evaluate("COUNTA(Params!A:A)")
If NbVal = 55 Then
MsgBox "Le nombre d'utilisateurs maximum est déjà atteint !"
Me.ComboNomUtilisateur.Value = ""
End If
' Si le nom a été saisi et n'existe pas dans la liste
If Me.ComboNomUtilisateur.ListIndex = -1 Then
Rep = MsgBox("Cet utilisateur n'existe pas dans la liste, voulez-vous le créer ?", vbQuestion + vbYesNo, "QUESTION ....")
If Rep = vbYes Then
' Seul l'administrateur à le droit => demander le mot de passe
UsFAdmin.Show
If ModeAdm = False Then Me.ComboNomUtilisateur.Value = "": Exit Sub
' Ajoute l'utilisateur à la liste
Sheets("Params").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = Me.ComboNomUtilisateur
' Ajoute l'utilisateur au combobox
Me.ComboNomUtilisateur.AddItem Me.ComboNomUtilisateur
End If
End If
End Sub
Private Sub ListBoxVh_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim TabF As String
Dim RUser As Range
' Remplissage du tableau des feuilles à ne pa sprendre en compte
TabF = "Jours ouvrés;Menu;Data;Params;Cadre;Impression"
'
' Calcul de la ligne de date de DEBUT
LigDeb = 3 + DateValue(Me.ComboDateDébut) - DateValue(Sheets("Jours ouvrés").Range("B4")) + 1
LigFin = 3 + DateValue(Me.ComboDateFin) - DateValue(Sheets("Jours ouvrés").Range("B4")) + 1
'
' Calcul la colonne d'heure DEBUT
IndCol = Abs(Minute(Me.ComboHeureDébut) = 30) ' Augmente d'une colonne si heure de début contient 1/2 heure
ColDebH = ((Int(TimeValue(Me.ComboHeureDébut) * 24) - 7 + 1) * 2) + IndCol
'
' Calcul la colonne d'heure FIN
IndCol = IIf(Minute(Me.ComboHeureFin) = 30, 0, -1) ' Diminue d'une colonne si heure de début contient 1/2 heure
ColFinH = ((Int(TimeValue(Me.ComboHeureFin) * 24) - 7 + 1) * 2) + IndCol
If ListBoxVh.Value <> "" Then
If LigDeb = LigFin Then
Set MaPlage = Range(Cells(LigDeb, ColDebH), Cells(LigDeb, ColFinH))
Else
' Traitement d'un écart de plusieurs dates
For Lig = LigDeb To LigFin
If Lig = LigDeb Then
Set MaPlage = Range(Cells(LigDeb, ColDebH), Cells(LigDeb, 25))
End If
If Lig > LigDeb And Lig < LigFin Then
Set MaPlage = Union(MaPlage, Range(Cells(Lig, 2), Cells(Lig, 25)))
End If
If Lig = LigFin Then
Set MaPlage = Union(MaPlage, Range(Cells(LigFin, 2), Cells(LigFin, ColFinH)))
End If
Next Lig
End If
' Récupérer la couleur du nom
Set RUser = Sheets("Params").Columns("A:A").Find(What:=ComboNomUtilisateur, After:=Range("A1"), LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
CouleurUser = RUser.Interior.ColorIndex
Set RUser = Nothing ' Effacer la variable objet
If InsertionData Then
If MiseEnFormeReservation(ListBoxVh.Value) Then
MsgBox "La réservation est enregistrée"
Else
MsgBox "Une erreur est survenue durant la mise en forme du calendrier" & vbCr & vbCr & "La réservation est enregistrée mais pas affiché dans le calendrier", vbCritical
End If
Else
MsgBox "Une erreur est survenue durant l'enregistrement" & vbCr & vbCr & "La réservation n'est pas enregistrée", vbCritical
End If
End If
End Sub
Private Function InsertionData() As Boolean
Dim resultat As Boolean
Dim LigneFin As Integer
On Error GoTo fin
With Sheets("Data")
LigneFin = .Range("A" & Rows.Count).End(xlUp).Row + 1
'Numéro de transaction
If LigneFin = 2 Then
.Cells(LigneFin, 1) = 1
Else
.Cells(LigneFin, 1) = .Cells(LigneFin - 1, 1).Value + 1
End If
'Nom utilisateur
.Cells(LigneFin, 2) = Me.ComboNomUtilisateur
'Objet
.Cells(LigneFin, 3) = Me.ListBoxVh.Value
'Date début
.Cells(LigneFin, 4) = DateValue(Me.ComboDateDébut.Value)
'Heure debut
.Cells(LigneFin, 5) = Me.ComboHeureDébut.Value
'Date fin
.Cells(LigneFin, 6) = DateValue(Me.ComboDateFin.Value)
'Heure fin
.Cells(LigneFin, 7) = Me.ComboHeureFin.Value
'Plage
.Cells(LigneFin, 8) = MaPlage.Address
'Commentaire
.Cells(LigneFin, 9) = Me.Commentaire.Value
End With
resultat = True
fin:
InsertionData = resultat
End Function
Private Function MiseEnFormeReservation(NomFeuille As String) As Boolean
Dim resultat As Boolean, FirstCel As String
'On Error GoTo fin
' Déprotéger la feuille
Call Protection(NomFeuille, False)
' Faire la mise en forme
With Sheets(NomFeuille)
' Inscrire le nom dans la première cellule
[color=#FF0000]FirstCel = Left(MaPlage.Address, InStr(1, MaPlage.Address, ":") - 1)[/color]
.Range(FirstCel).Value = Me.ComboNomUtilisateur
With .Range(MaPlage.Address)
.Merge
.Interior.ColorIndex = CouleurUser
'.HorizontalAlignment = xlCenter
.HorizontalAlignment = xlCenterAcrossSelection
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeRight).LineStyle = xlContinuous
'Ajout des commentaires
If Commentaire <> "" Then Sheets(NomFeuille).Range(FirstCel).AddComment Text:=Commentaire.Text
End With
End With
resultat = True
fin:
MiseEnFormeReservation = resultat
' Protéger la feuille
Call Protection(NomFeuille, True)
End Function
Private Sub UserForm_Initialize()
Dim Cell As Range
With Sheets("Params")
'affiche la liste des utilisateurs
For Each Cell In .Range("A2:A" & .Range("A65536").End(xlUp).Row)
ComboNomUtilisateur.AddItem (Cell)
Next
End With
With Sheets("Params")
' Inscrit les valeurs dans les listes déroulantes des dates
For Each Cell In .Range("B2:B" & .Range("B" & Rows.Count).End(xlUp).Row)
' N'afficher dans la liste que les jours ouvrés : du lundi au samedi
If Weekday(Cell, vbMonday) < 6 Then
Me.ComboDateDébut.AddItem (Cell)
Me.ComboDateFin.AddItem (Cell)
End If
Next
End With
With Sheets("Params")
' Inscrit les valeurs dans les listes déroulantes des heures
For Each Cell In .Range("C2:C" & .Range("C65536").End(xlUp).Row)
Me.ComboHeureDébut.AddItem Format((Cell), "hh:mm")
Me.ComboHeureFin.AddItem Format((Cell), "hh:mm")
Next
End With
ComboNomUtilisateur.Value = nom_utilisateur_de_poste
End Sub
Private Sub ClearFiche()
ComboNomUtilisateur.Text = ""
ComboDateDébut.Text = ""
ComboHeureDébut.Text = ""
ComboHeureFin.Text = ""
ListBoxVh.Clear
ListBoxVh.Visible = False
LbInfo.Visible = False
LbReservation.Visible = False
End Submerci pour votre aide et bonne journée à tous
Bonjour,
Sur ton cursus, tu en es à 63 messages dans ce forum....
Il m'étonne que tu puisses donner quelques 293 lignes de codes, contenant une erreur sans pour autant :
- spécifier à quelle ligne ce code erreur fait référence
- A la rigueur, joindre un fichier exemple, parce que je n'ai vraiment pas envie, tout comme mes collègues, d'essayer de recréer un fichier, avec USF, qui pourrait reproduire le même code d'erreur....
Donc, si tu veux une aide efficace, aide-nous à t'aider....
Bonne chance
RE,
Oups, j'ai mis la ligne en rouge mais oublié de le préciser dans message et a priori elle n'apparait pas en rouge!!!!
Donc c'est dans le module MiseEnFormeReservation à la ligne 9
Private Function MiseEnFormeReservation(NomFeuille As String) As Boolean
Dim resultat As Boolean, FirstCel As String
'On Error GoTo fin
' Déprotéger la feuille
Call Protection(NomFeuille, False)
' Faire la mise en forme
With Sheets(NomFeuille)
' Inscrire le nom dans la première cellule
<span style="color: #FF0000">FirstCel = Left(MaPlage.Address, InStr(1, MaPlage.Address, ":") - 1)</span>
.Range(FirstCel).Value = Me.ComboNomUtilisateur
With .Range(MaPlage.Address)
.Merge
.Interior.ColorIndex = CouleurUser
'.HorizontalAlignment = xlCenter
.HorizontalAlignment = xlCenterAcrossSelection
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeRight).LineStyle = xlContinuous
'Ajout des commentaires
If Commentaire <> "" Then Sheets(NomFeuille).Range(FirstCel).AddComment Text:=Commentaire.Text
End With
End With
resultat = True
fin:
MiseEnFormeReservation = resultat
' Protéger la feuille
Call Protection(NomFeuille, True)
End Functiondésolé
Re-,
Je vais essayer de te répondre, tout comme je tape sur mon clavier, c'est à dire sans regarder, donc sans filet.....
Dans la ligne qui te pose problème, à fortiori le seul terme qui pourrait te causer des soucis, serait "MaPlage"
Or, tu déclares cette variable en haut de module, en "Private"
Tu as une raison pour la déclarer en "Private"?
Sinon, la première cellule d'une "plage", peut être obtenue par cette simple ligne :
FirstCel = MaPlage(0).AddressMais je doute que l'erreur soit dans ta façon de trouver la première cellule de ta plage, mais plutôt dans ta déclaration de variable...
Mais tout ceci, en aveugle...
merci cousinhub pour ta réponse,
mais si je mets le code que tu me donne je perds le nom de la personne qui réserve dans la première cellule.
Re-,
Ma canne blanche vient de cesser de me soutenir....
Désolé, je ne travaille plus en aveugle....
Bon courage....
PS, un petit fichier exemple ne pourrait-il pas reproduire ton problème?
Sinon, ton fichier, sur cijoint, avec des données bidons....
Edit, et je viens de relire ta dernière réponse :
mais si je mets le code que tu me donne je perds le nom de la personne qui réserve dans la première cellule.
Je pourrais me tromper, mais si tu obtenais une réponse à cette ligne, "AVANT", donc le problème ne se situe pas à ce niveau.....
?????????????????????????????????????????????????????????????????????????????????????
Re,
je n'ai pas accès à ce site depuis mon micro entreprise,je le ferais de chez moi ce soir.
Bonne journée