XL 2021 Macro protege cellule avec Intersect

Michel_ja

XLDnaute Occasionnel
Bonjour à tous,
j'ai trouvé le code suivant qui permet, via une macro, d'interdire un utilisateur de sélectionner une cellule (une range, donc colonne par exemple). Ce code est écrit dans une worksheet et fonctionne parfaitement.
J'ai une autre macro qui me copie cette feuille sur un nouveau fichier, puis me renomme la feuille et j'enregistre ce nouveau fichier sous un autre nom. Malheureusement la macro suivante ne fonctionne plus et me renvoit un message d'erreur.
J'ai essayé de mettre ce code sur Workbook et nom la feuille mais ça ne fonctionne pas. Est-ce que vous auriez une idée ?
Merci d'avance.
Michel

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Range("AM7:AM500,BA7:BG500"), Target) Is Nothing Then
Target.Offset(0, 1).Select
End If
End Sub
 

Michel_ja

XLDnaute Occasionnel
La macro event (c'est à dire le code que j'ai écrit plus haut) qui est sur la feuille active du fichier de départ ne fonctionne pas lorsque je duplique cette même feuille dans un nouveau classeur.
Peut-être faudrait-il avoir un event différent que celui de selection change ?
Est ce qu'on peut avoir une macro, qui protêge donc des cellules, qui se déclenche autrement ? Au bout de quelques secondes ou autres ?
Je me suis demandé aussi si on pouvait intégrer dans une macro standard, un code qui viendrait créer cette macro event dans l'active sheet?
Autre piste, c'est aussi peut-être parce que dans une macro je selectionne des lignes entières que je veux supprimer et qui se trouvent donc à l'intersection de celles-ci qui sont protégées.
Je reçois le message d'erreur "Erreur d'exécution '1004': La méthode 'SaveAs' de l'objet'_... a échoué".
Merci
 
Dernière édition:

Michel_ja

XLDnaute Occasionnel
Pensez-vous qu'il serait possible d'avoir une macro qui ouvre un fichier et qui vient créer le code suivant dans une feuille (le nom de la feuille est variable) ou un workbooks ?
Je pense que le code ne pouvait pas fonctionner (premier post) car je supprimais des lignes et colonnes protégées justement par ce code. Alors je pense qu'il faudrait deux macros.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Range("AM7:AM500,BA7:BG500"), Target) Is Nothing Then
Target.Offset(0, 1).Select
End If
End Sub
 

TooFatBoy

XLDnaute Barbatruc
Bonjour,

VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Range("AM7:AM500,BA7:BG500"), Target) Is Nothing Then Target.Offset(0, 1).Select
End Sub
Ton code doit fonctionner pour toute feuille dans laquelle il se trouve.


Malheureusement la macro suivante ne fonctionne plus et me renvoit un message d'erreur.
👍



Pourquoi n'utilises-tu pas simplement la protection de la feuille pour empêcher de sélectionner ou modifier les cellules que tu veux ?
 
Dernière édition:

Michel_ja

XLDnaute Occasionnel
Bonjour,

VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Range("AM7:AM500,BA7:BG500"), Target) Is Nothing Then Target.Offset(0, 1).Select
End Sub
Ton code doit fonctionner pour toute feuille dans laquelle elle se trouve.



👍



Pourquoi n'utilises-tu pas simplement la protection de la feuille pour empêcher de sélectionner ou modifier les cellules que tu veux ?
Merci pour ton retour TooFatBoy. Mon code ne fonctionne pas car le nouveau fichier est créer par une macro et dans cette macro je supprime des cellules qui sont protégées par le code macro "Worksheet_SelectionChange.

Je n'ai pas utilisé de code de protection de la feuilles et verrouille les cellules car par la suite j'ai une autre macro qui vient ouvrir ce nouveau fichier et copier les nouvelles informations mises à jours par des collègues. S'il y a une protection, ça bloque cette macro.


 

TooFatBoy

XLDnaute Barbatruc
Mon code ne fonctionne pas car le nouveau fichier est créer par une macro et dans cette macro je supprime des cellules qui sont protégées par le code macro "Worksheet_SelectionChange.
Perso, je ne comprends pas le rapport.


Je n'ai pas utilisé de code de protection de la feuilles et verrouille les cellules car par la suite j'ai une autre macro qui vient ouvrir ce nouveau fichier et copier les nouvelles informations mises à jours par des collègues. S'il y a une protection, ça bloque cette macro.
Là non plus, je ne comprends pas en quoi la protection de la feuille est gênante : tu peux soit déprotéger avant de coller les données et reprotéger ensuite, soit protéger la feuille uniquement pour l'utilisateur.
As-tu essayé quelque chose dans ce genre ?
 

Michel_ja

XLDnaute Occasionnel
Je n'ai pas essayé de code qui vérouillerait les cellules en fonction de l'utilsateur. Je ne connais pas. Tu veux dire que lorsque c'est une personne X qui ouvre le fichier les cellules sont vérouillées et si c'est moi, elles ne le sont pas ? Merci
 

TooFatBoy

XLDnaute Barbatruc
Tu veux dire que lorsque c'est une personne X qui ouvre le fichier les cellules sont vérouillées et si c'est moi, elles ne le sont pas ?
Non, pas tout à fait : je veux dire que si tu protèges la feuille uniquement pour l'utilisateur et pas pour les macros VBA (en utilisant UserInterfaceOnly), ta macro pourra tout de même écrire dans ta feuille protégée.

Je ne dis pas que c'est LA solution qu'il te faut, mais c'est une possibilité. ;)
 
Dernière édition:

Michel_ja

XLDnaute Occasionnel
Non, pas tout à fait : je veux dire que si tu protèges la feuille uniquement pour l'utilisateur et pas pour les macros VBA (en utilisant UserInterfaceOnly), ta macro pourra tout de même écrire dans ta feuille protégée.

Je ne dis pas que c'est LA solution qu'il te faut, mais c'est une possibilité. ;)
Bonjour TooFatBoy. Petit retour sur mon problème. J'ai fini par opté pour une macro événementielle qui se déclenche ou pas en fonction de l'utilisateur. Sans ça, elle s'arrêtait lorsque je souhaitais supprimer des colonnes ou lignes où se trouvaient les cellules protégées. Avec le code suivant, ça fonctionne, les cellules ne sont pas protégées lorsque c'est moi qui fait tourner la macro. Merci beaucoup pour nos échanges, j'ai apris encore des nouvelles choses. J'ai choisi le MsgBox pour informer les collègues de l'interdiction.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim Utilisateur As String
Utilisateur = Environ("username")
Application.DisplayAlerts = False

If Utilisateur = "XXXX" Then Exit Sub

With ActiveSheet

If Not Intersect(Range("A2:A300,O2:U300"), Target) Is Nothing Then
MsgBox "Do not select Column A, and Columns O to U"
Target.Offset(2, 8).Select
End If
End With
Application.DisplayAlerts = True

End Sub
 

Discussions similaires