Microsoft 365 Désactiver et réactiver l'enregistrement avec VBA

clad187

XLDnaute Nouveau
Bonjour à tous,

J'ai un fichier Excel qui est une fiche de renseignement vierge, que je souhaite garder en l'état sur le serveur de l'entreprise. J'ai donc interdit l'enregistrement avec une Macro dans ThisWorkbook.

Ce que je souhaite à présent, c'est pouvoir enregistrer mon fichier via une autre macro qui me propose un nom prédéfini avec l'ouverture automatique de la fenêtre enregistrer sous.

Je rencontre donc deux problèmes :
1. La macro "enregistrer sous" ne fonctionne pas puisque j'ai interdire l'enregistrement du fichier. Existe-t-il une commande pour autoriser l'enregistrement lors de l'exécution de cette macro?
2. Une fois mon fichier enregistré avec un nouveau nom, celui-ci doit pouvoir être librement utilisé par l'utilisateur. Sauf que ma macro d'interdiction persiste. Est-il possible d'interdire l'enregistrement de mon fichier uniquement si le nom du fichier est "Formulaire_vierge.xlsm", et que dès que la macro "enregistrer sous" ait été exécutée, le fichier ayant un nouveau nom, la macro ne soit plus active ?

A toute fin utile, je joins le fichier.

Merci par avance pour votre aide ! :)
 

Pièces jointes

  • Formulaire_vierge.xlsm
    15.1 KB · Affichages: 30

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Clad,
Vous pouvez peut être exclure l'interdiction en limitant celle ci avec le nom du fichier :
VB:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If ThisWorkbook.Name = "Formulaire_vierge.xlsm" Then
        Cancel = True
    Else
        Cancel = False
    End If
End Sub
 

clad187

XLDnaute Nouveau
Bonjour Sylvanu,

Merci pour votre aide, cette commande fonctionne! :)
Avez-vous une idée pour exécuter la seconde macro qui consiste à ouvrir une fenêtre "Enregistrer sous"? Tant que le fichier n'a pas été renommé, cette macro ne peut pas être exécutée... Ce qui est plutôt logique en fait...

Merci par avance !
 

clad187

XLDnaute Nouveau
Bonjour Sylvanu,
Désolé pour ces réponses un peu erratiques dans le temps... C'est un projet sur lequel je n'ai que peu de temps pour travailler dessus...
Cette commande ne fonctionne pas, la macro dans "ThisWorbook" empêche justement l'enregistrement du fichier. Connaissez vous une commande pour désactiver "l'interdiction d'enregistrer" au moment d'exécuter la macro "enregistrer sous"?
Merci encore pour votre aide! :)
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, clad187, sylvanu

J'ai donc interdit l'enregistrement avec une Macro dans ThisWorkbook.
Excel ne sait pas interdire
(Il laisse la possibilité d'ouvrir un classeur sans activer les macros)

[Suggestions au passage]
Dans ce cas, pourquoi ne pas simplement utiliser un modèle?
(extension: *.xltm ou xltx)
ainsi le modèle n'est pas altéré
Et l'utilsateur final se contente de faire
Fichier/Nouveau/Fiche de renseignement
 

clad187

XLDnaute Nouveau
Bonjour Staple,
Le fichier joint n'est qu'une partie du fichier globale qui comprend plusieurs autres macros. Le fichier est utilisé successivement par plusieurs personnes au fil d'un processus interne à mon entreprise.

La première personne à l'utiliser est un technicien atelier d'une soixantaine d'année qui ne maitrise pas du tout l'informatique. Le but est donc qu'il ne puisse pas modifier le fichier initial (donc je supprime la possibilité de sauvegarder), mais qu'il puisse tout de même facilement faire un "enregistrer sous" avec un "gros bouton" au milieu de l'écran. La seule chose qui a été convenu avec ce technicien, c'est qu'il puisse choisir le dossier dans lequel il enregistre le fichier. D'où une macro "Enregistrer sous" qui n'impose pas une chemin prédéfini en imposant un répertoire.

Si vous avez une suggestion dans la manière de faire, je suis preneur! :)
 

Staple1600

XLDnaute Barbatruc
Re

J'ai déjà fait la suggestion, non?
Utilisez un modéle créé sous Excel en tant que modèle
(Extension: *.xltm ou *.xltx)

Et dans ce cas, pas de modification du fichier initial.
Puisque à chaque utilisation de Fichier/Nouveau on créé un document vierge à partir du modèle.

[aparté RH]
un technicien atelier d'une soixantaine d'année qui ne maitrise pas du tout l'informatique.
Et donc?
Quid de ceci?
 

clad187

XLDnaute Nouveau
Oui, je suis passé par un fichier .xltm, mais lorsque je veux sauvegarder, Excel me propose par défaut le format xlsx. Et le fait de pouvoir nommer le fichier comme on veut n'est pas une solution que je souhaite retenir. Le format doit impérativement être "TEXTE" & " " & Range().Value
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Essayez comme ça :
VB:
Option Explicit
Sub Save_As()
   Dim ChNomF As Variant
   ChNomF = Application.GetSaveAsFilename("TEXTE " & ActiveSheet.[A1].Value, _
      "Classeur Excel avec macros,*.xlsm")
   If VarType(ChNomF) <> vbString Then Exit Sub
   If Left$(Mid$(ChNomF, InStrRev(ChNomF, "\") + 1), 6) <> "TEXTE " Then
      MsgBox ChNomF & vbLf & "Le nom du classeur doit commener par ""TEXTE """, _
         vbCritical, "Enregistrer sous"
      Exit Sub: End If
   ActiveSheet.[A1].Value = Split(Split(ChNomF, ".xlsm")(0), "\TEXTE ")(1)
   ThisWorkbook.SaveAs ChNomF, xlOpenXMLWorkbookMacroEnabled
   End Sub
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

On peut aussi biaiser
Dans un module standard (stocké dans Personal.xlsb)
(avec un bouton associé à cette macro sur la QAT)
VB:
Sub Creer_NouveauClasseur()
Dim wb As Workbook
Set wb = Workbooks.Add("c:\temp\modele.xls")
End Sub
Et dans modele.xls, un procédure évenemnetielle (type BeforeClose), le code VBA idoine pour imposer le nom de la copie et son chemin.

NB: je viens de tester, cela peut-être une piste.
 

clad187

XLDnaute Nouveau
Merci pour vos réponses.
Est-il possible de supprimer les lignes dans "ThisWorkBook"? Cela résoudrait totalement mon problème. J'ai essayé cette commande, mais ça ne semble pas marcher :

Sub Del_Lines()
With ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
.deleteLines 1, .CountOfLines
End With
End Sub

Sub Save_as_XLS()
Call Del_Lines
Application.Dialogs(xlDialogSaveAs).Show Format("Rapport d'expertise" & " " & Sheets("Général").Range("E5").Value & ".xlsm")
Application.DisplayAlerts = True
End Sub

Vous avez une idée ?
 

Discussions similaires

Réponses
16
Affichages
639

Statistiques des forums

Discussions
315 090
Messages
2 116 106
Membres
112 661
dernier inscrit
ceucri