Aller au contenu
Nathan Fauconnier, profil LinkedIn (nouvel onglet)

Empêcher la suppression de colonnes sans protéger la feuille

Protéger la structure d’un tableau partagé, sans mot de passe à conserver ni à transmettre.

La démonstration en vidéo

Vidéo publiée sur LinkedIn, chargée seulement si vous cliquez dessus. Au clic, LinkedIn peut déposer des traceurs sur votre appareil : en savoir plus.

Thème
VBA
Niveau
Intermédiaire
Publiée le
Fonctions et notions
  • Workbook_SheetChange
  • UsedRange.Columns.Count
  • Application.Undo
  • EnableEvents
Pour aller plus loin
Formation Macros VBA

L’explication

Comment faire, pas à pas

La protection de feuille pose un dilemme connu. Sans mot de passe, elle se lève en deux clics et ne protège rien. Avec mot de passe, elle finit par bloquer la seule personne qui en avait besoin, le jour où le mot de passe est perdu, et la direction refuse souvent le principe même.

Une autre voie consiste à surveiller le classeur par le code, en deux temps. À chaque changement de sélection, on mémorise le nombre de colonnes occupées. À chaque modification, on le compare à celui d’avant : s’il a changé, une colonne a été ajoutée ou supprimée, et l’opération est annulée.

L’annulation passe par Application.Undo, exactement comme un Ctrl+Z. Le détail qui compte est l’encadrement par EnableEvents : sans lui, l’annulation serait elle-même vue comme une modification et relancerait l’événement en boucle.

L’utilisateur voit sa suppression se défaire d’elle-même, avec un message qui explique pourquoi. Aucun mot de passe n’est en jeu, et la feuille reste modifiable partout ailleurs.

À savoir Le code suppose un classeur .xlsm et des macros autorisées : c’est un garde-fou contre les fausses manœuvres, pas une barrière de sécurité. Application.Undo n’annule que la dernière action et vide au passage la pile d’annulation d’Excel.

Le code VBA Dans le module ThisWorkbook, car ce sont des événements de classeur, ils ne fonctionnent pas depuis un module standard ni depuis une feuille.
Private Nb_col_initial      As Long

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
' 1) Pour enregistrer le nombre de colonnes
    Nb_col_initial = Sh.UsedRange.Columns.Count
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
' 2) Pour détecter des ajouts/suppressions de colonnes
    Dim Nb_col_actuel       As Long

    'Récupérer le nombre de colonnes actuel après un changement
    Nb_col_actuel = Sh.UsedRange.Columns.Count

    'Comparer le nombre de colonnes avant et après le changement
    If Nb_col_actuel <> Nb_col_initial Then

        'Si une colonne a été ajoutée ou supprimée => annuler l'action
        Application.EnableEvents = False
        Application.Undo 'Ctrl + Z
        MsgBox "L'ajout ou la suppression de colonnes est interdit dans cette zone.", _
               vbExclamation, "Ajout/suppression de colonne interdit !"
        Application.EnableEvents = True
    End If

End Sub

Pour aller plus loin

D’autres astuces à découvrir

Toutes les astuces Formation Macros VBA

Prendre contact

Vous souhaitez vous former ou former vos équipes ?

Votre contexte suffit pour démarrer : nombre de personnes concernées, outils en place, échéance. Je réponds avec une proposition de programme et un devis.

En présentiel Selon votre localisation
À distance Toute la France
Financement souhaité
Contact