Protection en VBA. 2 macro semblables, l'1 ne fonctionne pas

bonsoir,

Je cherche a protéger une feuille selon 3 critères.

Selon la valeur dans les cellules de la ligne 2. La colonne est modifiable (VM), non modifiable (V) ou masqué (C)

Je n'ai pas de problème pour masquer. Par contre, pour les colonnes non modifiables c'est là ou selon la macro utilisé j'ai un souci.

Dans le fichier fourni, en B si j'utilise le bouton "verrouilleold" (module1), bien qu'ne B1 il y a "V" je peux modifier la colonne alors qu'avec le bouton "verrouille" (module2) ma macro fonctionne.

A la base j'ai voulu refaire un fichier plus propre, afin de le présenté ici, quand au finale je me suis rendu que ma nouvelle macro fonctionné sans problème. J'ai donc mi la nouvelle macro dans l'ancien fichier et miracle cela fonction, pourtant c'est semblable.

Autre chose, au taf ma première macro est très lente XL2016, chez moi c'est rapide XL2010, je ne comprend pas non plus.

Sub verrouilleold()

Application.ScreenUpdating = False

ActiveSheet.Unprotect Password:="verrou"

For i = 1 To 5

If Cells(2, i).Value = "C" Then
Range(Columns(i), Columns(i)).Hidden = True
    Selection.Locked = False
    Selection.FormulaHidden = False
End If

If Cells(2, i).Value = "V" Then
Columns(i).EntireColumn.Select
    Selection.Locked = True
    Selection.FormulaHidden = False
End If

If Cells(2, i).Value = "VM" Then
Range(Columns(i), Columns(i)).Select
    Selection.Locked = False
    Selection.FormulaHidden = False
End If

Next i

ActiveSheet.Protect Password:="verrou"
Application.ScreenUpdating = True

End Sub
Sub verrouille()

ActiveSheet.Unprotect Password:="verrou"

Application.ScreenUpdating = False

derniereColonne = Cells(2, Columns.Count).End(xlToLeft).Column

For i = 1 To derniereColonne

' si C sur la ligne 2, colonne de la cellule caché
If Cells(2, i).Value = "C" Then
Range(Columns(i), Columns(i)).Hidden = True
End If

' si V sur la ligne 2, colonne de la cellule vérrouillé
If Cells(2, i).Value = "V" Then
Columns(i).EntireColumn.Select
    Selection.Locked = True
    Selection.FormulaHidden = False
End If

' si VM sur la ligne 2, colonne de la cellule non vérrouillé
If Cells(2, i).Value = "VM" Then
Range(Columns(i), Columns(i)).Select
    Selection.Locked = False
    Selection.FormulaHidden = False
End If

Next i

ActiveSheet.Protect Password:="verrou"

Application.ScreenUpdating = True

End Sub

Merci d'avance, visiblement il y a une différence vu qu'une des 2 macros fonctionne, mais là je doit avoir les yeux et le cerveau qui bug car j'en vois pas spécialement.

Cdt

Harissa23

16protection.zip (15.84 Ko)

Bonjour,

Je vais te donner une explication qui est peut-être subjective et qui vaut ce quelle vaut, ne t'en offusque pas. Mais je ne dois pas être bien loin du compte...

Les versions d'Excel sont comme les voitures de plus en plus sophistiquées. Avec les premières voitures, une clef de huit et un tournevis suffisaient. Aujourd'hui c'est même plus la peine d'ouvrir le capot...

Excel c'est un peu pareil : Dans le temps la machine était un peu rustique, on pouvait bricoler des trucs même avec deux mains gauche...

Aujourd'hui les capacités de programmation sont devenues si évoluées que la moindre entorse programmatique est directement censurée... (pas forcément par une erreur bloquante, mais par un résultat un peu différent de ce qui est attendu...)

Or ton code est encore un peu au niveau de la De Dion Bouton 1903...

Des select comme s'il en pleuvait

Des ActiveSheet

Des Selection...

Des Range(Columns(i), Columns(i))...

Tout cela est très approximatif (euphémisme ! ) Pas étonnant dans ces conditions que 2016 renâcle un peu... même si le compilateur croit comprendre quelque chose : Tout se passe un peu comme si toi tu essayais de comprendre quelqu'un qui parle "en petit nègre"...

Déjà qu'on a parfois du mal à se comprendre quand on parle la même langue alors quand c'est trop approximatif...

Pour positiver un peu, Ben... Il va falloir te mettre à étudier un peu la syntaxe, l'optimisation, la POO, bannir les déclarations inexistantes...

Comme ça VBA n'aura pas à perdre du temps à essayer de décoder ce que tu as bien voulu dire, essayer des auto-conversions scabreuses...

Bon... Je te donne une macro un peu plus en rapport avec ce que 2016 peut espérer...

C'est juste normalisé un peu hein... on peut encore optimiser pas mal hein ! D'ailleurs aujourd'hui on ne s'amuse plus à déprotéger à chaque macro !

Mébon au moins tu peux en espérer un résultat fiable...

