En fonction de la version d'Excel, gérer les enregistrements...

Résolu
Signaler
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
-
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
-
Bonjour le Forum,

Je me creuse la tête sur un petit détail qui toute fois mérite sont importance. Voila J'ai un classeur Excel qui a été construit avec Excel 2007. J'aimerais que ce fichier ne puisse pas être enregistré dans une autre version d'Excel que celle de 2007.

C'est à dire que les utilisateurs ayants une version inférieure à 2007 seront directement limités par des problèmes de "version future". En revanche, ceux qui ont une version supérieure à 2007 pourront ouvrir le document mais aussi l'enregistrer dans une version supérieure à 2007 voir inférieure à 2007.

Et donc moi j'aimerais faire en sorte que le document ne puisse être enregistré que dans la version 2007. Ainsi le document fonctionne avec toutes les versions d'office depuis 2007 et sera compatible tout le tps par la suite.

Pour mettre en place cette solution, je voyais un genre de macro très simple qui empêcherait tout simplement l'enregistrement dans un autre format que celui de 2007.

J'ai vu certaines choses sur les enregistrements sur le net mais est-ce envisageable ?
Toute autre solution et/ou suggestion est la bien venue.

Bien cordialement,

André

11 réponses

Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
1
Re bonjour le forum,

Ucfoutu j'ai pu tester ta nouvelle proposition...et ça fonctionnait assez bien je dois l'avouer. Malheureusement cela ne répondait pas encore totalement à mes exigences. Et oui je suis perfectionniste on dirait bien. C'est plus fort que moi^^

En fait ce qui ne me séduit pas dans ta dernière proposition, c'est qu'au final on enregistrait systématiquement le classeur. Il est certes plus facile de forcer l'enregistrement du classeur avant de quitter ce dernier. Cela évite le message redondant que nous offre Excel "voulez vous enregistrer avant de quitter ?". C'est une première solution simple qui fonctionne.

Du coup j'ai cherché à passer outre cette limitation et j'ai fini par trouver une solution viable et simple. Le code proposé par Bigfish est puissant mais trop compliqué pour moi. Je ne suis pas parvenu à isoler les lignes de codes pertinentes.

Voici la solution que je propose :

De la même manière que je gérais l'enregistrement, je fait de même en ce qui concerne la volonté de quitter Excel. Du coup j’inhibe à la fois la possibilité d'enregistrer via "fichier enregistrer", "ctr+s" ET de quitter avec "croix rouge", "alt+F4".

Cela me contraint donc à placer un UserForm nommé "Enregistrer" et un autre "Quitter". Mais au moins c'est plus simple à comprendre. Un bouton pour enregistrer et un autre pour quitter. Et plus aucun message d'Excel sur les confirmations. Ainsi si j'ouvre mon classeur, le modifie et décide finalement de le quitter sans enregistrer les modifications alors c'est simple et surtout possible. Ça me parait indispensable d'avoir une porte de sortie fiable en cas d'erreur.

Evidement on peut aussi tenir la logique suivante " si on quitte sans enregistrer alors on perd le fruit de nôtre labeur !". Oui, mais le bouton enregistrer était bien la lui. Bref c'est un choix.

Voici le code que j'utilise pour ce faire :

Un premier Userform contenant 2 boutons

Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'Quand on double-clic pour lancer

permis = True
ThisWorkbook.Close savechanges:=False
DoEvents
permis = False



End Sub

Private Sub CommandButton2_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'Quand on double-clic pour enregistrer

permis = True
ThisWorkbook.Save
DoEvents
permis = False

End Sub



Et enfin dans ThisWorkBook,

Public Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  
  If Not permis Then
     Cancel = True
     UserForm9.Show 'Affiche l'UserForm9
  End If
  
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)

  If Not permis Then
     Cancel = True
     UserForm9.Show 'Affiche l'UserForm9
  End If

Application.Quit

End Sub


Et voila, l'UserForm9 contient le message indiquant à l'utilisateur de bien vouloir enregistrer et/ou quitter via les deux boutons prévus à cet effet.

