Mise à jour automatique d'un fichier entre 2 ordi
Bonjour
J'ai un problème de mise à jour automatique en temps réel de données entre 2 ordi.
Ordi 1 : j'ai un fichier A excel avec des données que je modifie en fonction de résultats d'une compétition.
Ordi 2 : J'ai un fichier B qui utilise les données du fichier A de l'ordi 1. Cer ordi 2 est relié à un vidéoprojecteur.
Les 2 ordi comuniquent par réseau Had oc.
Le problème que je rencontre, c'est que mon fichier B ne se met à jour que lorsque je l'ouvre. Je voudrais qu'à chaque modification sur le fichier A, automatiquement et en temps réel, le fichier B se mettent à jour, exactement la même chose que lorsque les 2 fichiers sont sur le même ordi.
Merci pour vos réponse
J'ai trouvé çà sur le forum
Est-ce que çà peut être une solution à mon problème?? Je ne suis pas un as du tout...Quelqu'un peut me valider çà avant que j'essaie et que je fasse des bêtises ???
CODE: TOUT SÉLECTIONNER
Sub auto_Open()
Call RefreshData
End Sub
Sub RefreshData()
Application.OnTime Now + TimeValue("00:00:30"), "RefreshData" 'toutes les 30 secondes
Application.CalculateFull
End Sub
J'ai essayé, mais çà ne marche pas
Bonjour,
Bien entendu c'est dans le classeur "B" que tu doit faire ça.
Dans le menu Excel ->> Outils ->> Options ->> Calcul
Mettre la propriété <Mode de calcul> sur Automatique
Voir si le paramètre Mise à jour des références hors programme est cocher, en principe il l'est par défaut.
Si ça marche pas faire un test.;
Les 2 classeurs ouvert sur les 2 PC
Modifier dans le classeur A
Taper F9 dans le classeur B : Si ça se met à jour tu dis j'expliquerais comment tu dois mettre tes sub.
Si ça va toujours pas, explique comment sont faite les liaisons du classeur B vers le A (un exemple des formules que tu a en B)
A+
Je te joins le fichier
Dans le menu Excel ->> Outils ->> Options ->> Calcul Je ne vois pas çà. J'ai excel 2010.
Pour l'instant, la seule possibilité que j'ai, c'est de rafraichir manuellement sur l'ordi B en faisant "DONNEES" puis "modifier les liens" puis "mettre à jour les valeurs". en ayant auparavant enrégistrer obligatoirement mon fichier A pour que cela fonctionne.
J'ai essayé F9, çà ne fait rien; çà actualise les calculs ( je le vois avec mon chrono en E2) mais pas le rapartiement des données.
c'est impossible pour moi d'intervenir sur mon ordi B une fois toutes mes vidéoprojection lancées pour avoir une vidéoprojection propre.
merci
Yvan
Dans ton profil-> Excel 2003
su 2010
Clic sur le bouton Excel (le rond au dessus à gauche), dans le bas à droite -> Option d'Excel
- >> Formules ->> Calcul sur automatique.
- >> Options avancées ->> Mise à jour des liaisons avec d'autre documents. (cocher)
Mais d'après ce que tu explique ce ne sera pas bon.
Ont va essayer..
Dans le classeur B
Dans l'iDE ->> Menu Insertion ->> Module
Dans la fenêtre qui s'ouvre tu colle ce code..
Sub RefreshData()
ActiveWorkbook.RefreshAll
End SubDans A tu fais une modif.
Dans B tu met le curseur sur le A de ActiveWorkbook et tu tape F5
Tu dis..
Si ça fonctionne je continuerais
Exact pour mon profil
Pour l'instant, je n'ai qu'un ordi sous la main, donc je ferai tes essais ce soir.
Par contre, je viens de faire une petite macro pour enregistrer la mise à jour manuel que j'arrive à faire.
Cela donne ces codes ( la référence du fichier source n'est pas la bonne parce que je n'avais pas mis le bonne source pour l'essai !!!)
Sub Macro1()
'
' Macro1 Macro
'
'
ActiveWorkbook.UpdateLink Name:= _
"C:\Users\Carré\Desktop\SAUVEGARDE Ordi Yvan 12 décembre 2012\SWIN\CHAMPIONNAT DE FRANCE 2013\BASE DE DONNEES RESULTATS CHAMPIONNAT DE FRANCE MESLAY 2013.xls" _
, Type:=xlExcelLinks
End Sub
Actuellement, dans le fichier que j'ai mis en ligne, il y a une macro "boucle" que j'ai récupéré dans un forum et qui marche très bien pour mettre en marche mon chronomètre.
Donc je me dis qu'en couplant les codes ci dessus et la marco " boucle", je ne vois pas pourquoi il n'y aurait pas un rafraissement total des données à chaque seconde !!!
Par contre, je suis incapable de savoir comment intégrer les codes ci dessus dans la macro "boucle"
Cette macro "boucle" est intéressante car je peux en sortir juste en faisant Ctrl+Pause....pour moi, c'est rassurant !!!
Par contre, cette macro "boucle " contient probablement des tas de choses qui sont peut être inutiles pour le cas présent.
Yvan
La macro Boucle ne sert STRICTEMENT A RIEN si la propriété Mode calcul est sur automatique.
Comment tu arrive dans cette sub ? il n'y a aucun appel pour y entrer ?
Essaye avec le code que j'ai mis dans mon poste précédant, ce devrait être la même chose que ce que tu a dans la macro que tu a fait mais en plus cour.
Tu dis aussi que la mise à jour ne se fait que si tu enregistre le classeur A, donc essaye aussi mon code après avoir sauver le A.
Quand tu ouvre le B, tu a un message pour autoriser les liaisons ? (quand je l'ouvre c'est ce que j'ai), si oui, tu dis j'expliquerais comment éviter ce message.
Donne un compte rendu complet de ce que tu a testé pour automatiser tout ça.
A+
La macro Boucle ne sert STRICTEMENT A RIEN si la propriété Mode calcul est sur automatique. Je suis incapable de te dire pourquoi, mais cette macro "boucle" permet à mon chrono en E2 de compter le temps passer depuis ma dernière mise à jour de résultats exactement comme sur une montre. Tout est en automatique, et pourtant, sans cette marco que j'exécute, le chrono reste fixe si je ne fait pas manuellement et continuellment "FORMULE" puis "Calculer maintenant". Moi, j'ai simplement fait un copier-coller d'une macro que j'ai trouvé dans un forum pour un tableau qui avait un chrono.
J'ai crée une marco en copiant collant ce que tu m'avais suggéré.
Sub RefreshData()
ActiveWorkbook.RefreshAll
End Sub
Quand j'active cette nouvelle macro, il ne se passe rien du tout pour la mise à jour des liens externes, même si j'ai sauvegardé les données du fichier A.
J'ai crée une autre macro
Sub Macro1()
'
' Macro1 Macro
'
'
ActiveWorkbook.UpdateLink Name:= _
"ADRESSE DU FICHIER SOURCE" _
, Type:=xlExcelLinks
End Sub
Quand j'active cette macro après avoir sauvegardé les données du fichier A, tous les liens sont mis à jour , et également le chrono. Par contre, cette actualisation ne se fait qu'une fois puisque que la macro n'est pas prévu en boucle.
La macro "boucle " qui se trouve dans le fichier me parait bien compliqué....mais pê est-ce pour pouvoir avoir une boucle et en sortir facilement en tapant Ctrl+Pause.....pour moi, c'est vraiment du chinois tout çà !!!!
Quels sont les risques de lancer une marco en boucle par rapport aux ressources de l'ordi? Lorsque je vais utiliser mes fichiers d'affichage ( J'en aurait 4 en tout = 4 ordi+4 écran + un ordi avec ma base de données) tous mes affichages seront ouverts et calés le matin à 7 h et resteront ainsi jusqu'à 19-20H. Peut-on laisser une macro en boucle pendant 12 13 heures sans que cela nuise par exemple à la rapidité d'affichage ou autre?
Au plaisir de te lire
Yvan
Re,
Aucun problème pour les macros elles peuvent tourner indéfiniment.
Ont va pouvoir passer au stade suivant..
A faire dans "tout" les fichiers B (3 classeurs si j'ai bien compris)
Dans l'IDE tu a la fenêtre du projet avec le nom des feuilles (si pas présent.. Ctrl+R)
Tu double clic sur ThisWorkBook, dans la nouvelle fenêtre tu copie...
Private Sub Workbook_Open()
RefreshData
End Submenu Insertion ->> Module ->> OK
Dans la nouvelle fenêtre tu copie le code ci-dessous
Sub RefreshData()
ActiveWorkbook.UpdateLink Name:= _
"C:\Users\Carré\Desktop\SAUVEGARDE Ordi Yvan 12 décembre 2012\SWIN\CHAMPIONNAT DE FRANCE 2013\BASE DE DONNEES RESULTATS CHAMPIONNAT DE FRANCE MESLAY 2013.xls" _
, Type:=xlExcelLinks
'toutes les 30 secondes, mais est-ce bien nécessaire aussi souvent ?
Application.OnTime Now + TimeValue("00:00:30"), "RefreshData"
End SubOublie pas de les sauver
Et c'est pas tout..
Dans le classeur A
Tu clic droit sur l'onglet de la feuille où tu modifie les données. et tu valide Visualiser le code
Dans cette fenêtre tu colle le code ci-dessous
Private Sub Worksheet_Change(ByVal Target As Range)
Changer = True
End SubToujours dans l'IDE..
Tu ouvre la fenêtre ThisWorkBook et tu colle le code ci-dessous
Private Sub Workbook_Open()
SauveQuandModif
End SubEt enfin, tu ajoute un module -> Insertion -> Module -> OK et tu colle le code ci-dessous
Public Changer As Boolean
Sub SauveQuandModif()
If Changer Then
ThisWorkbook.Save
Changer = False
End If
'toutes les 30 secondes, mais est-ce bien nécessaire aussi souvent ?
Application.OnTime Now + TimeValue("00:00:30"), "SauveQuandModif"
End SubÇa parait compliquer mais j'ai essayé d'être le plus précis possible et si tu suis bien ça devrait aller.
Le résultat devrait être...
Les classeurs B seront actualisés toute les 30 secondes mais à ta place je passerai au moins à une minute (00:01:00)
La macro dans le A Vérifie toutes les 30 secondes s'il y a eu une modification, si oui, sauve le classeur pour permettre la mise à jour des classeurs B
Il est bien évident que je n'ai pas ta configuration et que je ne peu rien tester.
Tu dis.
A+
Merci pour ton travail. Je vais essayer de faire çà dès que je pourrais !!!
Une question : Avec les macros que tu proposes, est-ce que mon chrono va fonctionner normalement de façon qu'on voit défiler les secondes avec le rafraicchissement toutes les 30 secondes que tu proposes?
Non, mais ont verras ça après.
Bonsoir
J'ai donc fait qq essais.
J'ai mis la partie ci dessosus dans le fichier B:
Tu double clic sur ThisWorkBook, dans la nouvelle fenêtre tu copie...
CODE: TOUT SÉLECTIONNER
Private Sub Workbook_Open()
RefreshData
End Sub
menu Insertion ->> Module ->> OK
Dans la nouvelle fenêtre tu copie le code ci-dessous
CODE: TOUT SÉLECTIONNER
Sub RefreshData()
ActiveWorkbook.UpdateLink Name:= _
"C:\Users\Carré\Desktop\SAUVEGARDE Ordi Yvan 12 décembre 2012\SWIN\CHAMPIONNAT DE FRANCE 2013\BASE DE DONNEES RESULTATS CHAMPIONNAT DE FRANCE MESLAY 2013.xls" _
, Type:=xlExcelLinks
'toutes les 30 secondes, mais est-ce bien nécessaire aussi souvent ?
Application.OnTime Now + TimeValue("00:00:30"), "RefreshData"
End Sub
Avec çà, çà marche impeccable pour les liens. Cela rafraichit le chrono, sauf qu'avec un rafraicchissement toutes les 30 sec, on ne voit pas les secondes défiler. J'ai donc mis avec rafraichissement toutes les secondes, mais çà ralentit mon fichier A pour les saisies. Donc tu as raison, rafraissement pas plus que toutes les 30 sec. , voir plus. Tant pis pour mon chrono !!!
Par contre, j'ai eu du mal à mettre dans la macro ( donc sur le fichier B) le chemin de la source. J'avais enregistré çà lorsque le fichier était sur l'ordi A, et je l'ai mis ensuite avec une clé USB sur l'ordi B pour faire un test. Je pensais qu'en ouvrant des fichiers sur tel ou tel ordi, les sources incluent dans les macros se mettaient à jour en fonction !!!!
Pour la suite de ce que tu me proposais de mettre dans le fichier A, je pense que cela ne va pas être adapté à mon fonctionnement le jour J. Vu que cela va aussi être saisi par d'autres personnes pendant ces 3 jours, je préfère que les gens choississent eux m^me le moment d'enregistrer le fichier de saisie....Cela leur permet d'avoir le temps de vérifer leurs saisies et leurs erreurs éventuelles.
Un grand Merci pour ton aide Lermite...
Encore une question : Lorsque j'ai mis un rafraichissement toutes les sec, j'ai pu constater une perturbation du déplacement de ma souris et de l'entrée des chiffres dans le fichier A. Que va t-il en être lorsque je vais avoir 4 ordi qui viendront chacun chercher des données sur le fichier A? Est-ce que cela va beaucoup perturber la vitesse de saisie de l'ordi A?
Je ne pense pas, c'est parce qu'en mettant toute les seconde tu réactive la macro alors qu'elle n'a pas encore terminer le processus en cour.
Tu ne sais pas faire un essai en condition réel ? Possible qu'il faudra synchroniser les requêtes pour qu'elles ne tombe pas en même temps.
Et je serais de toi je mettrais une minute, en tout les cas plus de 30 secondes.
Avec 4 ordi ? ça dépend de la vitesse du réseau
A+
Edit : pour le rafraîchissement de l'horloge tu peu réactiver la fonction Boucle, remplace-la par ce code
'Actualise la cellule E2 toute les secondes
Sub Boucle()
Static S As Integer
While True
If S <> Second(Now) Then 'pour éviter les raffraichissement inutile
S = Second(Now)
'Inutile de recalculer tout le classeur
Sheets("Feuil1").Range("E2").Calculate
End If
DoEvents
Wend
End SubEt si tu veux que ça démarre tu ajoute dans le ThisWorkbook_Open tout simplement Boucle
Private Sub Workbook_Open()
RefreshData
Boucle
End SubBonjour Lermite
Désolé d'avoir mis tant de temps à te donner de mes nouvelles.
J'ai donc fait tout ce que tu m'as dit. c'est super. La macro Boucle fonctionne comme je voulais.
Par contre, grosse lacune de ma part. Comment fait-on pour faire fonctionner 2 macros en même temps; Habituellement, pour lancer une macro, je vais dans macro, je choisis la macro puis exécuter. Mais là, impossible d'activer la 2 ème puisque la première tourne déjà.
J'ai cru comprendre que
Private Sub Workbook_Open()
RefreshData
Boucle
End Sub
était là pour lancer les 2 macros à l'ouverture du fichier. Sans doute que je me trompe !!!! remarque, je préfèrerai pouvoir les lancer moi même au moment que je choisis. comment je dois faire?
Je suis vraiment désolé d'être aussi popo....mais j'apprends des tas de choses grâce à ce défi !!!
Merci
Yvan
Re,
Exact, mais je ne vois pas pourquoi ça dérange de lancer les deux macros au départ !
Tu peu supprimer les deux lignes et les lancer différemment. Note que c'est la macro Boucle qui fait tourner le compteur.
A+
Et comment faut-il que je fasse pour lancer 2 macro en même temps?
En mettant un bouton (ActiveX et pas formulaire) sur la feuille et mettre le code dans le module de la feuille...
Private Sub CommandButton1_Click()
RefreshData
Boucle
End SubOu Alors tu va deux fois de suite dans Macro.
A+
En fait non, çà ne marche pas comme je le pensais
Les 2 macros s'exécutent, mais successivement et non pas simultanément.
J'ai fais un petit test avec 2 macros :
Sub Macro1()
'
' Macro1 Macro
'
'
Range("E7").Select
ActiveCell.FormulaR1C1 = "Macro 1"
Application.Wait (Now + TimeValue("0:00:05"))
End Sub
Sub Macro2()
'
' Macro2 Macro
'
'
Range("k10").Select
ActiveCell.FormulaR1C1 = "Macro 2"
End Sub
puis le bouton ActiveX
Private Sub CommandButton1_Click()
Macro1
Macro2
End Sub
Normalement, les mots macro 1 et macro 2 devraient s'afficher en même temps si les 2 macros étaient exécutées en même temps.
Et là, non, Macro 2 s'affiche avec 5 secondes de retard
Comment faire pour exécuter plusieurs macros en même temps???
Merci