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

Soyez le premier à donner votre avis sur cette source.

Vue 6 794 fois - Téléchargée 684 fois

Description

Excel 2007 et + sont arrivés avec de nouveaux formats de fichiers et des problèmes
qui n'existaient pas auparavant.
Il faut maintenant se protéger contre la perte des macros suite à une fausse manip.
Il est possible de valider la perte des macros en sauvant sous un format de fichier sans macros.
On se retrouve alors avec un fichier contenant de la saisie à jour mais plus les macros
pour les exploiter ce qui peut être très très gênant.

Le module VBA_PreservHatifMacros.bas ci joint permet vérifier que l'on ne perds pas les macros, il permet aussi de signaler à l'utilisateur que les macros sont inactives ou absentes.

Source / Exemple :


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

Conclusion :


Longue vie a Excel 2003

Codes Sources

A voir également

Ajouter un commentaire Commentaires
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
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")
BILLOTmi Messages postés 13 Date d'inscription jeudi 27 novembre 2008 Statut Membre Dernière intervention 25 octobre 2018
23 nov. 2013 à 16:30
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.
claude-georges Messages postés 6 Date d'inscription vendredi 9 août 2013 Statut Membre Dernière intervention 23 novembre 2013
9 août 2013 à 18:33
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

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.