XL 2016 VBA - Une manière rapide de trouver les cellules verrouillées ?

Dudu2

XLDnaute Barbatruc
Bonjour,
Je n'y crois pas trop, mais à part parcourir les cellules une à une (ce qui n'est envisageable que sur un Range limité) y a-t-il un moyen de trouver le Range des cellules verrouillées d'une feuille ?
Merci.
 

Staple1600

XLDnaute Barbatruc
@Dudu2
Au départ tu parlais d'identifier rapidement en VBA
Ce que j'ai interprété comme colorier les cellules verrouillées
Maintenant si il faut obtenir un Range, j'ai essayé d'adapter le précédent code
Et comme je ne sais pas comment l'utilisateur final (le comptable, cf le message#26) utilise Excel, je ne sais comment adapter mes propositions en conséquence
Ci dessous un biais que je pourrais utiliser si j'étais l'utilisateur final
1) un CTRL+F manuel (puis CTRL+A dans la boite de dialogue Find)
Biais.PNG
2) Cette macro associée sur un bouton de la QAT
Code:
Sub Test()
MsgBox Selection.Address
End Sub
Et j'obtiens l'adresse des plages verrouillées dans le MsgBox

Autre méthode précédemment évoquée (si on utilise des plages nommées pour des cellules verrouillées) avec des noms explicites
Je pourrais utilisé cette macro
Code:
Sub MemoAdressePlageVerouillees()
Sheets.Add
Range("A1").ListNames
End Sub
qui me listera les noms sur une nouvelle feuille.
  • en colonne A le nom
  • en colonne B le nom de la feuille et la plage cellules correspondantes
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Merci @Staple1600 pour tes essais qui n'abandonne jamais pour trouver une solution.
En fait j'ai demandé sur la 1er Post "y a-t-il un moyen de trouver le Range des cellules verrouillées d'une feuille". Préfixe par VBA.

L'utilisateur final est complétement guidé par le code.
Il sélectionne une plage mono ou multi-areas et je la lui sécurise.
Il revient 3 jours après et il veut voir la plage sécurisée, je la lui montre en sélection.
Il veut y ajouter des areas , il ajoute à la sélection et je lui sécurise la zone augmentée.
Il veut la désécuriser, je la lui désécurise.
Il n'y a pas d'autres manip qu'il a à faire qui soit complémentaires de la macro.
 

Dudu2

XLDnaute Barbatruc
Et @Phil69970 qui n'abandonne pas non plus ! Vous êtes trop forts !
Sinon dans ta récup, tu dois d'une part parcourir les cellules (si toute la feuille doit l'être parce que la sécurisation concerne une ou des colonnes entières ?) et d'autre part utiliser des propriétés de cellules (couleur MFC) qui certes ne vont pas tilter avec les couleurs natives des cellules mais peuvent tilter avec des MFC utilisateur.
 

Staple1600

XLDnaute Barbatruc
@Dudu2
C'est bien du VBA qu'il y dans la macro du message#46, non ? ;)
qui respectait le rapidement
Pour faire ce que tu décris dans ton dernier message, cela ne plus être rapidement, non ?
Je remballe donc mon CRTL+F "vbaisé" et laisse donc mes petits camarades de jeu poursuivre ta quête.
 

Dudu2

XLDnaute Barbatruc
Je ne veux plus que vous transpiriez sur ce problème.

En tous cas je suis admiratif de votre créativité et des idées proposées.
Que ce soit possible ou pas, je vous remercie pour toutes vos propositions.

La solution de @TooFatBoy d'utiliser des noms de gestionnaire de noms est finalement la plus simple. De plus le gestionnaire de noms, en utilisant des Ranges, adapte ces Ranges en fonction des actions (insérer, supprimer) sur la feuille.

Le code peaufiné par la discussion que j'utilise pour gérer les Noms est dans le Post #29.
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour à tous,

Je n'ai pas suivi ce fil.

