UserForm

Fais le toi-même

Et quand tu n'as plus de modif du formulaire tu les enlèves !

Ah yes, ok !

Mais petit problème, j'avais fais les modifications avant que tu ne m'envoi cette nouvelle information !

Donc du coup, je ne sais plus trop quoi faire...

Ce que j'ai proposé, c'est juste pour être tranquille pendant les modifs, mais ce n'est nullement obligatoire du reste ! Donc laisse tomber.

Quand ce sera un peu rodé, j'ajouterai une gestion d'erreur de quoi alerter en cas de problème de macro et ne pas bloquer. Car ces macros se désactivent s'il y a une erreur et la seule solution est alors de fermer et rouvrir le fichier. Pour le moment j'ai éjecté la seule gestion d'erreur nécessaire pour le reconnaissance des cellules en _colXXX dans une fonction séparée pour ne pas occulter d'autres problèmes. Mais c'est la seule amélioration que je pense apporter, le reste ma plait assez.

Ce qu'il manque c'est la suppression d'un code agent, mais là on peut aller directement dans BD supprimer une ligne. Est-ce que ce n'est pas ceci qui avait causé une erreur ? en tous cas je n'avais pas à l'époque prévu le cas et c'est corrigé aussi.

D'ailleurs je me demande s'il faut prévoir l'ajout d'un nouvel agent via le formulaire ... cela pourrait simplifier le code (je suis toujours à la recherche d'un code le plus simple possible).

Pour le moment c'est une belle aventure ! Tu m'as poussé dans mes retranchements. Le formulaire était trop complexe pour le mettre dans un userform dont je ne suis pas très fana. Sans compter la macro, la gestion des dates, les choix par menu déroulant, la mise en forme etc...

Ok, super un grand merci pour tes interventions.

Je dois réaliser le même formulaire mais pour la notation d'une autre catégorie de personnel.

Donc je vais faire les modifications et normalement les Macros doivent fonctionner puisque je n'ai juste qu'à insérer des colonnes supplémentaires.

Je mets en forme et reviendrai certainement vers toi !

Cordialement, Chti59xcel

Bonjour,

Je viens aux nouvelles ... l'appli est-elle stable ? plus de bug ?

quand j'ai voulu tester le changement des Agents, le fonctionnement c'est bloqué quelques soit l'appel du code Agent, les mises à jour ne se sont pas faites et je ne sais identifier d'où vient le problème ?

J'ai compris ceci ... en cas de bug, la macro s'arrête et conserve la situation
Application.EnableEvents = False
, cela résoud aussi une de mes énigmes

J'ai continué à travailler le code, mais en même temps je me suis dit qu'il valait mieux ne pas ajouter un nouveau code agent via le formulaire (pas plus qu'on ne peut le supprimer), mais qu'il valait mieux faire et réserver ces opérations via BD. J'ai mis aussi en paramètres en début de macro (voir constantes), le préfixe, le nom de l'onglet base de donnée, et le nom de la cellule-clé (qui fait référence à la colonne A de la base de données). Plus une gestion simplifié des erreurs éventuelles. A toutes fins utiles :

Option Explicit
Const prefixe = "_col" ' le nom de la zone doit être suivi du n° de colonne dans la base de données, exemple _col21
Const BdD = "BD" ' onglet où se trouve la base de données
Const ID = "ID" ' nom donné au champ clé dans le formulaire, en colonne A de la BdD obligatoirement

Private Sub Worksheet_Change(ByVal Target As Range)
Dim nom As Name, colonne As Long, ligne As Long
    Application.EnableEvents = False
    On Error GoTo fin
    With Sheets(BdD)
        ligne = lig(True)
        Application.StatusBar = ""
        If Not Intersect(Target, Range(ID)) Is Nothing Then
            If ligne = 0 Then
                MsgBox "Code """ & Range(ID).Value & """ inconnu !"
                Application.Undo
            Else
                renseigner True
            End If
        ElseIf lenom(Target) Like prefixe & "*" Then
            .Cells(ligne, col(lenom(Target))) = Target.Cells(1).Value
            Application.StatusBar = "Mise à jour pour " & Range(ID).Value & " ok :: " & Target.Cells(1).Value
        End If
    End With
    Application.EnableEvents = True
    Exit Sub
fin:
    MsgBox "Erreur n° " & Err.Number & vbLf & Err.Description
    Application.EnableEvents = True
End Sub

Private Sub Worksheet_Activate()
    Application.EnableEvents = False
    Application.StatusBar = ""
    On Error GoTo fin
    If lig(True) = 0 Then
        Range(ID).Value = "" ' le code a été supprimé - on efface tout !
        renseigner False
    Else
        renseigner True
    End If
    Application.EnableEvents = True
    Exit Sub
fin:
    MsgBox "Erreur n° " & Err.Number & vbLf & Err.Description
    Application.EnableEvents = True
End Sub

Private Function lenom(cel As Range) As String
' donne le nom affecté à la zone éventuellement fusionnée ou à défaut son adresse
    lenom = cel.Address
    On Error Resume Next
    lenom = cel.Cells(1).Name.Name
End Function

Private Function col(chaine As String) As Long
' donne le numéro de colonne issu du nom de la zone
    col = Val(Mid(chaine, Len(prefixe) + 1, Len(chaine) - Len(prefixe)))
End Function

Private Function lig(ok As Boolean) As Long
' donne la ligne où se trouve l'ID dans BD, 0 si pas trouvé !
Dim trouve As Range
    lig = 0
    Set trouve = Sheets(BdD).Columns("A").Find(what:=Range(ID).Value, LookAt:=xlWhole)
    If Not trouve Is Nothing Then lig = trouve.Row
End Function

Private Sub renseigner(ok As Boolean)
' ok false = effacer, true = remplir
Dim nom As Name
    For Each nom In ThisWorkbook.Names
        If nom.Name Like prefixe & "*" Then
            If ok Then
                Range(nom.Name).Value = Sheets(BdD).Cells(lig(True), col(nom.Name))
            Else
                Range(nom.Name).Value = ""
            End If
        End If
    Next
End Sub

Hello, merci pour ce nouveau retour de Macro.

Les nouvelles sont plutôt bonnes, j'ai testé le fonctionnement à plusieurs reprises et le résultat attendu correspond à l'effet recherché.

Il me semble qu'à un moment donné, on avait une forme de ralentissement au niveau du rafraîchissement des données et la correction intervenait après avoir fermé et enregistré le classeur au moment de la réouverture de celui-ci, mais ça n'a pas duré...

J'ai intégrer aussi tous les éléments à un autre classeur d'évaluation qui a quelques colonnes différentes en plus et le programme à bien fonctionné également.

Je vais tester à nouveau le programme avec cette nouvelle macro et je te tiendrai informé seulement après la semaine prochaine car je vais être absent.

Bonne journée, bien cordialement, Chti59xcel

Bonjour,

Les codes mis à disposition par STEELSON sont clairs et l'approche séduisante.

J'aimerais savoir s' il serait possible de copier les données dans le formulaire à partir d'autres feuilles pour générer plusieurs enregistrements d'ID sachant qu'il faut cliquer manuellement pour valider la création de l'enregistrement.

Merci,

Bonjour TahitiBoy

J'ai essayé de faire quelque chose d'assez générique, qu'il est possible de recopier sans modification de macro.

J'aimerais continuer dans cette voie et ne pas faire quelque chose de trop spécifique.

Pourrais-tu me donner un exemple simplifié de ce que tu souhaiterais que je regarde comment adapter ?

Bonjour Steelson,

car tu l'a signalé dans les messages de l'année dernière, lorsque qu'il y a beaucoup de données, l'utilisation des USERFORM devient compliquée. C'est le cas ici avec 55 lignes de références variables plus toutes les autres.

Tu constateras sur le fichier, que l'objectif de ce module est la génération automatique d'un bordereau de diffusion (qui peut prendre beaucoup de temps pour le compléter traditionnellement).

A partir d'une requête sur la base, les résultats sont mis en forme (formatage intermédiaire en cours d'écriture) avant d'être envoyé dans le formulaire qui s'auto incrémente ou qui propose un état temporaire le temps de le remplir (à cause du worksheet.Activate).

Lorsque le formulaire se rempli, les numéros de lignes sont calculés sur test des données dans la colonne désignation, car j'envisage une option (cf.3ème idée)

Suivant la première idée, une fois le formulaire rempli on l'imprime et on l'envoi.

Suivant la deuxième idée, il arrive qu'il faille enlever des lignes ou en rajouter suivant les cas de figure.

Suivant la troisième idée, on à un joli formulaire tout beau avec des sections (1 ligne entière grisée par lot ou émetteur, ou autre clé de formatage), et dans ce cas là la numérotation des lignes doit s'incrémenter avec saut de ligne.

Etant donnée la clarté de ton code, je pense que tu as déjà du penser à ce type de situation. J'essaie d'implémenter le code au maximum, mais là je suis sur un point bloquant.

L'intérêt de ton code est qu'il permet de créer une base complémentaire qui dans ce cas précis va permettre d'enregistrer les références des plans qui ont été diffusés. Ainsi en ré-éditant les bordereaux on à la trace en excel de ce qui a été envoyé. d'autant plus que dans la base BD on doit récupérer la date d'envoi du bordereau.

Je joins le fichier de travail, et j'espère qu'on pourra avancer dessus,

J'espère pour toi que cela fonctionne car j'ai une erreur sur Mid ici

Private Function col(chaine As String) As Long
' donne le numéro de colonne issu du nom de la zone
    col = Val(Mid(chaine, Len(prefixe) + 1, Len(chaine) - Len(prefixe)))
End Function

Tu peux supprimer le nom _col1 car il est en fait remplacé par ID et c'est mieux (je crains des interférences)

Désolé, je suis un peu perplexe !

je pense que tu as déjà du penser à ce type de situation.

In fine je ne suis pas sûr d'avoir bien compris. Mon but initial était de faire un formulaire de saisie/modification/lecture.

je pense que tu as déjà du penser à ce type de situation. J'essaie d'implémenter le code au maximum, mais là je suis sur un point bloquant.

Peux-tu préciser quel point bloquant ?

Je joins le fichier de travail, et j'espère qu'on pourra avancer dessus,

... dans quel sens ?

Bonjour à tous,

Je me permet de remonter le topic puisque c'est celui lié au formulaire sur onglet de @Steelson. Si je me trompe, veuillez m'excuser !

En voulant réaliser un petit formulaire d'authentification permettant l'accès à certains onglets en fonction de l'utilisateur, je me suis heurté au masquage du mot de passe. En cherchant sur internet, je ne trouvais que des messages disant que c'était impossible dans une cellule.

Mais, armé de patience, j'ai réussi à ce que le mot de passe soit affiché masqué en temps réel au fur et à mesure que l'utilisateur le tape.

Cela nécessite en revanche l'utilisation d'une API mais d'après mes tests ce n'est pas si dérangeant ou lourd.

Je me suis inspiré de ce fichier trouvé sur le net :

15keypress-event.xlsm (20.96 Ko)

Qui permet sur une certaine plage de bloquer l'écriture de chiffres.

Le code pour permettre cela est assez pointu, du moins avec les connaissances que j'ai à l'écriture de ce post, mais je pense l'avoir plutôt bien bidouillé pour l'appliquer à mon problème, c'est à dire masquer un mot de passe lors de son écriture.

Voici le fichier avec formulaire d'authentification et masquage du mot de passe :

16form-mdpmasque.xlsm (36.58 Ko)

Vous pouvez le tester avec :

  • utilisateur : admin ; mdp : admin
  • utilisateur : chef ; mdp : chef
  • utilisateur : secretaire ; mdp : 1234

En espérant que cela puisse aider des personnes...

Bonne journée,

Baboutz

Super Baboutz, je vais regarder cela de près.

Rechercher des sujets similaires à "userform"