Forcer un 'save as' en VBA
Bonjour le forum,
Je suis à la recherche d'une routine VBA qui empêche de sauver un fichier avec le même nom et force un enregistrement sous.
Cordialement
Bonjour
J'ai trouvé cela sur le web, j'ai pas tout compris mais ça marche.....
Sub sbSaveExcelDialog()
Dim IntialName As String
Dim sFileSaveName As Variant
ChDir ActiveWorkbook.Path
InitialName = ActiveWorkbook.Name 'nom souhaité pour le fichier ?
sFileSaveName = Application.GetSaveAsFilename(InitialFileName:=InitialName, fileFilter:="Excel Files (*.xlsm), *.xlsm")
If sFileSaveName <> False Then
ActiveWorkbook.SaveAs sFileSaveName
Else
ActiveWorkbook.Save
End If
End Sub
Bonjour,
Une piste
j'ai trouvé ce bout de code réalisé par MichDenis :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Z As String
If SaveAsUI = True Then
Else
Do
Z = Application.InputBox(PROMPT:="Inscrivez le NOUVEAU nom du classeur.", _
Title:="Enregistrer sous", Default:="SonNom.xls", Type:=2)
If Format(Z) = False Then Cancel = True: Exit Sub
If LCase(Right(Z, 4)) <> ".xlsm" Then Z = Z & ".xlsm"
If UCase(Z) = UCase(ThisWorkbook.Name) Then
If MsgBox("Ce nom existe déjà. Vous devez choisir un autre nom." & _
"Désirez-vous continuer?", vbCritical + vbYesNo, "Nouveau nom") = vbNo Then
Cancel = True
Exit Sub
End If
Else
On Error Resume Next
Application.EnableEvents = False
ThisWorkbook.SaveAs ThisWorkbook.Path & "" & Z
Application.EnableEvents = True
If Err <> 0 Then
Err.Clear
MsgBox "Vous avex saisi un caractère interdit dans " & _
"le nom du fichier : |/*?:><"
Cancel = False
Else
Cancel = True
End If
End If
Loop Until Cancel = True
End If
End SubSur une ancienne version d'Excel (je ne l'ai pas testée)
Bonjour
Code très complet, mais le nom du fichier à enregistrer n'est pas comparé aux fichiers existants dans le répertoire voulu....
Pour ce que je comprends, cette procédure compare le nouveau nom au nom du classeur ouvert qui doit être enregistré...
Cela doit être simple......pour les bons !
Je vais continuer à chercher
FINDRH
FINDRH a écrit :Bonjour
J'ai trouvé cela sur le web, j'ai pas tout compris mais ça marche.....
Sub sbSaveExcelDialog()
Dim IntialName As String
Dim sFileSaveName As Variant
ChDir ActiveWorkbook.Path
InitialName = ActiveWorkbook.Name 'nom souhaité pour le fichier ?
sFileSaveName = Application.GetSaveAsFilename(InitialFileName:=InitialName, fileFilter:="Excel Files (*.xlsm), *.xlsm")
If sFileSaveName <> False Then
ActiveWorkbook.SaveAs sFileSaveName
Else
ActiveWorkbook.Save
End If
End Sub
Bonsoir FINDRH,
Cela ne fonctionne malheureusement pas...
ouisansdoute a écrit :Bonjour,
Une piste
j'ai trouvé ce bout de code réalisé par MichDenis :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim Z As String If SaveAsUI = True Then Else Do Z = Application.InputBox(PROMPT:="Inscrivez le NOUVEAU nom du classeur.", _ Title:="Enregistrer sous", Default:="SonNom.xls", Type:=2) If Format(Z) = False Then Cancel = True: Exit Sub If LCase(Right(Z, 4)) <> ".xlsm" Then Z = Z & ".xlsm" If UCase(Z) = UCase(ThisWorkbook.Name) Then If MsgBox("Ce nom existe déjà. Vous devez choisir un autre nom." & _ "Désirez-vous continuer?", vbCritical + vbYesNo, "Nouveau nom") = vbNo Then Cancel = True Exit Sub End If Else On Error Resume Next Application.EnableEvents = False ThisWorkbook.SaveAs ThisWorkbook.Path & "" & Z Application.EnableEvents = True If Err <> 0 Then Err.Clear MsgBox "Vous avex saisi un caractère interdit dans " & _ "le nom du fichier : |/*?:><" Cancel = False Else Cancel = True End If End If Loop Until Cancel = True End If End SubSur une ancienne version d'Excel (je ne l'ai pas testée)
Bonsoir ouisansdoute,
Merci pour ce code qui fonctionne à moitié.
C'est un bon début !
FINDRH a écrit :Bonjour
Code très complet, mais le nom du fichier à enregistrer n'est pas comparé aux fichiers existants dans le répertoire voulu....
Pour ce que je comprends, cette procédure compare le nouveau nom au nom du classeur ouvert qui doit être enregistré...
Cela doit être simple......pour les bons !
Je vais continuer à chercher
FINDRH
Cher/Chère FINDH,
La routine démarre au bon moment et permet effectivement d'enregistrer sous un nouveau nom.
Par contre, pas dans le bon répertoire et, je ne sais pas pourquoi, en ajoutant "download" en début de nom de fichier.
Lorsqu'on utilise un mauvais caractère, là encore, cela fonctionne correctement.
Par contre, lorsqu'on souhaite enregistrer une seconde fois le fichier, il permet d'écraser la sauvegarde précédente.
Je me débrouille en VBA mais là, je coince.
Merci d'avance si vous avez encore un peu de temps à y consacrer...
Bonsoir
avec une adaptation des sources Boisgontier , ci joint une procédure qui marche chez moi :
Sub enrsous()
ChDir ActiveWorkbook.Path ' chemin critique
Vclas = ActiveWorkbook.Name ' nom du classeur ouvert
repertoire = ThisWorkbook.Path & "\" ' adapter
Vn = Dir(repertoire & "*.*") 'premier fichier
Do While Vn <> ""
If Vn = Vclas Then' nom existe dans repertoire
sNomFicha = "Changer nom" 'apparait dans nom a saisir, on peut mettre n'importe quoi
' bt dialogue pour saisir nouveau nom
sNomFich = Application.GetSaveAsFilename(InitialFileName:=sNomFicha, fileFilter:="Excel Files (*.xlsm), *.xlsm")
If sNomFich <> False Then' teste si nom vide
ActiveWorkbook.SaveAs sNomFich' enregistre avec le nom saisi
Else ' cilic sur annuler
MsgBox (" pas de nouveau nom de fichier saisi")
Exit Sub' sort de la procédure
End If
Exit Sub
Else
End If
Vn = Dir ' suivant
Loop
ActiveWorkbook.Save ' enregistrement classique
End Sub
Curieux de voir si ça marche
Cordialement
M. FINDRH !!! sans susceptibilité !!!
Bonsoir,
Il faut être conscient que ta procédure une fois en place interdira tout enregistrement du classeur, il ne pourra plus être enregistré que sous un autre nom. Et chaque nouvel enregistrement sous un autre nom ne pourra à son tour être enregistré que sous un autre nom nouveau...
Remarque, tu pourra alterner avec deux noms, rien ne l'interdira...
Les réponses que tu as eues devraient te permettre de définir la procédure que tu souhaites :
- L'évènement BeforeSave est à programmer pour intercepter la demande d'enregistrement et l'empêcher ; dans tous les cas, Cancel devra être mis à True pour empêcher l'enregistrement normal.
- La méthode GetSaveAsFilename est elle-aussi tout indiquée pour demander à l'utilisateur d'indiquer un nom, en lui suggérant un nom qui ne soit pas celui du classeur bien sûr et en vérifiant que son choix ne rétablit pas le nom du classeur.
Cordialement.
Cher M. FINDRH,
Encore merci pour ton aide.
Dans le fichier ci-dessous, j'ai inséré ton dernier code dans une routine BeforeSave.
Au moment d'enregistrer le fichier (Save ou Close / Save), cela ouvre une fenêtre SaveAs avec un nouveau nom et dans le même répertoire. Youhou !
Cela dit,
- Si tu cliques sur [enregistrer], la fenêtre SaveAS s'ouvre à nouveau ! Et là, tu peux l'enregistrer.
- Si tu lui donnes l'ancien nom du fichier, la fenêtre SaveAS s'ouvre à nouveau et, si tu réessayes encore, il est alors possible d'écraser le fichier !
- Je n'ai pas pu déterminer les circonstances exactes mais il est arrivé qu'Excel se plante avec le message "Microsoft Excel attend la fin de l'exécution d'une action OLE d'une autre application."
- Si tu cliques sur [Annuler] de la fenêtre SaveAs, la boîte de dialogue s'affiche mais le fichier est enregistré avec l'ancien nom !
Qu'en penses-tu ?
Bonjour
j'ai atteint mes limites de compréhension...... mais je pense que before save avec un save ensuite, ça boucle...... et on pourra toujurs écraser le fichier par forçage.....
Maintenant je redescends sur terre avec une proposition basique qui ne résoud pas tout :
- si tu enregistres ton fichier de base sous Modèle
-quand tu l'ouvres son nom s’incrémente automatiquement
- quand tu l’enregistres tu peux changer de nom
mais pour écraser l'original, il faut faire enregistrer sous modèle et remettre le nom original,
rechoisir le bon répertoire car dans ce cas c'est le répertoire modèle dans c qui t'est proposé.....
Désolé.....
Findrh
Bonsoir,
Je savais que cette question était ardue.
Cela dit, ta suggestion est très intéressante et je n'y avais évidemment pas pensé.
Bonne année et merci quand-même !