Solution multi-utilisateurs avec macros, base de données
Bonjour !
Je réalise actuellement une sorte de logiciel d'exploitation sur Excel.
Le classeur est constitué de 5 feuilles principales, la première proposant plusieurs boutons ouvrant des userforms pour enregistrer sur les autres feuilles des fiches client, fiches partenaires, ainsi que créer des feuilles de mission, sous forme d'une ligne pour chaque fiche. Ces fiches pourront être éditées en double cliquant dessus (cela réouvrira l'userform rempli).
Le but étant que de deux à cinq utilisateurs puissent en même temps utiliser les boutons, remplir des userforms (jusqu'ici pas de problème), et voir apparaitre rapidement des lignes créées par les autres utilisateurs pour pouvoir les éditer si nécessaire.
J'ai essayé la solution classeur partagé mais malheureusement à chaque modification les autres utilisateurs voient apparaitre le message qui propose de rouvrir le classeur, ou dans le pire des cas ils subissent des échecs de téléchargement.
Je viens donc vers vous pour vous demander quelle solution vous parait la plus adaptée pour permettre la co-édition live de ce genre de classeur.
J'ai pensé à un système ou les infos saisies dans l'userform sont stockées dans une base de données unique en arrière plan, puis redistribuées dans les classeurs de chacun des utilisateurs, mais aucune idée de comment faire ni quel logiciel utiliser si nécessaire d'en avoir un autre.
J'ai joint un classeur type, il n'y a pas la fonction de réédition des fiches mais si on peut synchro le tableau "A TRAITER", je pense que le reste ne sera pas un problème.
Je vous remercie d'avance !
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Tout d'abord, il faut savoir que gérer le partage de modification de données n'est pas simple sous Excel, au contraire d'Access où c'est géré automatiquement.
Si vous voulez néanmoins vous lancer dans cette opération, la meilleure façon de procéder est la suivante :
1- séparer code et données en 2 classeurs distincts, le classeur de code étant en accès partagé et le classeur de données en accès normal
2- au niveau du code, programmer séparément :
un accès en lecture seule,
un accès en mise à jour sur le classeur de données avec une boucle d'attente de disponibilité d'accès exclusif en écriture,
avec le classeur de données masqué.
ci-dessous exemple :
Option Explicit
Dim nom_fichier As String
Dim wb_base As Workbook
Dim erreur_accès As Boolean
Public Sub ouverture_lecture()
'// ouverture fichier en lecture
erreur_accès = False
Application.DisplayAlerts = False
On Error Resume Next
Set wb_base = Workbooks.Open(Filename:=nom_fichier, ReadOnly:=True)
If Err.Number <> 0 Then erreur_accès = True: raison_erreur = "erreur ouverture fichier BDD " & Err.Description: Exit Sub
wb_base.Windows(1).Visible = False
Application.DisplayAlerts = True
End Sub
Public Sub ouverture_maj()
Dim attente_max As Date, date_fin As Date
'// Contrôle accès en maj du classeur sinon attente 5 secondes ...........................................
erreur_accès = False
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
'// ouverture fichier en mise à jour
Application.ScreenUpdating = False
If Not wb_base Is Nothing Then wb_base.Close savechanges:=False
Set wb_base = Workbooks.Open(Filename:=nom_fichier): wb_base.Windows(1).Visible = False
Application.ScreenUpdating = True
End Sub
Public Sub fermeture_maj()
'// Fermeture et Actualisation du classeur
Application.ScreenUpdating = False
wb_base.Windows(1).Visible = True
wb_base.Close savechanges:=True
'// Réouverture fichier en lecture
Set wb_base = Workbooks.Open(Filename:=nom_fichier, ReadOnly:=True): wb_base.Windows(1).Visible = False
Application.ScreenUpdating = True
End Sub
Public Sub fermeture_sans_maj()
'// Fermeture du classeur
wb_base.Close savechanges:=False
End Sub
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 FunctionBonjour,
Merci beaucoup pour votre réponse thev, je vais me pencher sur cette solution.
En faisant quelques tests, j'ai conclu que le problème se passe quand un userform modifie des cellules.
J'ai créé une procédure, qui se synchronise très bien si exécutée depuis Développeur>Macros.
Mais quand je lance cette même procédure par l'intermédiaire d'un userform (un simple commandbutton dans l'userform), la modification n'est pas visible chez les autres utilisateurs et nécessite pour cela de rouvrir le classeur partagé.
Une idée la dessus ?
Merci !