XL 2016 Problème pour masquer les formules

scoubidou35

XLDnaute Occasionnel
Bonjour à tous,
J'ai un tableau avec des formules et un code VBA pour ajouter automatiquement un ligne quand la ligne précédente est utilisé.
Je voulais protéger les formules contre la maladresse en les masquant.
Dans pour cela j'ai sélectionné la feuille entière et j'ai décocher "verrouillé" dans mise en forme cellules/Protection
Puis j'ai sélectionné les cellules avec des formules et j'ai sélectionné "Masqué" dans mise en forme cellules/protection
Enfin j'ai protéger la feuille avec un mot de passe (dans le fichier joint il n'y a pas de mot de passe à entrer)

résultat mes formules sont masquées mais lorsque je clique en dehors du tableau pour rajouter une ligne en fait le code VBA ne fonctionne plus.

Y a t-il une solution ou pas?

Merci d'avance

Bonne journée
 

Pièces jointes

  • FICHIER TEST .xlsm
    99.9 KB · Affichages: 20
Solution
Pour un appel universel depuis plusieurs feuilles ou onglets,
Mettre le code suivant dans un module :
VB:
Public Sub Sheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean, Tabref As ListObject)
    Select Case True
        Case Not Application.Intersect(Target, Tabref.HeaderRowRange) Is Nothing
        Case Application.Intersect(Target, Tabref.DataBodyRange) Is Nothing
        Case Else
            Cancel = True 'empêche l'affichage du menu d'Excel
            With Application.CommandBars("Cell")
                With .Controls.Add(msoControlButton, 1, , 1, True)
                    .FaceId = 1088: .Caption = "Supprimer la ligne de Table"
                    .OnAction = "'Do_Tab " & "[" & Tabref & "].listobject" & "'"...

fanch55

XLDnaute Barbatruc
Salut,
C'est un peu dangereux d'essayer de créer une nouvelle ligne de table en cliquant en dehors de celle-ci, c'est un geste qu'on a tendance à faire systématiquement pour faire réagir Excel .

Ceci dit, vous pouvez faire un Me.unprotect avant d'ajouter votre ligne et refaire aussitôt un Me.protect avec toutes les options idoines.
 

job75

XLDnaute Barbatruc
Bonjour scoubidou35,

Il faut ôter la protection de la feuille en début de macro :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Unprotect "" 'inscrire le mot de passe entre les guillemets
'-------
Protect "" 'inscrire le mot de passe entre les guillemets
End Sub
Edit : salut fanch55, une nouvelle fois la page XLD n'était pas à jour.

A+
 
Dernière édition:

scoubidou35

XLDnaute Occasionnel
Bonjour scoubidou35,

Il faut ôter la protection de la feuille en début de macro :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Unprotect "" 'inscrire le mot de passe entre les guillemets
'-------
Protect "" 'inscrire le mot de passe entre les guillemets
End Sub
Edit : salut fanch55, une nouvelle fois la page XLD n'était pas à jour.

