Protéger feuilles et les remplir avec userform

24essai.xlsm (72.15 Ko)

Bonsoir,

Je souhaiterais protéger la feuille produit, clients et les feuilles créer avec la feuille modèle pour permettre une consultation de ces feuilles sans risque de modification (création et modification uniquement avec userform)

Merci pour votre aide

Cordialement

Bonsoir,

Tu le fais ! Où est le problème ?

Lors d'intervention sur une feuille (en écriture), il conviendra que ton code déprotège la feuille avant d'écrire et reprotège ensuite.

Cordialement.

Bonsoir ,

Le problème c'est que j'ai essayé plusieurs solutions proposées sur internet et aucune ne fonctionne car je suis nul dans ce domaine

alors je fais appel à vous pour m'aider à finaliser mon programme

Merci

Cordialement

OK ! Mais je verrai ça demain quand mon installation aura repris tournure un peu plus viable...

A+

Bonsoir MFerrand

Désolé de te déranger encore, si c'est possible je voudrai masquer les feuilles avec les noms des clients à leurs créations. je n'ai malheureusement pas trouvé la solution. Pour ce qui est de masquer les autres feuilles j'ai trouvé la solution

merci pour ton aide

Cordialement

Bonsoir,

Tu veux que tes feuilles soient protégées et masquées, ou simplement masquées ?

Bonjour,

je voudrais masquer et protéger les feuilles

Merci

Bonjour,

Je reprends donc sur le fichier antérieur, sur lequel j'ai déjà travaillé...

Une proc. ajoutée en Module1 : DéprotProtF, lancée avec en arguments le nom de la feuille, et (optionnel) la valeur True s'il s'agit de protéger. Elle déprotège la feuille indiquée (permettant d'intervenir sur la feuille...) ou la protège et la masque (si elle ne l'est pas) en veryhidden (non accessible manuellement pour la rendre visible).

Les commandes utilisant cette procédure sont introduites dans les proc. d'Ajout, Modif ou Suppression (ainsi que ChangeNom) du formulaire d'ajouts de clients, de même que dans la proc. ajout de commande (formulaire commande).

J'ai ajouté une proc. (provisoire) pour les besoins de vérification, qui rend visible ou masque les feuilles concernées...

Cordialement.

61tguy-essai.xlsm (95.14 Ko)

Bonsoir,

Merci pour ta réponse mais j'ai deux problèmes je ne peux pas créer un nouveau client il me met un message comme quoi la feuille ou cellule est protégée et le deuxième problème, je peux supprimer un client mais je ne peux plus en supprimer d'autres il me met un message : L'indice n'appartient pas à la sélection .

Cordialement

C'est dû au fait que les feuilles étant masquées,le placement en dernière position d'une nouvelle feuille la place en fait après la dernière feuille visible. Mais la modification (changement de nom et inscriptions) va continuer de s'appliquer sur la dernière feuille (masquée), qui elle est protégée !

On va donc cibler ActiveSheet pour éviter ce problème.

NB-Attention : après erreur lors d'un test, il faut éliminer tous les éléments d'erreurs (inscription sur feuille Clients, modification à tort de la dernière feuille éventuellement, feuille créée mais non finalisée...), sinon ces éléments vont continuer de provoquer des erreurs en cascade...

Fichier rectifié.

Cordialement.

60tguy-essai.xlsm (87.35 Ko)

Bonjour,

Grand merci pour tout ce que tu as fait. Il me reste à trouver les solutions pour pouvoir visualiser la feuille Clients et la feuille de chaque client à la demande

Merci

Cordialement

Ça tu as la mécanique à suivre, mais le point essentiel est de savoir comment tu veux le faire ?

NB- Passant d'un endroit à l'autre alternativement tous les 4 jours en moyenne, j'ai un peu de mal à tout suivre...

Cordialement.

Bonjour,

Mon projet est finalisé, reste à voir à l'usage. Merci pour ton aide .

Cordialement

Bonsoir MFerrand

Désolé de te déranger une fois de plus mais j’ai créé un userform avec une ComboBox pour sélectionner un client et visualiser sa feuille avec un bouton nommé Visualiser , un autre bouton pour visualiser le fichier client nommé Fichier clients et un bouton Fermer qui ferme l’userform et masque le fichier actif jusque-là pas de problème. Mais si je visualise plusieurs feuille de suite seul la feuille active est masquée. Je souhaiterai si possible en sélectionnant une valeur dans la ComboBox , afficher directement la feuille et en sélectionnant une autre valeur masquer la feuille active et afficher la nouvelle feuille sélectionnée et idem avec le bouton Fichier clients et que la feuille active soit protégée. Serait-il possible de masquer l’Userform pendant la consultation de la feuille et de le réactiver par une touche clavier ou un double clic ou autre.

