Protection des feuilles VS VBA ! le conflit

Bonsoir,

je ne sais pas si cela est permis ou non mais je remet mon problème au gout du jour afin qu'il puisse avoir plus de chance d’être résolu , je demande des excuses d'avance si cela n'est pas autoriser et que cela me soit signalé si c'est le cas pour ne plus refaire la méme chose.

le sujet en question était le suivant:

https://forum.excel-pratique.com/excel/qu-es-ce-qui-cloche-t100848-10.html

voila;

comme convenu j'ai préparé tout mes scénarios, mis toutes mes mise en forme conditionnelles

précisé toutes les cellules a verrouiller grâce au format de cellule

j'ai enregistré le fichier a la feuille 2 et désactivé l'événement workbook_open , pour qu'a l'ouverture ce dernier présente les données des scénarios en feuil2 avec résultat attendu

problématique

1. lorsque j'active la feuil1 (ce qui déclenche l'événement worksheet_activate) cela fait planté Excel

2. j'aimerai mettre une protection des feuilles et du classeur sans que cela ne fasse planté le code VBA des dites feuilles

14saisi-dossier-2.xlsm (918.00 Ko)

Bonjour,

En l'état ça ne plante pas mais ça rame un peu !

J'ai parcouru le sujet précédent et il me semble qu'il t'a été fait un bon nombre de remarques pertinentes dont il serait judicieux de tenir compte. Il y a beaucoup à faire pour faire en sorte que ton code tienne la route et cela avancerait que tu t'essaies à l'améliorer un peu.

Je renonce à m'y lancer car il y a trop à faire et je n'en ai pas du tout le temps en ce moment. Mais je peux te faire part de mes premières remarques, à toi d'y réfléchir... :

D'abord l'indentation est quelque peu fantaisiste avec de plus un bon nombre de lignes sautées, ce qui ne facilite guère la lecture... En la matière je suis certainement plus exigeant que la plupart de mes camarades, mais à cette heure-ci je me refuse à lire du code aussi peu soigné dans l'écriture et la présentation.

J'apprécierais aussi de voir toutes les variables déclarées, et en tête de procédure, comme il se devrait. Et non apparaître au fil de l'eau...

Egalement, ne pas voir de variables qui n'ont pas lieu d'être : dans tout module d'objet, l'objet auquel est dévolu le module répond toujours au mot-clé Me, donc la feuille concernée par les procédures d'évènements s'appelle avec Me, sans mobiliser une variable non déclarée de surcroît.

Avec ça on commencerait à avoir un code lisible sans effort particulier, ce qui serait déjà un immense progrès !

