Fermeture d'un classeur Excel en réseau à partir d'un autre classeur

Pietro_L Messages postés 5 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 16 mai 2007 - 15 mai 2007 à 13:52
Pietro_L Messages postés 5 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 16 mai 2007 - 16 mai 2007 à 14:24
Bonjour à tous,

J'ai un petit soucis VBA dont je n'arrive pas à trouver la solution. J'ai un classeur Excel mis a disposition sur un réseau.
Afin de mettre à jour ce classeur à partir d'un autre classeur Excel (stocké sur mon C où sont enregistrées mes macro VBA) j'ai besoin de fermer le classeur sur réseau. Je voudrais savoir s'il est possible en VBA de fermer le classeur situé sur le réseau, sachant qu'il a été ouvert par un autre utilisateur que moi.

PS: Les utilisateurs ne modifient jamais le classeur réseau (il sert juste à "visionner" des données)

D'avance merci pour vos réponses

<!-- / message -->

10 réponses

Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
15 mai 2007 à 14:35
Pouf, décidément il faut que je me re-lise mieu... Bon le problème est dans le PS.

PS : Je pence que le mieux c'est de crée ta macro coté serveur
dans un autre fichier (que celui que tu veut modifier), tu
ne le ferme jamais comme ça tu peut t'y reconnecter pour ré-ouvrir ton
fichier.

Bon courage