Merci

Cordialement

Bonjour,

Quel est ton code ?

Bonjour,

Voici mon code

Private Sub ComboBox_client_Click() 'la fiche du client

Dim Sh As Worksheet

On Error Resume Next

Set Sh = Sheets(ComboBox_client.Value)

If Err Then MsgBox "Feuille introuvable", 48: ComboBox_client.DropDown: Exit Sub 'en cas d'entrée manuelle incorrecte

On Error GoTo 0

Sh.Visible = True 'en cas de feuille masquée

Sh.Activate

End Sub

Private Sub CommandButton_clients_Click() 'la liste des clients

With ComboBox_client

lnm = .ListIndex + 1: cli = .Value

End With

DéprotProtF cli, True 'cache la feuille selectionnée

DéprotProtF "Clients"

Sheets("Clients").Visible = True

Sheets("Clients").Select

DéprotProtF cli, True

End Sub

Private Sub fermer_Click()

With ComboBox_client

lnm = .ListIndex + 1: cli = .Value

End With

DéprotProtF "Clients", True

DéprotProtF cli, True

UserForm1.Hide

End Sub

Private Sub UserForm_Click()

End Sub

Merci

Cordialement.

Bonjour,

Remarques :

1) [remarque d'ordre] : j'aurais préféré trouver le code sous balises Code, et corectement indenté ! Cela facilite très grandement la lecture et la compréhension, on ne le dira jamais assez !...

2) la conception de ton opération ne m'apparaît pas tout à fait claire ! Tu utilises une Combo, on s'attend donc à ce que tu alimentes la liste de cette Combo dans laquelle l'utilisateur pourra sélectionner un item.

S'agissant de feuilles, ce pourrait être la liste des clients, les noms de feuilles étant les noms de clients et une feuille étant créée à chaque insertion de client, il y a donc a-priori adéquation... Mais pas de liste !

2bis) Compte tenu de ce qui précède, une gestion d'erreur ne se justifie pas ! On introduit une gestion d'erreur lorsqu'on en prévoit la possibilité et la nature, de façon que l'exécution puisse se poursuivre, dans une situation tout à fait prévisible...

Mais si une erreur survenait, on n'en connait pas la cause ! Il faut donc qu'elle se produise, interrompe l'exécution, de façon que l'on puisse l'analyser et régler le problème, sans quoi l'on risque seulement de générer un problème que l'on ne sera pas en mesure de traiter...

2ter) Je ne comprends pas les raisons du choix de l'évènement Click plutôt que Change (évènement par défaut)...

Logiquement, il devrait y avoir une liste dans la Combo, à l'ouverture du Userform, choix dans la liste par l'utilisateur, test que l'on a bien opéré une sélection dans la liste, et dans ce cas réaliser alors l'opération prévue (qui semble être rendre visible la feuille sélectionnée et l'activer), et donc masquer le Userform !

3) Mais cette opération est doublée par un bouton ! Il conviendrait donc alors que rien ne se passe au niveau sélection dans la Combo et que l'opération soit déclenchée en totalité par le clic sur le bouton !

Il apparaît là que l'opération consiste à afficher la feuille sélectionnée + la feuille clients et à déprotéger les 2 !

Outre que si les feuilles sont protégées, c'est pour que l'on ne puisse intervenir hors des procédures d'insertion, modification, suppression prévues ! Il est donc contradictoire de les déprotéger...

La procédure DéprotProtF est conçue pour déprotéger les feuilles (en les conservant masquées) pour y apporter des modifications (sans les afficher). Son utilisation est certes possible, mais en tenant compte de cette particularité.

3bis) Il faut aussi noter que cette proc. initialise une variable lnm non utilisée ensuite (?) et dont on ne voit d'ailleurs pas l'utilité (NB- les variables ne sont en outre pas déclarées). Et également que la proc. ne masque pas le Userform...

