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 ?
J'ai compris ceci ... en cas de bug, la macro s'arrête et conserve la situationquand 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 ?
Application.EnableEvents = False
, cela résoud aussi une de mes énigmesJ'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
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 !
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.
Peux-tu préciser quel point bloquant ?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.
... dans quel sens ?Je joins le fichier de travail, et j'espère qu'on pourra avancer dessus,
- Messages
- 1'025
- Excel
- 2016 FR // 365
- Inscrit
- 19/04/2019
- Emploi
- Étudiant en 5e année d'école d'Ingénieur
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 :
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 :
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.