Sub verrouille()
Dim i%, iLC%, S$, WS
S = ActiveSheet.Name
Set WS = Worksheets(S)
Application.ScreenUpdating = False
   With WS
   iLC = .Cells(2, .Columns.Count).End(xlToLeft).Column
   .Unprotect Password:="verrou"
      For i = 1 To iLC
         ' si C sur la ligne 2, colonne de la cellule caché
         If .Cells(2, i) = "C" Then
            .Columns(i).Hidden = True
         End If
         ' si V sur la ligne 2, colonne de la cellule vérrouillé
         If .Cells(2, i) = "V" Then
            .Columns(i).Cells.Locked = True
         End If
         ' si VM sur la ligne 2, colonne de la cellule non vérrouillé
         If .Cells(2, i) = "VM" Then
            .Columns(i).Cells.Locked = False
         End If
      Next i
   .Protect Password:="verrou"
   End With
Application.ScreenUpdating = True
End Sub

Sub deverrouille()
Dim i%, iLC%, S$, WS
S = ActiveSheet.Name
Set WS = Worksheets(S)
Application.ScreenUpdating = False
   With WS
      iLC = .Cells(2, .Columns.Count).End(xlToLeft).Column
      .Unprotect Password:="verrou"
      For i = 1 To iLC
         ' si C sur la ligne 2, colonne de la cellule affiché
         If .Cells(2, i) = "C" Then
            .Columns(i).Hidden = False
         End If
      Next i
   End With
End Sub

[Nota] J'ai viré le FormulaHidden qui ne sert à rien (False par défaut)

A+

Merci,

Tu réponds à ma question et en même temps pas vraiment et totalement en même temps.

Je dit pas vraiment car je vois vraiment pas la différence entre les 2 codes ( en effet FormulaHidden ne sert à rien, je m'en douté ) mais comme tu l'as dit et cela je sais que c'est mon gros handicape " Il va falloir te mettre à étudier un peu la syntaxe, l'optimisation, la POO, bannir les déclarations inexistantes... " ( la POO je ne sait pas ce que c'est ).

Pas d’inquiétude, je suis ici pour que l'on me dise que ce que j'ai fait c'est moche ! je ne m'offusquerai pas, au contraire. D’ailleurs les conseil en matière de formation en centre ( je suis sur Nantes ) ou autodidacte avec les bons livres (ou du bons tutos) sont les biens venus, même s'il FOO apprendre la POO.

Des ActiveSheet ,Des Selection..., Des Range(Columns(i), Columns(i)), Des select comme s'il en pleuvait...Totalement d'accord...C'est moche

D'ailleur c'est quoi la POO ?

C'est la première fois que je vois % sur une déclaration de variable. C'est quoi ? une remise à 0 ou plutôt faire en sorte que la variable n'ai jamais existé ?

En tout cas je te remercie pour ta réponse. Je regarderai de plus près ta macro ( je l'ai regardé mais je chercherai à la comprendre dans son ensemble )

PS: j'ai rien contre un éclairage sur la différence entre les 2 macros. Histoire de comprendre même si oui...il va falloir être plus rigoureux dès le début !

Merci

Harissa23

% c'est l'équivalent de As integer dans les Dim

la POO c'est un vaste sujet...

Dans ce contexte, "ton contexte" je veux dire par là que tu te contentes de cells, range... activecell ou active sheet : VBA doit en déduire tout ce que tu ne lui dis pas.

Un petit coup d'ActiveSheet pour Protect et Unprotect et pour le reste VBA NAKA se débrouiller pour savoir que le range ou la cells fait aussi partie d' ActiveSheet...

ça te parait évident à toi surtout sur un classeur qui n'a qu'une seule feuille et qu'on est en plus sur la feuille active... mais quand on a quinze classeurs ouvert avec un tripotée de feuille... KI C KI se décarcasse pour essayer de décoder ton machin... Hein ?

Bref... En programmation beaucoup de rigueur évite beaucoup de pertes de temps... Qu'on ait une feuille dans le classeur ou qu'on en aie quinze la programmation est la même et doit éviter toute ambiguïté...

A+

Ok, je viens de percuter un truc que j'aurai du faire plus tôt :

ça te parait évident à toi surtout sur un classeur qui n'a qu'une seule feuille et qu'on est en plus sur la feuille active... mais quand on a quinze classeurs ouvert avec un tripotée de feuille... KI C KI se décarcasse pour essayer de décoder ton machin... Hein ?

En effet j'y avais jamais pensé...mais non rien ne me parait évident, je suis au stade du copier-coller d'info trouvé sur le web et avancer à tâtons avec celles-ci et malheureusement avoir autre chose à faire pour pouvoir mi m'être à fond afin de progresser.

Tu m'as fait faire bon pas sur cette réponse ! je t'en remercie

Coté rigueur, programmation ou autre job c'est la même, sans elle c'est le bordel.

Merci encore d'avoir mi le doigt sur mes manques de connaissance, et mon manque de rigueur bien que je le considère plus comme un manque de connaissance. J'ai essayé de passer outre ( "vu le besoin faible que j'ai du vba") , pensant que çale le "ferait" mais c'est pas possible je m'en douté un peu...beaucoup. il va falloir que je me bouge.

J'y vois pas d'excuse ^^

Je validerai ta réponse demain soir, je laisse le temps histoire de voir si quelqu'un peut y voir entre les 2 codes une raison autre que mon manque de déclaration de variable et rigueur ainsi de mocheté du code. J'espère avoir compris également ta réponse d'ici là.

Dans le fond c'est déjà validé. Merci

Cdt

Harissa23

Rechercher des sujets similaires à "protection vba macro semblables fonctionne pas"