[VBA] Intercepter la sauvegarde - et l'empecher si necessaire

:hello:

je suis actuellement en trai nde developper un petit script VBA pour l’application AutoCAD. Ce sript a pour but d’empecher qu’un utilisateur x vienne modifier et sauvegarder malencontreusement un plan editer par l’utilisateur Y.
Le systeme de protection d’Acad n’est pas satisfaisant donc je ne vois que cette solution.

Probleme: je n’arrive pas à empecher la sauvegarde.

ainsi VBA me propose l’evenement “beforesave” dans lequel je peux effectuer le code qui va bien AVANT que la sauvegarde soit faite, MAIS je ne trouve aucun moyen de “tuer” le processus de sauvegarde en cas de necessite (mauvais utilisateur => forcer le SaveAs) car une fois le code mis dans “beforesave” traité il fait d’une maniere ou d’une autre la sauvegarde.

j’ai essayer en interceptant la commande “save” mais le probleme est le meme: il lance quand meme la commande apres.

Connaissez vous un moyen dans VBA de tuer une action qui vient d’etre appellée ?

Par ex: l’evenement “beforeclose” permet d’emepcher la fermeture en lui mettant un False…

:sweet:

C’est la pause déjeuner, un peu de patience.
Mais le VBA d’autoCad, je ne sais pas s’il y en a beaucoup qui pratiquent.

En supposant qu’il y a des similitudes avec le VBA d’Office, tu as peut-être un argument “par référence” de type boolean (appelé Cancel ou autre). cad: “beforeSave(…, ByRef Cancel as boolean)”

Un Cancel=true dans le beforeSave dans ce cas et ça annule la sauvegarde.

Eventuellement, si tu ajoute "AtuoCad" dans ton titre, peut-êter que des spécialistes le verront mieux. :wink:

Sacré pause dejeuner dis moi :lol:… pas moins de 7 jours :ane:

je vais voir ce que tu dis. Est-ce que l’on peut mettre un argument par reference s’il n’y en a pas par defaut ?

je sais que beforeclose en a un du genre de ce que tu dis… peut-etre qu’il suffit que je mettre la meme chose :ane:

:MDR
je serais toujours paumé avec les dates, j’ai déjà fait des up de 1 an parce que j’avais oublié de regarder l’année :smiley:

Ben normalement c’est l’application Autocad qui fournit l’appel à la méthode, et la méthode vide. donc tu ne peux pas rajouter d’arguments, c’est eux qui le définissent.
essaye quand même des fois que ce soit une fonctionnalité “cachée”.

Sinon il faut sayer de trouver des attributs à l’objet qui manipule le fichier, il y a peut-être des attributs du style “saved”.

si tu positionne une flag de ce genr à “saved”, ça trompera autocad et il n’essayera pas de resauver.

voilà 2-3 infos pour chercher dans la doc d’autocad… que je n’ai pas trouvée. :smiley:

:ane:

Bon j’ai fait un essai ce matin en mettant:

Private Sub AcadDocument_BeginSave(Cancel As Boolean)

Cancel = True

End Sub

en lieu et place de:

Private Sub AcadDocument_BeginSave(ByVal FileName As String)

(...)

End Sub

Mais rien à faire il m’ejecte lors de la compilation en me disant:

:neutre:

C’est frustrant car il existe:

Private Sub AcadDocument_BeginDocClose(Cancel As Boolean)

Cancel = True

End Sub

qui marche tres bien …

et sous Excel par ex ça marche aussi parfaitement bien avec BeginSave :neutre:

:pfff:

quant à l’autre solution: il existe bien un parametres .saved mais il est en lecture seule :riva:

Le message d’erreur est explicite :“La déclaration de procédure ne correspond pas à la description de l’événement”.
Il faut que leur méthode soit prévue, avec les arguments donnés;, jai essayé de trouver de la doc, mais c’est pas très répandu, si tu as moyen de te procurer un livre.

Je n’y crois pas trop, mais tu peux encore faire une tentative avec:

Private Sub AcadDocument_BeginSave(ByVal FileName As String, byref Cancel as Boolean)

deja testé :neutre:… meme probleme.

A mon avis c’est pas possible :pfff:. C’est vraiment c#n et frustrant…

Je ne connais rien à Autocad, mais n’existe-t-il pas un moyen d’ouvrir les documents en lecture seul… Par comparaison à Office, quand on veut enregistrer un doc en lecture seul, il force le save as…

Peut-etre une piste vers une solution de contournement ?

je ne pense pas que ça pourrai aller.

En fait le but est le suivant:

  • Un espace de stockage collaboratif en reseau sur lequel tous les plans sont stockés.
  • Chaque dessinateur a ses propres projets sur lequels il travail.
  • Tous les dessinateurs ont libre acces aux plans des autres, pour pouvoir faire une impression ou une modification en cas d’absence du dessinateur du projet.
  • En cas de modification par un dessinateur autre il faudrait forcer la copie de sauvegarde et empecher l’ecrasement du fichier d’origine <= ça je n’arrive pas à mettre en place.
  • Nous n’avons pas acces aux proprietes de droits et acces de l’espace de stockage qui est “decentralisé”

Voilà…