Protection contre la perte ou l'inactivation des macros vba excel

Messages postés
13
Date d'inscription
jeudi 27 novembre 2008
Statut
Membre
Dernière intervention
25 octobre 2018
- - Dernière réponse : BILLOTmi
Messages postés
13
Date d'inscription
jeudi 27 novembre 2008
Statut
Membre
Dernière intervention
25 octobre 2018
- 23 nov. 2013 à 18:22
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/54644-protection-contre-la-perte-ou-l-inactivation-des-macros-vba-excel

Afficher la suite 
claude-georges
Messages postés
6
Date d'inscription
vendredi 9 août 2013
Statut
Membre
Dernière intervention
23 novembre 2013
-
Ce programme répond à une préoccupation réelle du programmeur.
En restant simple, ce programme peut être très utile. Seul point faible : en cas d'absence de macro valide, aucun message n'est affiché.
Je ferai 3 remarques :

Ne pas oublier que le mode de sauvegarde 'Classeur Excel binaire' enregistre lui aussi les macros. Je propose donc la modification suivante dans 'DoNotLoseMacros'

If UCase$(Right$(ThisWorkbook.Name, 4)) <> ".XLS" _
And UCase$(Right$(ThisWorkbook.Name, 5)) <> ".XLSM" _
And UCase$(Right$(ThisWorkbook.Name, 5)) <> ".XLSB" Then
MsgBox "Vous avez sauvegardé ce classeur dans un format qui n'enregistre pas les macros." & vbCrLf & _
"Pour éviter les ennuis lors d'une prochaine utilisation de ce fichier," & vbCrLf & _
"sauvegardez le fichier dans le mode 'Classeur Excel 97-2003'" & vbCrLf & _
" ou le mode 'Classeur Excel prenant en charge les macros'" & vbCrLf & _
" ou le mode 'Classeur Excel binaire'" & vbCrLf & vbCrLf & _
"et effacez la sauvegarde sans les macros.", vbInformation


Autre remarque: Le code de 'DoNotLoseMacros' peut être intégré dans l' Objet Workbook Evenement BeforeClose

A NOTER : LA FORMULE placée en A1 =SI(ESTERREUR(isvba(B1));"Les macros ne sont pas actives";"Les macros sont actives") ne peut être utilisée : elle donne toujours "Les macros sont actives"

Claude-georges
BILLOTmi
Messages postés
13
Date d'inscription
jeudi 27 novembre 2008
Statut
Membre
Dernière intervention
25 octobre 2018
> claude-georges
Messages postés
6
Date d'inscription
vendredi 9 août 2013
Statut
Membre
Dernière intervention
23 novembre 2013
-
Bonjour en réponse aux remarques de Claude Georges
Remarque N°1 :
Concernant le format de fichier .XLSB, la remarque est pertinente et la modification proposée utile si on autorise le format XLSB.

Remarque N°2 :
Placer le code de la fonction 'DoNotLoseMacros' à la place de son appel 'Call DoNotLoseMacros' dans l' Objet Workbook Evenement BeforeClose
c'est selon vos préférences.
Personnellement, je préfères centraliser le code dans des modules exportables et reutilisisables,
et appeler les fonctions quand un évenement se produit.

Remarque N°3 :
Je ferais juste remarquer qu'il ne s'agit pas d'une formule à mettre en A1
mais d'un alerteur =ESTERREUR(isvba())
avec une mise en forme conditionnelle texte en rouge sur fond rouge
Voir PreservHatifMacros.XLS Feuille Exemple!A1:H1 et A1:A15
Ce qui a pour effet de mettre entierement en rouge les cellules
où l'alerteur est implanté si les macros sont inactives ou disparues
Cet alerteur qui fait virer au rouge la feuille est le signal d'alerte
qui rend la feuille inexploitable sans la présence de macros.
Ouvrir le fichier dans XL2007+ sans activer les macros si vous voulez vérifier.
BILLOTmi
Messages postés
13
Date d'inscription
jeudi 27 novembre 2008
Statut
Membre
Dernière intervention
25 octobre 2018
> claude-georges
Messages postés
6
Date d'inscription
vendredi 9 août 2013
Statut
Membre
Dernière intervention
23 novembre 2013
-
Complément de réponse
sur le A NOTER je ne suis pas d'accord ni avec la syntaxe de la formule (La fonction IsVBA n'attend aucun parametre) ni avec la conclusion de Claude Georges.
.

Si en plus de l' alerteur qui met en tout en rouge on veut réserver une cellule pour mettre un message explicite en clair :
Sur n'importe quelle cellule (non soumise a l'alerteur car sinon le message sera invisible si pas de macro), il suffit de mettre la formule suivante :
=SI(ESTERREUR(isvba());"NO vba";"VBA ready")