Voici 2 macros qui sélectionnent les cellules verrouillées ou déverrouillées de toute la feuille :
VB:
Sub Selection_cellules_verrouillees()
Dim ur As Range, zone1 As Range, zone2 As Range, zone3 As Range, zone4 As Range, zone5 As Range, c As Range, ref As Range
Set ur = ActiveSheet.UsedRange
If ur.Row > 1 Then If ur(0, 1).Locked Then Set zone1 = Rows("1:" & ur.Row - 1)
If ur.Row + ur.Rows.Count - 1 < Rows.Count Then If ur(ur.Rows.Count + 1, 1).Locked Then Set zone2 = Rows(ur.Row + ur.Rows.Count & ":" & Rows.Count)
If ur.Column > 1 Then If ur(1, 0).Locked Then Set zone3 = Columns(1).Resize(, ur.Column - 1)
If ur.Column + ur.Columns.Count - 1 < Columns.Count Then If ur(1, ur.Columns.Count + 1).Locked Then _
    Set zone4 = Columns(ur.Column + ur.Columns.Count).Resize(, Columns.Count - ur.Column - ur.Columns.Count + 1)
For Each c In ur
    If c.Locked Then Set zone5 = Union(IIf(zone5 Is Nothing, c, zone5), c)
Next
If Not zone1 Is Nothing Then Set ref = zone1
If Not zone2 Is Nothing Then Set ref = zone2
If Not zone3 Is Nothing Then Set ref = zone3
If Not zone4 Is Nothing Then Set ref = zone4
If Not zone5 Is Nothing Then Set ref = zone5
If ref Is Nothing Then MsgBox "Aucune cellule verrouillée" Else _
    Union(IIf(zone1 Is Nothing, ref, zone1), IIf(zone2 Is Nothing, ref, zone2), IIf(zone3 Is Nothing, ref, zone3), IIf(zone4 Is Nothing, ref, zone4), IIf(zone5 Is Nothing, ref, zone5)).Select
End Sub

Sub Selection_cellules_deverrouillees()
Dim ur As Range, zone1 As Range, zone2 As Range, zone3 As Range, zone4 As Range, zone5 As Range, c As Range, ref As Range
Set ur = ActiveSheet.UsedRange
If ur.Row > 1 Then If Not ur(0, 1).Locked Then Set zone1 = Rows("1:" & ur.Row - 1)
If ur.Row + ur.Rows.Count - 1 < Rows.Count Then If Not ur(ur.Rows.Count + 1, 1).Locked Then Set zone2 = Rows(ur.Row + ur.Rows.Count & ":" & Rows.Count)
If ur.Column > 1 Then If Not ur(1, 0).Locked Then Set zone3 = Columns(1).Resize(, ur.Column - 1)
If ur.Column + ur.Columns.Count - 1 < Columns.Count Then If Not ur(1, ur.Columns.Count + 1).Locked Then _
    Set zone4 = Columns(ur.Column + ur.Columns.Count).Resize(, Columns.Count - ur.Column - ur.Columns.Count + 1)
For Each c In ur
    If Not c.Locked Then Set zone5 = Union(IIf(zone5 Is Nothing, c, zone5), c)
Next
If Not zone1 Is Nothing Then Set ref = zone1
If Not zone2 Is Nothing Then Set ref = zone2
If Not zone3 Is Nothing Then Set ref = zone3
If Not zone4 Is Nothing Then Set ref = zone4
If Not zone5 Is Nothing Then Set ref = zone5
If ref Is Nothing Then MsgBox "Aucune cellule déverrouillée" Else _
    Union(IIf(zone1 Is Nothing, ref, zone1), IIf(zone2 Is Nothing, ref, zone2), IIf(zone3 Is Nothing, ref, zone3), IIf(zone4 Is Nothing, ref, zone4), IIf(zone5 Is Nothing, ref, zone5)).Select
End Sub
Nota : s'il y a trop (plusieurs milliers) de zones disjointes la méthode Union pédale dans la choucroute.

A+
 

Pièces jointes

  • Sélection(1).xlsm
    21 KB · Affichages: 0
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
315 127
Messages
2 116 534
Membres
112 771
dernier inscrit
mikadu49