Reprenons la logique d'une opération compte tenu des éléments examinés : sélection dans la liste de la Combo, clic sur le bouton qui déclenche alors l'affichage de la feuille sélectionnée et de la base clients (réserve sur la déprotection...), activation de la feuille sélectionnée, masquage du Userform, ensuite un dispositif devrait permettre de réafficher le Userform (en le réinitialisant) et de rétablir le masquage des feuilles démasquées... (dispositif qui en l'absence d'autre élément mis en place pourrait être le retour sur la feuille Boutons, ou même le fait que la feuille active ne soit plus l'une ou l'autre des deux feuilles démasquées...)

4) Le bouton fermer devrait se contenter de fermer le Userform...

5) Le problème majeur cependant, hors toute procédure, me semble être que, si l'on a mis en place un dispositif de travail pour les utilisateurs, dans lequel les feuilles sont protégées et masquées, qu'ils y interviennent donc sans les voir, on ne comprend pas la mise en place d'un dispositif d'affichage des feuilles à l'intention des mêmes utilisateurs... C'est un point clé à clarifier.

Cordialement.

Bonsoir,

Comme je l'ai mentionné au début je ne connais rien en programmation vba, on ne peut pas tout connaître .

Je regrette de ne pas avoir présenté le code dans les normes, pour ce qui est des erreurs dans le code j'ai fait ce que j'ai pu, c'est peu j'en suis conscient.

Pour la visualisation de la feuille liste des clients c'est pour avoir un visu sur tous les clients en même temps.

Pour la feuille de chaque client c'est pour avoir un visu des produits achetés ainsi que la fréquence d'achats de chacun des produits. Pour la protection des feuilles c'est juste pour éviter une mauvaise manipulation, ce programme étant pour mon usage personnel.

Merci de votre patience et de vos réponse.

Cordialement,

Guy

Bonsoir,

Mes remarques étaient destinées à te réorienter sur un suivi du déroulement logique de l'opération que tu projettes... Déjà ton idée d'affichage n'a pas été exprimée explicitement, c'est à dire que tu ne t'es pas fait le schéma complet de ce que tu voulais obtenir dans le cadre de l'état de ton projet. Tu as une base clients, sur laquelle tu gères tes clients (ajout, modif, suppression) et une feuille par client (créée automatiquement lors de son insertion). Ces éléments sont masquées. Tu veux mettre en place un dispositif permettant de les visualiser (en marge du processus de gestion). Tu choisis donc de passer par un formulaire qui va te permettre de sélectionner qui afficher et tu optes pour afficher la base Clients simultanément.

Jusque là il y a une logique mais tu ne poursuis pas l'explicitation jusqu'au bouclage de l'opération : qu'à la fin tout doit se retrouver dans l'état initial. Et tu te noies dans les détails des modalités d'affichage en en dédoublant la procédure avec chevauchement (des commandes se trouvent répétées deux fois dans ton code. Le choix d'une Combo est rationnel mais tu le laisses en plan sans l'initialiser avec la liste des choix possibles.

On repart donc de ton Userform avec une ComboBox et deux boutons : Afficher et Fermer.

Le Userform sera lancé par un bouton dans ta feuille bouton.

La Combo doit être initialisée avec la liste des clients : on reprendra donc l'initialisation de la Combo dédiée aux modifications et suppression (les noms des clients sont les noms des feuilles concernées) [Proc. Initialize]

L'affichage sera déclenché par le bouton Afficher : il fera apparaître la feuille Clients et la feuille du client sélectionné, en activant cette dernière, et il masquera le Userform. Si aucun client n'a été sélectionné dans la Combo, il n'affichera que la feuille Clients (et l'activera).

Le Userform étant masqué, il faudra un procédé pour l'afficher à nouveau après consultation des feuilles recherchées. Sans support fixe pour y placer un bouton de fin de consultation (et il n'est pas opportun de fourrer des boutons dans toutes les feuilles, on est amené à jouer sur les évènements : retour sur la feuille Boutons, cela déclenche le réaffichage du Userform et le masquage des feuilles.

Le bouton Fermer permettra de clore l'opération. Mais on aura aussi besoin de détecter que l'on est en opération de consultation (pour notamment éviter d'ouvrir le Userform chaque fois que tu irais sur la feuille Boutons !) Une variable que l'on passe à True au démarrage de l'opération et que l'on ramène à False à la fin jouera très bien ce rôle de détection.

Pour boucler la vue d'ensemble une seule procédure d'affichage masquage combinera les deux aspects de l'opération, on la lancera avec en arguments optionnels le nom de feuille Client (optionnel car s'il n'y en a pas elle n'affichera que la base Clients) et la valeur True pour indiquer l'affichage, et on la lancera sans arguments pour masquer. Ce qui implique de lui faire conserver le nom du client affiché (ce dont on n'aura pas à se préoccuper ailleurs...)