A+
Bonsoir job75,
Je viens de tester en mettant unprotect "" et protect "" (je protège la feuille sans mot de passe pour l'exemple ;)) comme vous me l'avez indiqué et ça fonctionne merci mais j'ai un problème. J'ai coché la possibilité de supprimer des lignes mais quand je veux le faire les lignes supprimer lignes du tableau et colonne du tableau sont grisées. Je pense que c'est lié au faite qu'il s'agisse d'un tableau...y a t-il une solution ?
Merci
 

Pièces jointes

  • FICHIER TEST .xlsm
    100.5 KB · Affichages: 5

job75

XLDnaute Barbatruc
Bonjour scoubidou35,

Il suffit de préciser les options de protection :
VB:
Private Sub Worksheet_selectionchange(ByVal Target As Range)
Unprotect "" 'inscrire le mot de passe entre les guillemets
'-------
Protect "", AllowFormattingRows:=True, AllowInsertingColumns:=True, _
    AllowInsertingRows:=True, AllowDeletingColumns:=True, AllowDeletingRows:=True
End Sub
A+
 

fanch55

XLDnaute Barbatruc
Bonsoir @scoubidou35 ,@job75 ,

Job a tout à fait raison,.
Cependant, j'ai remarqué que pour les tables structurées,
le protect permet seulement d'agir sur la ligne entière mais pas pour la ligne de table.
Personnellement, je n'ai pas essayé en faisant un menu contextuel qui pourrait être la solution en rajoutant au protect le userinterfaceonly=true ... 🤔
 

scoubidou35

XLDnaute Occasionnel
Bonjour scoubidou35,

Il suffit de préciser les options de protection :
VB:
Private Sub Worksheet_selectionchange(ByVal Target As Range)
Unprotect "" 'inscrire le mot de passe entre les guillemets
'-------
Protect "", AllowFormattingRows:=True, AllowInsertingColumns:=True, _
    AllowInsertingRows:=True, AllowDeletingColumns:=True, AllowDeletingRows:=True
End Sub
A+
Bonjour Job,
Je viens de tester et je ne peux toujours pas supprimer une ligne dans le tableau.
 

scoubidou35

XLDnaute Occasionnel
Bonsoir @scoubidou35 ,@job75 ,

Job a tout à fait raison,.
Cependant, j'ai remarqué que pour les tables structurées,
le protect permet seulement d'agir sur la ligne entière mais pas pour la ligne de table.
Personnellement, je n'ai pas essayé en faisant un menu contextuel qui pourrait être la solution en rajoutant au protect le userinterfaceonly=true ... 🤔
Bonjour fanch55,
Je viens de tester le code de Job et en effet il semblerai que le protect ne fonctionne pas pour supprimer les lignes du tableau.
J'ai même rajouter userinterfaceonly:=true au code et rien ne change.
 

fanch55

XLDnaute Barbatruc
A tester en l'intégrant dans le code de la feuille AMENDEMENT ET FERTILISATION

VB:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Select Case True
        Case Not Application.Intersect(Target, [Tab_Fertilisation[#Headers]]) Is Nothing
        Case Application.Intersect(Target, [Tab_FERTILISATION[#Data]]) Is Nothing
        Case Else
            Cancel = True 'empêche l'affichage du menu d'Excel
            With Application.CommandBars("Cell")
                With .Controls.Add(msoControlButton, 1, , 1, True)
                    .Caption = "Supprimer la ligne de Table"
                    .FaceId = 1088
                    .OnAction = Me.CodeName & ".Sup_Tab"
                End With
                With .Controls.Add(msoControlButton, 1, , 1, True)
                    .Caption = "Ajouter une ligne de Table içi"
                    .FaceId = 1142
                    .OnAction = Me.CodeName & ".Add_Tab"
                End With
                With .Controls.Add(msoControlButton, 1, , 1, True)
                    .Caption = "Ajouter une ligne en fin de Table"
                    .FaceId = 1145
                    .OnAction = "'" & Me.CodeName & ".Add_Tab ""True""'"
                    .BeginGroup = True
                End With
                .ShowPopup
                For Each Control In .Controls
                    If Not Control.BuiltIn Then Control.Delete
                Next
            End With
    End Select
End Sub
Sub Sup_Tab()
    Frow = Selection.Row
    Trow = [Tab_FERTILISATION[#Data]].Row
    Me.Unprotect
        Application.EnableEvents = False
            [Tab_FERTILISATION].Rows(Frow - Trow + 1).Delete
        Application.EnableEvents = True
    Me.Protect
End Sub
Sub Add_Tab(Optional En_Fin As Boolean)
    Frow = Selection.Row
    Trow = [Tab_FERTILISATION[#Data]].Row
    Me.Unprotect
        Application.EnableEvents = False
            If En_Fin Then
                [Tab_FERTILISATION].ListObject.ListRows.Add
            Else
                [Tab_FERTILISATION].ListObject.ListRows.Add Frow - Trow + 1
            End If
        Application.EnableEvents = True
    Me.Protect
End Sub
 
Dernière édition:

fanch55

XLDnaute Barbatruc
Après simplification :
( c'est imparfait car il ne tient pas compte des sélections multiples, mais c'est un exemple ...:cool: )
Code:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Select Case True
        Case Not Application.Intersect(Target, [Tab_Fertilisation[#Headers]]) Is Nothing
        Case Application.Intersect(Target, [Tab_FERTILISATION[#Data]]) Is Nothing
        Case Else
            Cancel = True 'empêche l'affichage du menu d'Excel
            With Application.CommandBars("Cell")
                With .Controls.Add(msoControlButton, 1, , 1, True)
                    .FaceId = 1088: .Caption = "Supprimer la ligne de Table"
                    .OnAction = Me.CodeName & ".Do_Tab"
                End With
                With .Controls.Add(msoControlButton, 1, , 1, True)
                    .FaceId = 1142: .Caption = "Ajouter une ligne de Table içi"
                    .OnAction = Me.CodeName & ".Do_Tab"
                End With
                With .Controls.Add(msoControlButton, 1, , 1, True)
                    .FaceId = 1145: .Caption = "Ajouter une ligne en fin de Table"
                    .OnAction = Me.CodeName & ".Do_Tab"
                    .BeginGroup = True
                End With
                .ShowPopup
                For Each Control In .Controls
                    If Not Control.BuiltIn Then Control.Delete
                Next
            End With
    End Select
End Sub
Sub Do_Tab()

Me.Unprotect
    Application.EnableEvents = False
    Frow = Selection.Row
    Trow = [Tab_FERTILISATION[#Data]].Row
    Select Case CommandBars.ActionControl.FaceId
    Case 1088: [Tab_FERTILISATION].Rows(Frow - Trow + 1).Delete             ' Supprimer
    Case 1142: [Tab_FERTILISATION].ListObject.ListRows.Add Frow - Trow + 1  ' Ajouter içi
    Case 1145: [Tab_FERTILISATION].ListObject.ListRows.Add                  ' Ajouter en fin de table
    End Select
    Application.EnableEvents = True
Me.Protect

End Sub
 

Discussions similaires

Réponses
2
Affichages
155

Statistiques des forums

Discussions
312 169
Messages
2 085 915
Membres
103 037
dernier inscrit
Alves AGBO