Réduire à 1 seconde la fréquence de synchronisation des classeurs partagés ?

EtienneChouard

XLDnaute Nouveau
Réduire à 1 seconde la fréquence de synchronisation des classeurs partagés ?

Bonjour à tous,

Les classeurs Excel peuvent être partagés sur un serveur, et Excel accepte alors que plusieurs personnes travaillent en même temps sur le même classeur, à condition que ce ne soit pas sur la même cellule en même temps.

De temps en temps, Excel synchronise les versions affichées par chacun, mais la fréquence de la synchro est de 5 minutes minimum, ce qui permet (malheureusement) à un utilisateur de commencer à écrire sur une nouvelle ligne de table, et de s'apercevoir (trop tard) qu'il a travaillé pour rien parce qu'un autre utilisateur a lui aussi commencé à travailler sur cette même ligne depuis 4 minutes 30 (moins de 5 minutes)…

Excel propose une résolution des conflits, mais à la hache, apparemment : l'un des utilisateurs va gagner (à l'issue d'une boîte de dialogue, sa saisie à lui va être validée) et tous les autres utilisateurs vont perdre tout leur travail...

Comment empêcher cette collision en PRÉVENANT le problème, au lieu de se contenter de le soigner après-coup, plus ou moins bien ? C'est la question qui m'amène à vous :)

____


Prenons une table, à compléter et à tenir à jour à plusieurs.

Si quelqu'un CORRIGE une ligne existante de la table, le système proposé par Excel pour gérer un conflit éventuel peut convenir.

Mais si quelqu'un AJOUTE une nouvelle ligne à la table (dans la première cellule vide, en bas de la première colonne), comment vérifier que personne n'a déjà commencé à créer de son côté une autre "nouvelle ligne" au même endroit ? Et dans ce cas, si une autre utilisateur a déjà commené à bosser sur cette ligne, le code VBA pourrait choisir lui-même la ligne suivante comme "prochaine ligne à remplir" (sachant qu'un troisième utilisateur pourrait très bien débarquer à ce moment à son tour pour utiliser une des deux lignes, puisqu'il la croit vide, lui aussi).

• Première idée/suggestion : il me semble qu'une synchro réglée à une seconde (c'est-à-dire que, toutes les secondes, Excel rafraichirait l'image commune du classeur pour tous ceux qui l'ont ouvert à l'écran en ce moment) une synchro plus rapide, donc, permettrait de prévenir de façon élégante tous ces conflits.

Est-il possible de descendre au dessous des 5 minutes mini imposées par la commande Outils/Partager le classeur ?

Mais peut-être cette fréquence rapide a-t-elle des inconvénients (ralentissement général insupportable, peut-être ?) : le savez-vous ?



• Deuxième idée/suggestion : peut-on, lors de l'enregistrement sur disque à partir d'un poste, forcer la synchro sur tous les postes ouverts (y compris celui qui enregistre), de façon à être bien certain, juste après avoir enregistré, que la première ligne actuellement vide de la table n'est encore convoitée par personne : il suffirait alors dans notre code VBA d'enregistrer (et forcer la synchro) juste avant de localiser la première ligne vide pour un ajout dans la table ?


Qu'en pensez-vous ?


Merci pour votre aide précieuse.

Étienne.
 
C

Compte Supprimé 979

Guest
Re : Réduire à 1 seconde la fréquence de synchronisation des classeurs partagés ?

Bonjour Etienne Chouard,

Il suffit simplement, je pense, d'effectuer un enregistrement lorsque la personne à saisi une valeur dans la colonne A

Code à mettre dans ThisWorkbook
Code:
[COLOR=BLUE]Private Sub[/COLOR] Workbook_SheetChange([COLOR=BLUE]ByVal[/COLOR] Sh [COLOR=BLUE]As Object[/COLOR], [COLOR=BLUE]ByVal[/COLOR] Target [COLOR=BLUE]As[/COLOR] Range)
  [COLOR=BLUE]If Not[/COLOR] Intersect(Target, Sh.Range("A:A")) [COLOR=BLUE]Is Nothing Then[/COLOR]
    ThisWorkbook.Save
  [COLOR=BLUE]End If[/COLOR]
