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

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

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.