Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
Voici un nouveau projet qui semble être plutôt interessant.
J'ai un classeur avec une page d'accueil que l'on pourra considérer comme récapitulative, ainsi que des feuilles associées à des utilisateurs que l'on considerera comme espaces de travail.
Les rouages de cet outil sont expliqués dans le fichier joint vierge de code VBA pour le momment .
Merci d'avance à tous pour votre aide et vos propositions.
J'aime beaucoup votre travail et il pourrait tout à fait correspondre à ce que je souhaite.
Serait-il possible de bloquer la modification ou la suppression d'une réservation uniquement à l'utilisateur qui l'a faite ?
Et par conséqent, serait-il possible de donner plus de droits à un administrateur ?
Au travail, il est aisé de détecter le nom des utilisateurs avec cette fonction :
Code:
Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
(ByVal lpBuffer As String, nSize As Long) As Long
Function OSUserName() As String 'extrait d'un code de Paul, Dave Peterson Exelabo
Dim Buffer As String * 256
Dim BuffLen As Long
BuffLen = 256
If GetUserName(Buffer, BuffLen) Then _
OSUserName = Left(Buffer, BuffLen - 1)
End Function
Sub CTest()
MsgBox OSUserName
End Sub
L'username des collaborateurs correspond à leur identifiant.
Dans l'onglet "Données", j'ai ajouté 3 colonnes après "pro" :
- Code user pro (identifiant correspondant au nom des pros)
- Administrateur (liste les noms des admin comme la colonne pro liste les noms des utilisateurs)
- Code user admin (identifiant correspondant au nom des admin)
A l'ouverture du classeur (Workbook_Open()), je détecte si l'utilisateur du fichier se situe dans la liste admin ou utilisateur, et j'ai ajouté des conditions devant les procédures en fonction de cette détection.
D'ailleurs, à l'ouverture, un collaborateur qui ne se trouve dans aucune des deux listes, voit un message d'avertissement lui indiquant qu'il n'est pas autorisé à utiliser cette application et l'application se referme.
Pour limiter les droits de modification des utilisateurs, je compare leur nom (pro) aux informations stockés dans la feuille BD_CAL ou en récupérant directement le nom de l'utilisateur qui a effectué la réservation sur la feuille "Calendrier", puisqu'il s'affiche en colonne E (vue à la journée découpée par tranche de 30 minutes), le nom du réservataire, un tiret, le type de réunion, un tiret et l'objet de la réunion. De ce résultat, je récupère le nom du réservataire et le compare à l'utilisateur en cours. Si c'est le même, l'usf s'ouvre et les boutons "modifier" et "supprimer" apparaissent, si ce n'est pas le même, un message bloquant s'affiche et indique qu'il n'est pas possible de modifier la réservation d'un autre utilisateur.
En revanche, un admin pourra lui modifier ou supprimer n'importe qu'elle réservation.
J'ai également modifié le message d'avertissement sur une réservation qui empiéterait sur une autre, en affichant non plus l'heure de début de la réservation qui est en train d'essayer de se faire, mais en affichant l'horaire qui est déjà réservé et qui bloque la réservation en cours.
J'ai également modifié la détection des réservations dans la base, car si l'on fait trois réservations identiques en tout point, sauf la salle (donc en réalité trois réservations différentes), la recherche prenait la première valeur trouvée et ce indépendamment de la salle réservée.
Exemple :
- pro1 réserve le 8/2/2014 de 12h à 12h30 en interne avec un objet "test1", la salle numéro 1
- pro1 réserve le 8/2/2014 de 12h à 12h30 en interne avec un objet "test1", la salle numéro 2
- pro1 réserve le 8/2/2014 de 12h à 12h30 en interne avec un objet "test1", la salle numéro 3
Si je retourne sur les réservations du 8/2/2014 de la salle numéro 3, et que je double clic sur l'horaire de 12h pour modifier la réservation, le numéro de ligne qui était pris était celui de la salle numéro 1.
Alors qu'il devrait prendre la ligne numéro 3 correspondant à la salle numéro 3.
Dans la réalité, ca devrait pas arriver, puisqu'un utilisateur ne pourra pas se retrouver à trois endroit différents en même temps. Mais pour le principe et dans l'éventualité de réservation effectuées en son nom pour le compte d'un autre collaborateurs, j'ai modifié cela.
Tout ce que je viens de raconter peut paraître flou, mais j'essai de t'envoyer le fichier la semaine prochaine, puisqu'il est sur mon pc au boulot.
J'ai enlevé la detection admin or user étant donné que je ne connais pas ton "osusername" et pour éviter qu'a l'ouverture le classeur ne se referme.
Aussi pour éviter les erreurs puisqu'il n'y a plus de pro et d'admin de renseignés dans la feuille "données"
J'ai essayé de commenter toutes mes modifications.
Je reste à disposition pour d'éventuelles questions ou remarques.
Private Sub ComboBox_debut_Change()
Dim J As Long
Me.ComboBox_fin.Clear
If Me.ComboBox_debut.ListIndex = -1 Then Exit Sub
With Sheets("Données")
If Me.ComboBox_debut.ListIndex + 3 = .Range("H" & Rows.Count).End(xlUp).Row + 1 Then
For J = Me.ComboBox_debut.ListIndex + 2 To .Range("H" & Rows.Count).End(xlUp).Row
Me.ComboBox_fin.AddItem .Range("H" & J).Text
Next J
Else
For J = Me.ComboBox_debut.ListIndex + 3 To .Range("H" & Rows.Count).End(xlUp).Row
Me.ComboBox_fin.AddItem .Range("H" & J).Text
Next J
End If
End With
End Sub
En effet, un double clic sur la cellule D33 de la feuille "Calendrier" générait une erreur.
J'ai également ajouté une vérification pour empècher une réservation sans durée. (Une réservation qui a pour début 8h et pour fin 8h n'a pas de durée).
Code:
'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éunion, merci.", 64
ElseIf Me.ComboBox_fin.ListIndex = -1 Then
MsgBox "Veuillez indiquer l'heure de fin de votre réunion, merci.", 64
ElseIf Me.ComboBox_pro.ListIndex = -1 Then
MsgBox "Veuillez indiquer votre nom, merci.", 64
ElseIf Me.TextBox_motif = "" Then
MsgBox "Veuillez indiquer le nom de votre réunion, merci.", 64
ElseIf Me.ComboBox_type.ListIndex = -1 Then
MsgBox "Veuillez indiquer le type de votre réunion, merci.", 64
ElseIf Me.ComboBox_debut.Value = Me.ComboBox_fin.Value Then 'Ajout d'une vérification
MsgBox "Votre heure de début et votre heure de fin ne doivent pas être identiques.", 64
Else 'Si OK
Bonsoir,
Joli travail !!
Pour l'erreur en D33, moi j'ai fait plus simple j'ai figer cette cellule en la protégeant !!!
Pour les horaires, je ne vois pas début 8h00 fin 8h00 c'est pas possible car les listes sont liées et décalées d'une demie heure??
A moins que j'ai mis une version sans c'est upload... auquel cas, ne criez pas trop fort ;-)
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.