[COLOR=BLUE]End Sub[/COLOR]

Lors de l'enregistrement Excel va déterminer si il existe un conflit ou non

A tester

A+
 

EtienneChouard

XLDnaute Nouveau
Re : Réduire à 1 seconde la fréquence de synchronisation des classeurs partagés ?

Bonjour Bruno, merci :)

C'est une idée astucieuse et simple et je viens de l'essayer.

Ton code fonctionne parfaitement (Excel enregistre bien la BDD lors de chaque saisie ou correction dans la colonne A).

Mais ce chacal boiteux de tableur ne synchronise rien du tout lors de cet enregistrement :rolleyes: Autrement dit, les autres classeurs continuent à afficher les données qu'ils croyaient bonnes auparavant, comme si personne d'autre n'avait touché à rien...

J'ai essayé de sauver AUSSI AVANT de chercher la prochaine cellule vide (en imaginant que cette opération d'enregistrement allait forcer Excel à croiser les tâches diverses en cours), mais cela ne change rien :(

Ce qu'il nous faut, il me semble, c'est bien un ordre VBA de synchronisation forcée, ou bien une manip pour réduire à très peu (1 seconde ?) la fréquence de synchro de la commande Outils/Partager ce classeur.

En tout cas, merci pour le coup de main :)

Étienne.
 
Dernière édition:
C

Compte Supprimé 979

Guest
Re : Réduire à 1 seconde la fréquence de synchronisation des classeurs partagés ?

Re,

Désolé, mais je ne comprends pas bien ou se situe le problème :confused:

Normalement cela devrait fonctionner de la sorte :
À propos des classeurs partagés - Excel - Microsoft Office

Perso, au boulot, je n'ai aucun soucis

Et comme le dis si bien Kiki29, il semble illusoire voir impensable de faire la synchro toutes les secondes :eek:

A+
 

EtienneChouard

XLDnaute Nouveau
Re : Réduire à 1 seconde la fréquence de synchronisation des classeurs partagés ?

Chers Kiki29 et BrunoM45, merci :)

Finalement, en enregistrant le classeur partagé avant l'ajout de ligne et après l'ajout de ligne, ça fonctionne. Je vous remercie et je suis un peu gêné de vous déranger pour pas grand-chose au final.


Il me reste quand même une panne résiduelle quand plusieurs personnes lancent l'ordre de sauvegarde (ActiveWorkbook.Save) exactement en même temps : le classeur partagé est alors verrouillé (par le premier) pendant le court laps de temps de l'écriture disque (c'est normal) et l'autre reçoit une erreur et une classique invitation au débogage assez peu digeste.


J'aurais trois questions complémentaires à poser aux experts :

1) Quelle est, d'après vous, la façon la plus élégante pour gérer cette erreur ("Erreur d'exécution 1004 : ce fichier a été verrouillé en enregistrement par xxx. Essayez à nouveau plus tard"), c'est-à-dire pour repérer le conflit que déclenche l'instruction Save, attendre un peu et poursuivre ?

2) Puis-je verrouiller moi-même ce classeur, plus longtemps encore que pendant le strict moment de l'écriture disque, je veux dire pendant la très courte période entre mes deux enregistrements (entre l'enregistrement AVANT et l'enregistrement APRÈS) ? car, pendant une ou deux secondes, ce serait bien que personne ne touche au classeur ?

3) Y a-t-il une façon de savoir (et afficher ?) qui travaille en ce moment sur le classeur partagé ? Cela permettrait peut-être d'anticiper les conflits pour les éviter. Parfois, ce serait intéressant pour les utilisateurs de savoir qui bosse avec eux sur le classeur.

Mille mercis.

Amicalement.

Étienne.
 

EtienneChouard

XLDnaute Nouveau
Re : Réduire à 1 seconde la fréquence de synchronisation des classeurs partagés ?

Bonjour à tous,

Sur le site de Microsoft, j'ai trouvé ça XL2000 : Enregistrement de message d'erreur «Ce fichier a été verrouillé» partagé le classeur.

