Plusieurs classeurs ouverts exploitent un autre classeur en commun en VBA
Bonjour,
Savez-vous si cette solution de collaboration d'une équipe RH sur excel VBA peut fonctionner ?
étant donné qu'on passe en lectureseule lorsque qu'un excel est déjà ouvert par un membre et qu'on ne peut ainsi pas accéder aux userform en LS.
L'idée :
Sur un dossier en réseau, 3 fichiers excel :
- 1 fichier contenant les données salariés (NOM, Contrat, Taux horaire) (nom du fichier: BDD)
- 2 fichiers (identiques, sauf leur nom (noms des fichiers: Utilisateur1 ; Utilisateur2)) contenant des Userform et Macros et une feuille où les données de la feuil1 de BDD y sont reliées (données externes).
Fonctionnement :
Léa ouvre Utilisateur1 & Léo ouvre Utilisateur2
A l'ouverture de ces fichiers, le code " ActiveWorkbook.RefreshAll " rafraichit les données externes issues de BDD
Léa clique sur un salarié dans son Userform, et la fiche de ce salarié s'ouvre dans une autre feuille userform (à partir des données externes issues de BDD, extrait dans la feuille d'extraction du classeur Utilisateur1). Elle modifie un champ de la fiche salarié (le type de Contrat) et ainsi, une macro se lance pour ouvrir le classeur BDD, faire la modification dans la bonne ligne de BDD en fonction des données entrées sur Utilisateur1, fermer BDD, puis " ActiveWorkbook.RefreshAll " sur Utilisateur1.
Léo lui, verra la modification dans son fichier Utilisateur2 sous 1 min. car le rafraichissement RefreshAll s'effectue toutes les deux minutes.
Question :
Pensez-vous que ce projet est possible ?
Si oui, la seule chose dont j'ai besoin : le code qui va effectuer la modification (de l'ouverture du fichier BDD jusqu'à sa fermeture)
''''''Attention, si au même moment donné, Léa et Léo lancent une modification, un des deux sera bloqué car le fichier BDD sera déjà ouvert par la macro pour quelques secondes. Il faudra ainsi créer une boucle sur 30 secondes qui tentera pendant 30 secondes d'affilées de faire l'ouverture de BDD puis la modif. Si dans les 30 secondes, la modif n'a pas pu s'effectuer -> Msgbox pour donner l'info que la modif n'a pas pu être réalisée'''''''
Merci pour vos idées :)
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Sur un dossier en réseau, 3 fichiers excel :
- 1 fichier contenant les données salariés (NOM, Contrat, Taux horaire) (nom du fichier: BDD)
- 2 fichiers (identiques, sauf leur nom (noms des fichiers: Utilisateur1 ; Utilisateur2)) contenant des Userform et Macros et une feuille où les données de la feuil1 de BDD y sont reliées (données externes).
Sur un dossier en réseau, 2 fichiers excel :
- 1 fichier contenant les données salariés (NOM, Contrat, Taux horaire) (nom du fichier: BDD)
- 1 fichier partagé : Utilisateur contenant les Userforms et Macros et une feuille où les données de la feuil1 de BDD y sont reliées (données externes).
Fonctionnement :
Léa ouvre Utilisateur et le fichier BDD en lecture seule.
Léa clique sur un salarié dans son Userform, et la fiche de ce salarié s'ouvre dans une autre feuille userform (à partir des données externes issues de BDD, extrait dans la feuille d'extraction du classeur Utilisateur1). Elle modifie un champ de la fiche salarié (le type de Contrat) et ainsi une macro se lance pour fermer la BDD en lecture seule et l'ouvrir en mise à jour si elle ne l''est pas déjà ouverte en ce mode par un autre utilisateur (auquel cas la macro se met en attente jusqu'à ce que la BDD soit disponible).
Une fois la modification effectuée dans la BDD, fermeture de celle-ci et réouverture en lecture seule.
NB: l'attente éventuelle pour l'ouverture de la BDD en mise à jour ne doit être que du temps CPU et surtout pas du temps de saisie d'un autre utilisateur.
ci-dessous exemple de boucle d'attente de 5 secondes pour ouverture en mise à jour
'// Contrôle accès en maj du classeur sinon attente 5 secondes ...........................................
attente_max = Timer + 60 'attente maximum = 60 secondes
While IsFileOpenForWrite(nom_fichier)
If Timer > attente_max Then erreur_accès = True: raison_erreur = "fichier BDD verrouillé par un autre utilisateur ": Exit Sub
date_fin = DateAdd("s", 5, Now)
Application.Wait date_fin
Wend
Function IsFileOpenForWrite(ByVal nom_fichier As String) As Boolean
Dim no_fichier As Long
On Error Resume Next
no_fichier = FreeFile()
Open nom_fichier For Binary Access Read Lock Read Write As #no_fichier
If Err.Number = 0 Then IsFileOpenForWrite = False _
Else IsFileOpenForWrite = True
Close no_fichier
End Function