Il conviendrait aussi de faire disparaître les quelques Select subsistants (scories de code enregistré ?) ou l'utilisation alternative de Formula (influence de l'enregistreur ?) et Value..., réserver Formula pour insérer des formules (s'il y a lieu), Value est la propriété par défaut de Range et elle répond parfaitement aux besoins d'affectations de valeurs.

Des remarques sur les boucles t'ont déjà été faites, je n'y reviens pas.

On ne fait pas un programme en mettant bout à bout des codes d'origines diverses et de styles notablement différents...

J'ai noté aussi 3 Userforms identiques. C'est du gaspillage, et manifestement 2 de trop.

Sur tes feuilles une ligne vide entre chaque ligne utilisée. C'est une pratique très déconseillée.

Un peu plus de rationnalité, cela évitera de nombreuses erreurs et facilitera le traitement de celles qui apparaissent.

Quant à la question des protections, je conseillerais compte tenu de l'état de réalisation, de mettre d'abord de l'ordre et faire en sorte d'avoir une application fonctionnelle répondant aux objectifs principaux qui lui sont assignés, pour la revoir dans un contexte plus favorable par la suite.

Cordialement.

Merci beaucoup MFerrand

je m'y colle je vais essayer de faire de mon mieux

en ce qui concerne les 2 userforme en trop je laisse la question en suspend d'abord je dois améliorer le reste puis je reviens vers vous si possible

merci

Voila étant novice je met du temps mais j’essaie de faire de mon mieux pour donner une suite a la suggestion de Mr MFerrand et pour éclairer tout ceux qui auront le temps d'y jeter un œil pour m'aider dans la mesure du possible

j'ai fait une tentative de remanier un peu le fichier et voila un premier Jet :

S.V.P. faites abstraction de tout ce qui n'a pas relation avec l’événement Worksheet_change de la feuil2

si vous pouviez m'orienter vers une procédure meilleur ou un point que je doive étudier ou approfondir cela serait le bien venu

c'est ma première variable tableau faites moi savoir si je m'y prend bien avant que j'attaque le worksheet_change de la feuil1

merci beaucoup

Bonsoir,

Il y a quelques améliorations de forme, mais on verra ça plus tard...

Je dois avouer que je ne comprends pas bien ce que tu veux exactement faire !

Ta procédure reste tout de même un peu compliquée...

Sub Déblocage()
    Dim Sh As Worksheet, i%, j%, n%, vtest
    Set Sh = Sheets("Feuil1")
    Application.ScreenUpdating = False
    With Sheets("Feuil2")
        n = .Cells(.Rows.Count, 2).End(xlUp).Row
        For i = 1 To n
            If Sh.Cells(i, 3) > 0 Then
                vtest = 0
                For j = 5 To 9 Step 2
                    If .Cells(i, j) > 0 Then vtest = vtest + j - 4
                Next j
                Select Case vtest
                    Case 1, 4, 9: .Cells(i, 11) = Sqr(vtest)
                    Case 0: .Cells(i, 11) = "Pas encore"
                    Case Else: .Cells(i, 11) = "Manque O.V!!!"
                End Select
            Else
                Exit Sub
            End If
        Next i
    End With
End Sub

Celle-ci devrait aboutir au même résultat.

Tu noteras que je l'ai transformé en Sub ordinaire, car un balayage de tout ton tableau à partir d'une évènementielle ne se justifie pas. Une procédure Change est utile pour intervenir ponctuellement à partir des éléments modifiés, si tu vérifies tout ton tableau à chaque changement de cellule, tu passeras ton temps à attendre que VBA te rende la main pour te la reprendre aussitôt si tu fais quelque chose...

Par ailleurs note que ton tableau, tu passes du temps à le remplir, cela peut être didactique, mais tu ne t'en sers nullement ensuite, tu testes juste sur le tableau ce que tu aurais pu tester sur les cellules, afin de remplir la colonne K. Il aurait été plus logique d'établir un tableau destiné à servir en bloc la col. K à la fin en une fois en affectant le tableau...

Je n'ai pas repris cette idée dans la proc. ci-dessus car ta sortie de procédure sur test de la colonne C de Feuil1, colonne dont le contenu est également en Feuil2 m'a paru curieux...

En évènementielle, la même action se limiterait logiquement à la ligne de changement :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Sh As Worksheet, i%, n%, vtest
    n = Target.Row
    If n > 1 And Sheets("Feuil1").Cells(n, 3) > 0 Then
        vtest = 0
        For i = 5 To 9 Step 2
            If Me.Cells(n, i) > 0 Then vtest = vtest + i - 4
        Next i
        Select Case vtest
            Case 1, 4, 9: Me.Cells(n, 11) = Sqr(vtest)
            Case 0: Me.Cells(n, 11) = "Pas encore"
            Case Else: Me.Cells(n, 11) = "Manque O.V!!!"
        End Select
    Else
        Exit Sub
    End If
End Sub

Mais il conviendrait que l'on cadre beaucoup mieux les modifications sur lesquelles déclencher cette action. C'est encore beaucoup trop imprécis...

Cordialement.

merci beaucoup MFerrand ne serait ce que pour le temps que tu prend a m'expliquer mes lacune grâce a toi je sais que j'ai encor beaucoup de chemin a faire mes tes conseils me sont d'une très grande aide

j'essayerai de m'en souvenir dans mes prochaine bout de code que je tenterai de mettre en place

sur cela il ne me reste plus qu'a te souhaiter une très bonne nuit

merci

bonsoir bonsoir, j’espère que tout le monde se porte bien sur le forum

bon voila j'ai essayé au mieux de suivre vos conseil et ainsi faire quelque chose de potable de ma petite application de saisi et je suis fière du résultat (croyez moi a mon niveau faire une tel chose après même pas 4 mois de VBA a es yeux c'est un exploit)

la il ne me reste qu'a revenir au sujet du départ de ce topic :

pourriez vous me dire (m'expliquer) comment procéder afin de mettre une protection a la feuille dans le but d'évité d'altérer les formule ou les mise en forme conditionnelles sans que cela n’interférè avec le bon fonctionnement du code VBA ?

merci de votre aide d'avance

j'ai posé la même question ou presque avec d'autre éléments si ca peut aider quelqu'un d'autre en profitant de la solution proposé

je ferai suivre la reponse aussi si elle est fournis ici

https://forum.excel-pratique.com/excel/mettre-une-protection-sans-interferer-avec-vba-t101088.html

et voila, sur ça je clôt la discutions

https://forum.excel-pratique.com/post592098.html#p592098

bonne lecture a tout ceux que cela intéresse

merci a tout les participant et surtout un grand merci a ceux qui m'ont appris des choses et donner des conseils tout au long de ce sujet.

Rechercher des sujets similaires à "protection feuilles vba conflit"