Amicalement
Pensez "Réponce acceptée"
1
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
15 mai 2007 à 14:30
Oui je pense que c'est possible mais attention ce n'est pas
si simple (ce serrais même plus facile en VB qu'en VBA mais à toi de voir). De
plus il faudra une macro des deux coté (soit une macro serveur et une client).





A mon havie il faut que tu crée une connections réseau entre tes deux fichier
Excel. Pour ça tu fais un Winsock.


Coté serveur et client

-> Pour commencé tu crée un form.

-> Une fois actif (afficher dans Visual Basic editor) tu ajoute le contrôle
"Micosoft WinSock Control"

-> Tu ajoute ce contrôle sur ta form

-> Tu configure le numéro de port (ATTENTION : il faut le même des deux coté
donc note le !!!)


Coté serveur

-> A l'évènement Workbook_Open tu charge le formulaire (ce dernier peut être
non visible, dans le form_load tu place la ligne de code "me.visible =
false")

-> A l'ouverture du formulaire tu 'dit' à ton objet WinSock d'ecouté un port
(sois d'attendre une connection, )

-> Sur l'évènement "ConnectionRequest" de ton objet Winsock tu accepte
la connections (avec la procédure "Accept")

-> Sur l'évènement "DataArrival" tu vérifie que la chaîne (ou
autre) reçu est bien celle attendu

-> Si cette dernière est OK tu ferme le document (avec "application.workbooks(NomFichier).close")


Coté client

-> Quand tu veut fermer le doc tu exécute la procédure "Connect"
de ton objet winsock à qui tu passe comme paramètre le nom réseau (ou l'IP) du
serveur et le numéro de port (celui noté plus haut)

-> Sur l'événement "Connect" de ton objet Winsock tu envoie la chaîne
(ou autre) qui vas bien (celle qui correspond à ta verif coté serveur) avec la
procédure "SendData"


Voila comme ça tu peut fermer un doc en réseau.


PS : Je pence que le mieux c'est de crée ta macro coté serveur dans un autre
fichier que celui que tu veut modifier et ce dernier tu ne le ferme jamais
comme ça tu peut t'y reconnecter pour ré-ouvrir ton fichier


Si tu à problème n'hésite pas mais avec ça tu dois t'en sortir bon courage






Amicalement



Pensez "Réponce acceptée"
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
15 mai 2007 à 14:32
Oups un oublie.
Pour ajouter le contrôle "Micosoft WinSock Control" c'est dans "outils" "contrôle suplémentaire"
A+
Amicalement
Pensez "Réponce acceptée"
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
15 mai 2007 à 14:54
Heeeee, je viens de re-lire ton problème et si c'est ce que je crois c'est encors plus chiant.
Quand tu dis "fermer le classeur situé sur le réseau" ce classeur est ouvert par pluseur utilisateur sur plusieur machinne ??? Si oui c'est <strike>la merde</strike> pas cool .
Dans ce cas il faut que sur tout les postes l'execution des macros soit autorisé par Excel (et ça posse des problème de sécurité très important). De plus le fichier vas se fermer sans avertire l'utilisateur (si non il faut que tu attende qu'ils valide le msgbox ou trouve un autre moyen de les prévenir)
Tu met ton contrôle WinSock sur le fichier partagé (oui celui que tu modifie)
Tu connect en WinSock TOUTE les machines du réseau et tu leur envoie la chaine demandant la fermeture

Problème si un utilisateur ré-ouvre le fichier avant que toute les machinne n'est été connecté et est fermer le fichier alors cela n'aura servie à rien (et ca c'est <strike>la merde</strike> heeeee, pas cool)

Si non tu ajoute un numéro de version à ton nom de ficheir et tu supprime le vieux une fois fermer.

Bon courage (si c'est ce que je crois tu vas en avoir besoin)

Amicalement
Pensez "Réponce acceptée"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Pietro_L Messages postés 5 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 16 mai 2007
15 mai 2007 à 16:58
C'est vrai que ça semble bien compliqué , je vais tout de même regarder cette piste
Sinon j'avais penser à la seconde solution mais pour cela je cherchais une commande système qui puisse me forcer la fermeture du classeur Excel réseau.
Si par hasard tu as ça je suis preneur.

Pietro_L
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
15 mai 2007 à 17:11
Que veut tu dire par "une commande système qui puisse me forcer la fermeture du classeur Excel réseau" :
Fermer un fichier ouvert sur plusieur poste
ou
Un fichier ouvert sur UN autre poste
si c'est un alors c'est jouable si non, dur, dur, c'est peut être jouable en VB mais en VBA vraiment dur.
On en re-discute demain.
A demain

Amicalement
Pensez "Réponce acceptée"
0
Pietro_L Messages postés 5 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 16 mai 2007
15 mai 2007 à 17:33
En fait je voulais passer une commande dans la fenêtre de commande Windows, du type Del ou erase (en forçant même si qqn l'a ouvert).

Merci pour tes conseil

Pietro_L
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
16 mai 2007 à 00:14
Une idée comme ça en passant...
Imagine qu'à chaque ouverture, ton programme crée un fichier dans le même répertoire avec le nom de l'usager. Lorsqu'il ferme l'application, tu "Kill" le fichier.

Comme ça, à chaque fois que tu veux faire une mise à jour, tu lis le répertoire pour trouver les usagers et tu leur envoies un message leur disant quelque chose comme "Veuillez fermer l'application... elle sera fermée dans 5 minutes"

Reste à mettre ça en place, mais je ne pense pas que ce soit trop compliqué...(?)

Une autre idée peut-être encore plus simple, selon le type de programme que tu gères (grosseur, complexité...)
Tu mets un Timer dans ton application qui lit le répertoire à chaque X minutes et recherche le fichier "update.xyz".
Quand tu es prêt à faire la mise à jour, tu crées ce fichier bidon dans ce répertoire.
Si le programme trouve le fichier, il envoie le message "fermeture dans 5 minutes"
Après 5 minutes, il se ferme et t'envoie un message ou un e-mail...
Tu fais ta mise à jour et effaces le fichier bidon.

À tester toutefois...

MPi
0
Pietro_L Messages postés 5 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 16 mai 2007
16 mai 2007 à 11:39
Merci bien pour tes idées je vais regarder tout ça et je te tiens au copurant.

Merci encore

Pietro_L
0
Pietro_L Messages postés 5 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 16 mai 2007
16 mai 2007 à 14:24
Rebonjour,


J'ai essayé de mettre mon classeur en partage pour pouvoir lancer la mise à jour des tableaux croisés dynamiques.


Voici le code:


Sheets("Global (RV+PB)").Select
    ActiveWorkbook.RefreshAll

 Voici le message d’erreur :

La méthode « RefreshAll » de l’objet ‘_Workbook’ a échoué..

Si qqn à une idée






Pietro_L
0
Rejoignez-nous