On peut donc à ce stade matérialiser le code de l'opération :

- Déclaration d'une variable publique (elle doit être accessible de plusieurs modules) dans Module1 : Affiche (booléenne).

- Bouton de lancement dans la feuille Boutons et procédure dans Module1 :

Sub Afficher()
    Affiche = True
    UserForm1.Show
End Sub

(Rien de plus à expliquer.)

- Procédure d'initialisation de la Combo à l'ouverture du Userform :

Private Sub UserForm_Initialize()
    Dim Lst
    With [CliCiv]
        If .Rows.Count < 2 Then Exit Sub
        Lst = .Offset(, 1).Resize(.Rows.Count - 1).Value
    End With
    If IsArray(Lst) Then
        cbxClient.List = Lst
    Else
        cbxClient.AddItem Lst
    End If
End Sub

(Code repris d'un autre formulaire...)

- Pas de code d'évènement sur la Combo (on y choisit un client [ou pas]). C'est le bouton Afficher qui déclenchera l'affichage :

Private Sub cbAffiche_clients_Click()
    Dim Cli$
    With cbxClient
        If .ListIndex > -1 Then Cli = .Value
    End With
    AfficheMasque Cli, True
    Me.Hide
End Sub

Code réduit : on se contente de prélever la sélection de la Combo (s'il y en a eu une, ce qui veut dire que la frappe d'un élément hors liste sera ignorée, logique car les feuilles existantes sont nécessairement dans la liste...), on lance la procédure AfficheMasque qui fera le reste (à noter que si Cli n'a pas été initialisée, on passe à la procédure une valeur vide [""]) et on masque le Userform.

- La procédure d'affichage (dans Module1) :

Sub AfficheMasque(Optional Cli As String, Optional aff As Boolean)
    Static cliaff As String
    If aff Then
        Worksheets("Clients").Visible = xlSheetVisible
        If Cli <> "" Then
            With Worksheets(Cli)
                .Visible = xlSheetVisible: .Activate
            End With
            cliaff = Cli
        Else
            Worksheets("Clients").Activate
            cliaff = "noCli"
        End If
    Else
        If cliaff <> "" Then
            Worksheets("Clients").Visible = xlSheetVeryHidden
            If cliaff <> "noCli" Then Worksheets(cliaff).Visible = xlSheetVeryHidden
            cliaff = ""
        End If
    End If
End Sub

Une variable statique permettra de conserver le nom du client entre deux appels de la procédure.

Le test sur l'argument booléen aff sépare la partie affiche de la partie masquage du code.

Pour l'affichage, on affiche la base Clients (qui le sera dans tous les cas), on teste si un nom de client a été passé et si c'est le cas on affiche la feuille à ce nom et on affecte le nom à la variable cliaff (statique, qui le conservera), si pas de client on affecte à la variable une mention indiquant qu'il n'y en a pas ("noCli").

Pour le masquage, on teste la variable statique, si elle ne contient rien c'est que rien n'est à masquer, sinon on masque Clients, et si elle contient un nom de client on masque aussi la feuille à ce nom. Et on supprime le contenu de la variable.

- Lors de l'activation de la feuille Boutons :

Private Sub Worksheet_Activate()
    If Affiche Then UserForm1.Show
End Sub

On réaffiche le Userform s'il a été ouvert.

- On remet le Userform en état lors de son réaffichage :

Private Sub UserForm_Activate()
    cbxClient.ListIndex = -1
    AfficheMasque
End Sub

Elle efface la sélection, et lance le masquage des feuilles qui avaient été affichées.

(NB- cette proc. est bien sûr exécutée aussi lors du premier affichage à l'ouverture du Userform, mais n'a aucun effet à ce moment.)

- On peut recommencer à consulter un autre client... On ferme quand on a fini :

Private Sub cbFermer_Click()
    Affiche = False
    Unload Me
End Sub

Ce qui clôt l'opération...

Cordialement.

139tguy-essai.xlsm (94.78 Ko)

Bonsoir,

Je te remercie pour ton travail. J'aurai encore besoin de tes services car je ne trouve pas la procédure pour dimensionner en automatique la largeur des colonnes en fonction du texte pour la feuille base clients et pour la feuille de chaque client si c'est possible . Merci

Cordialement.

Rechercher des sujets similaires à "proteger feuilles remplir userform"