Le problème est décrit et sa solution manuelle est proposée, mais bizarrement, je ne trouve rien (ni sur le site de Microsoft, ni sur ce forum, ni même sur Internet...) sur la gestion de cette erreur en VBA pour l'éviter : pour éviter une interruption du programme, il faudrait 1) repérer l'erreur et, en boucle, 2) attendre un peu et 3) recommencer deux secondes plus tard.

Pour ceux qui auraient le même problème que moi, voici ce que j'ai programmé (et qui semble fonctionner)
pour attendre en cas de conflit causé par des enregistrements exactement simultanés d'un classeur partagé :

En début de procédure :

Code:
    'Active la routine de gestion des erreurs
    On Error GoTo GESTION_DES_ERREURS

Et en fin de procédure, juste avant End Sub, j'ai placé cette routine :

Code:
    Exit Sub   'Achèvement explicite de la procédure pour éviter de toujours enchaîner sur le traitement des erreurs

GESTION_DES_ERREURS:
    'Evalue le numéro de l'erreur
    NUM_ERREUR = Err.Number
    Select Case NUM_ERREUR
        Case 1004 'Conflit d'enregistrements simultanés et verrouillage du classeur BDD : 
                       'il faut attendre deux secondes :
            Application.Wait (Now + TimeValue("0:00:02"))
        Case Else
            'Gestion des autres erreurs éventuelles
    End Select
    Resume  'Reprise du programme au niveau de la ligne qui a déclenché l'erreur
    
End Sub

Auriez-vous la gentillesse de me signaler une maladresse, une cromagnonade velue ? :)

Par ailleurs, je cherche toujours le moyen de savoir (et afficher) qui travaille en ce moment sur le même classeur partagé que moi.
Si quelqu'un a une piste…

Merci à tous pour votre aide.

Amicalement.

Étienne.
 

JNP

XLDnaute Barbatruc
Re : Réduire à 1 seconde la fréquence de synchronisation des classeurs partagés ?

Bonjur le fil :),
Si tu actives le "Suivi des modifications", un commentaire est ajouté temporairement (durée à définir dans les options) à chaque modification. Ce commentaire comprends le nom de l'utilisateur ainsi que la modification effectuée ;).
Bonne journée :cool:
 

EtienneChouard

XLDnaute Nouveau
Re : Réduire à 1 seconde la fréquence de synchronisation des classeurs partagés ?

Salut JNP, et merci :)

Je n'avais pas remarqué que c'était un commentaire qu'Excel ajoutait aux modifs.

Mais encore faut-il le voir, ce commentaire... Ce sont des utilisateurs non experts qu'il s'agit d'informer (si on le peut).

N'y a-t-il donc aucun moyen de récupérer — avec une commande système peut-être ? — la liste des utilisateurs qui ont le classeur partagé ouvert à l'écran en ce moment ?

Amicalement.

Étienne.
 

JNP

XLDnaute Barbatruc
Re : Réduire à 1 seconde la fréquence de synchronisation des classeurs partagés ?

Re :),
Si tu demandes que les commentaires soient visibles, ça se verra comme le nez au milieu de la figure :p...
Avec une macro, tu peux décrire les commentaires, et en stockant l'utilisateur, récupérer la liste des utilisateurs qui ont modifié... dans le laps de temps prédéfini.
Bon courage :cool:
 

eriiic

XLDnaute Barbatruc
Re : Réduire à 1 seconde la fréquence de synchronisation des classeurs partagés ?

Bonjour,

Pas trouvé la réponse à ta dernière question, mais des methodes qui pourraient t'interesser (?) et peut-être te mener à ce que tu cherches :
GetUpdate
WorkspaceLastChangedBy
SharedWorkspaceMembers (?)

eric
 

EtienneChouard

XLDnaute Nouveau
Re : Réduire à 1 seconde la fréquence de synchronisation des classeurs partagés ?

Salut Eriiiic :)

C'est une bonne pioche, mais à partir de 2003 seulement :rolleyes:
Ces mots semblent inconnus de la version XP (celle que j'ai sur le serveur). :(

Merci pour le coup de main.

Étienne.
 

Discussions similaires

Réponses
3
Affichages
416
Réponses
25
Affichages
638

Statistiques des forums

Discussions
312 080
Messages
2 085 140
Membres
102 792
dernier inscrit
NKO