Soyez le premier à donner votre avis sur cette source.
Vue 6 794 fois - Téléchargée 684 fois
Attribute VB_Name = "VBA_PreservHatifMacros" ' ------------------------------------------------------------------------------------ ' Module de protection contre la perte et l'inactivation des macros ' BILLOT Michel 2012.10 ' ------------------------------------------------------------------------------------ ' Avec l'avenement de XL2007 XL2010 ... Il est devenu tres facile de perdre les macros ' Probleme qui n'existait pas jusqu'à XL2003 (the best and the faster) ' ' Quand on met un fichier avec des macros à disposition d'utilisateurs inexpérimentés ' il y a risque qu'ils fassent une fausse manoeuvre du genre : ' SAVE avec le type de fichier par défaut qui risque fort de ne pas etre XLSM ' SAVE AS avec un type de fichier sans macros (.XLSX) ' Excel signale bien a cette occasion que les macros vont etre perdues, ' mais l'utilisateur peut passer outre et continuer a travailler avec le fichier ' On arrive donc a la situation suivante : ' un classeur de type .XLSX avec les données a jour mais plus de macros. ' un classeur de type .XLSM ou .XLS avec les macros mais les données ne sont plus a jour. ' Remettre les choses d'aplomb peut s'avérer long et compliqué si les macros sont réparties dans ' beaucoup d'objets Excel (Workbook, feuilles et modules). ' ' D'autre part meme si les macros sont présentes, selon le paramétrage de la sécurité d'Excel ' et le choix de l'utilisateur, les macros peuvent ne pas etre actives. ' ' Pour éviter de perdre les macros : ' 1°) Incorporer ce module dans le classeur contenant des macros a protéger ' 2°) Dans l'objet Excel WORKBOOK, évènement BEFORECLOSE mettre : Call DoNotLoseMacros(Cancel) ' Surtout ne pas protéger l'evenement BeforeSave car BeforeSave est appelé avant le changement de nom ' ce qui autorise quand meme de passer de .XLS a .XLSX et ensuite interdirait tout retour a .XLS ' et si comme il se doit on a bloqué le BeforeSave on ne pourrait plus sortir d'Excel. ' ' Pour éviter de travailler sans que les macros ne soient actives ' Dans une feuille qui sera imanquablement vue par l'utilisateur, mettre des alerteurs signalant que les macros sont inactives ' Par exemple masquer les intitulés des colonnes ou des lignes en affichant des cases rouge (texte rouge sur fond rouge) ' 3°) Sur les Headers de ligne et de colonne mettre un alerteur : ' Mise en forme conditionnelle des cellules d'alerte ' formule : =ESTERREUR(IsVBA()) ' mise en forme : Texte rouge sur Fond rouge (d'où l'affichage d'une case entierement rouge quelque soit le contenu) Option Explicit Sub DoNotLoseMacros(Cancel As Boolean) ' -------------------------------------- ' Protection contre la perte des macros. ' BILLOT Michel 2012.10 ' -------------------------------------- ' Cette fonction doit etre appelée par l'objet Workbook évènement BeforeClose ' ' a l'évènement BeforeClose du classeur ' Sub Workbook_BeforeClose(Cancel As Boolean) ' ' VBA : Microsoft Excel Objects : ThisWorkbook ' ' Objet Workbook Evenement BeforeClose ' Call DoNotLoseMacros(Cancel) ' End Sub If UCase$(Right$(ThisWorkbook.Name, 4)) <> ".XLS" _ And UCase$(Right$(ThisWorkbook.Name, 5)) <> ".XLSM" Then MsgBox "Ce classeur doir etre en .XLS ou en .XLSM à cause de ses macros." & vbCrLf & _ "Choisissez le mode de sauvegarde XL 97-2003" & vbCrLf & _ " ou le mode de sauvegarde XL prenant en charge les macros.", vbInformation Cancel = True End If End Sub Function IsVBA%() ' BILLOT Michel 2012.10 ' Informe un alerteur Excel que les macros sont absentes ou inactives ' Si on a perdu les macros en forcant la sauvegarde au format .XLSX ' Ou si les macros ne sont pas actives ' On alerte l'utilisateur par une mise en forme conditionnelle sur les Headers de lignes et ou de colonne. ' ' l' absence de cette fonction masquera les headers de ligne ou de colonne qui ont la msie en forme conditionnelle suivante ' Mise en forme conditionnelle des cellules d'alerte ' formule : =ESTERREUR(IsVBA()) ' mise en forme : Texte rouge sur Fond rouge (case rouge illisible) IsVBA% = True 'IsVBA% = 2 / 0 ' Force l'erreur comme si la macro était absente pour les tests de l'alerteur End Function
23 nov. 2013 à 18:22
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")
23 nov. 2013 à 16:30
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.
9 août 2013 à 18:33
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
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.