Ça fonctionne très bien, c'est simple, j'aime bien.


Je voudrais remercier Ucfoutu pour ce code car toute la base est fondée sur ses idées en début de post. Je n'ai fait que reprendre le concept de base et ajouté une ou deux petites modifications. Donc merci à toi Ucfoutu

Bigfish, ton code ne me laisse décidément pas indifférent !!! Je suis curieux de réussir à reproduire une petite partie de ton code. C'est mon prochain défit. Pour cela je vais ouvrir une nouvelle discussion car je ne suis pas armé pour y parvenir seul. Donc merci pour ton aide.


Je propose de clore ce post pour le moment. Merci à vous.


Bien cordialement,

André
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Bonjour,

Il te faudra faire preuve d'astuce, car depuis version 2207, on ne peut inhiber les icônes de la barre d'outil concernée.

Voici celle que je te suggère :
Mécanisme : obliger à utiliser la sauvegarde en passant par un bouton de commande à toi.

Une variable publique booléenne toto

Au Workbook_BeforeSave :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
 if toto false then Cancel True
End Sub


dans ton bouton de commande :

toto = true
puis saveas ......(comme tu l'entends)...
puis toto = false

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
1
Bonsoir Ucfoutu,

J'ai encore un peu de mal à jongler entre les boutons d'actions, les formulaires, les UserForms et les diverses macros.

Bref voici comment je pense poursuivre suite à tes conseils Ucfoutu :

Je souhaite faire afficher un UserForm qui incite à enregistrer. C'est pourquoi à l'ouverture du classeur j'utilise le code suivant.

Private Sub Workbook_Open() 'Ouverture automatique de l'UserForm1 à l'ouverture du classeur Excel

UserForm1.Show 'Affiche l'UserForm1

End Sub


Quand on double click sur cet UserForm le code suivant s’exécute.
Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'Quand on double clic

Run "save" 'Ordonne de lire la Macro principale

End Sub


Il permet de lancer la macro pour l'enregistrement. La macro ressemble à la suivante mais ce n'est qu'un début peu prometteur j'avoue.

Sub save()
Toto = True
'SaveAs (Dois je mettre un nom d'enregistrement, un chemin d'enregistrement, ou une extention peut être ???
Toto = False
End Sub


Et enfin il me reste le bout de code que tu me conseil Ucfoutu. Je ne sais pas trop comment l'intégrer logiquement. Pourtant il me semble que ce bout de code est le plus important.

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Toto False Then Cancel True
End Sub


Je dois sans doute faire des détours inutiles la. Mais je ne vois pas trop comment agencer tous ces éléments. Pourtant c'est simple, j'aimerais un UserForm qui permet l'enregistrement du fichier sans autres modifications possibles.

Ou sont mes erreurs ???

André
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
j'aimerais un UserForm qui permet l'enregistrement du fichier sans autres modifications possibles.

C'est encore plus simple car se contentera d'utiliser Save au lieu de SaveAs !

regarde

ouvre un nouveau classeur

sur la feuille feuil1, mets-y un bouton de commande Commandbutton1
avec ce code :

Private Sub CommandButton2_Click()
permis = True
ThisWorkbook.Save
DoEvents
permis = False
End Sub

Dans un module (déjà existant ou à insérer par insertion ===>>> module) :
tout en haut du module, avant toute procédure éventuellement présente
Public permis As Boolean

dans l'évènement Workbook_BeforeSave du module (ThisWorkBook)
Public Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  If Not permis Then
     Cancel = True
     MsgBox "vous ne pouvez sauvegarder qu'à l'aide de mon bouton de commande ad hoc"
  End If
End Sub

IMPORTANT : notre que je l'ai mis en Public
(ne l'ai pas laissé en Private)

Et voilà tout !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
1
Ayé j'ai réussi à suivre tes conseils Ucfoutu. Malgré tout j'ai préféré l'adapter en utilisant un UserForm plutôt qu'un Bouton de commande. C'était plus pratique et surtout plus adapté à mon appli.

Donc maintenant, en effet il est impossible de faire autre chose que d'enregistrer le classeur dans son format natif. Toute autre manière d'enregistrement est systématiquement rejetée (même le raccourci Ctrl+S).

J'ai tout de même remarqué, parmi mes tests, une situation un peu négative. Il s'agit du cas ou après avoir modifié le classeur on souhaite enregistrer en cliquant sur la croix rouge située en haut à droite. Naturellement Excel nous propose d'enregistrer avant de quitter. Si on répond oui pour l'enregistrement, nous obtenons le message classique "vous ne pouvez sauvegarder qu'à l'aide de mon bouton de commande ad hoc". Mais le classeur se ferme tout de même sans enregistrer...et adieux aux modifications qui auront pu être faites. (même chose si l'on fait Alt+F4)

Serait il possible de combler cette petite lacune ? Je ne sais pas agir sur la croix rouge personnellement. J'ai tout de même trouvé des choses sur Internet qui permettrait a priori de supprimer complètement la croix rouge du classeur. Pas la croix rouge d'un UserForm, mais bien la croix rouge du classeur carrément. Je ne sais pas si c'est une bonne solution.

Ucfoutu j'attends un conseil de ta part

Bien cordialement,

André
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
1
Personne n'a une petite idée pour solutionner cette situation ?

J'ai essayé de combler la lacune en utilisant le code suivant :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

permis = True

End Sub


Ça semble fonctionner plutôt bien...Mais cela ne résous malgré tout pas mon problème. En effet si l'on clique sur la croix rouge pour fermer Excel et si celui ci nous demande d'enregistrer avant de quitter alors automatiquement la variable publique "permis" s'active même si l'on fait annuler.

Du coup c'est un peu mieux, mais on peut toujours feinter Excel en lui disant de fermer puis annuler ensuite. Je sèche pour le coup.

Si quelqu’un à une petite idée je suis preneur pour le coup.

André
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Private Sub Workbook_BeforeClose(Cancel as Boolean)
    If Me.Saved = False Then Me.Save
End Sub


poeut-être
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
11
Bonjour,

si cela peut intéresser j'ai dans le fichier posté ici


montré une méthode pour gérer la sauvegarde, interdire de fermer excel via la croix mais uniquement par un bouton spécifique.
Note que dans cette exemple l'objectif est de gerer la propriété Addin du fichier lors de la sauvegarde. Pour ton cas il suffit de remplacer la gestion du addin par la version de sauvegarde.

A+
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
1
Merci pour vos conseils.

J'essaie vos idées dès ce soir. Je reviendrai faire un point d'avancement dès que possible.


En espérant que ça fonctionne^^

Merci à vous deux.

André
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
1
Bien j'ai pu tester un peu vos deux solutions.

-Ucfoutu, ta solution ne fonctionne pas cette fois ci. Pas d'effet favorable. J'ai essayé de tourner un peu les codes mais je n'y parviens toujours pas.

-Bigfish, j'ai essayé de lire ton code et je me rends compte qu'il est particulièrement intéressant. Il est encore un peu complexe sur certains points mais je pense pouvoir m'en inspirer un peu. Il va me falloir plus de temps pour analyser ce code.
De plus j'ai bien aimé le fait de forcer l'activation des macros au démarrage du code. C'est très astucieux je trouve. Ainsi que de masquer les feuilles tant que la macro n'est pas accèptée. J'aime bien le concept.

Je vais tâcher de travailler ton code. C'est du costaud mais intéressant...

Je repasserai plus tard faire un point.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
oui,
d'un message à l'autre, j'ai oublié la barrière que je t'avais fait mettre.
Je n'ai pas excel sous la main, mais la correction devrait se traduire par un simple rajout :
Private Sub Workbook_BeforeClose(Cancel as Boolean)
    If Me.Saved = False Then
       permis = true
       Me.Save
       permis = false
    end if
End Sub


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient