Modification de fichier

OK ! Cela nécessite quelques explications :

Modifications apportées niveau feuilles :

Feuil1 : colonne Mail ajoutée (elle figure dans BDD, et prise en compte dans Userform1, mais manquait sur la feuille) en col. Q, ce qui décale les colonnes qui suivent de R à AA.

(NB- Si des adresses mail figurent dans la BDD, elles seront répercutées, mais tu n'auras que le texte de l'adresse mail, si tu souhaites récupérer un lien actif [qui a pour effet d'ouvrir une fenêtre de création de message de ton application de messagerie par défaut], il faudra compléter le code de la procédure de validation pour créer le lien hypertexte lors de l'insertion de la ligne.)

La colonne A de la base de cette feuille est nommée : LstEv, elle est définie par la formule :

=DECALER(Feuil1!$A$2;;;NBVAL(Feuil1!$C:$C)-1)

Le nom s'adaptera donc à l'extension de la base.

BDD : aucune modification, il s'agit d'une feuille réceptionnée mensuellement. Pour cette raison, j'ai supprimé le nom qui avait été mis (dont la formule m'avait parue un peu bizarre...), la feuille étant destinée à changer.

La seul obligation lors du changement reste donc de la renommer BDD.

liste : 3 listes de cette feuille sont utilisées pour la saisie. Elles ont été nommées, respectivement Situ, Actions et Acteurs.

Nommage normal (non dynamique) mais ces listes ne sont pas destinées à subir des changements, du moins si c'est le cas ils ne seront pas fréquents...

A noter que la liste Situ comporte en regard les niveaux RPS que le nom ne couvre pas, ce qui n'empêche nullement d'atteindre cette 2e colonne à partir du nom : [Situ].Cells(1, 2) renverra le niveau associé au 1er libellé de la liste.

Il en est de même pour Feuil1, le nom donné à une seule colonne n'empêche pas d'atteindre les autres. Et la ligne d'insertion d'un nouvel évènement sera rapidement définie par : [LstEv].Rows.Count + 1. En outre, l'utilisation du nom lors de l'affectation évite de faire appel à la feuille, qui peut donc changer de nom sans que cela ait la moindre conséquence.

Modifications apportées à UserForm1 :

Il y avait 2 Combos et 14 TextBox couvrant les champs de données de la BD, la Combo Matricule

a été remplacée par une ListBox. Ces contrôles ont été renommés avec un préfixe indicatif du type de contrôle, suivi de BD, et suivi d'un numéro d'ordre correspondant à la colonne de BDD.

On a donc : lbxBD1, cbxBD2, tbBD3 à tbBD16.

Les TextBox ne sont pas destinées à être utilisées pr l'utilisateur, ils sont donc verrouillés et exclus de la tabulation (Locked à True et TabStop à False)

Pour la saisie de l'évènement, une TextBox et une ComboBox existaient déjà. On a ajouté 9 TextBox ou ComboBox pour couvrir tous les champs de saisie d'un évènement.

Le renommage, ici, n'utilise pas un préfixe indicatif du type, de façon à pouvoir les utiliser dans une même boucle. Ils sont nommés Ev1 à Ev10.

La TextBox destinée à accueillir le niveau RPS est nommée EvNiv, sa valeur sera affectée en colonne A de la base Evènements, non contiguë avec les autres champs à saisir (R à AA). Le niveau étant affecté automatiquement en fonction de la situation retenue, cette TextBox est verrouillée et exclue de la tabulation.

Ev1 est la ComboBox destinée à sélectionner la situation, Ev7 celle destinée au choix de l'action, et Ev8 celle destinée au choix de l'acteur. Les listes des Combos sont affectées par la propriété RowSource.

Les 3 boutons ont été renommés : cbValid, cbFiche et cbQ. Un 4e à été ajouté pour réinitialiser si besoin, cbRéinit.

Les boutons Fiche et Réinitialiser ne sont pas actifs à l'ouverture du Userform (Enabled à False). Ils le deviendront lors de la validation d'un évènement.

Au niveau code du UserForm1 :

L'initialisation qui intervient avant ouverture charge dans la Combo cbxBD2 une liste des NomsPrénoms de la BDD (colonne 2), en éliminant les homonymes. La méthode est globalement la même que celle qui préexistait, cependant un tri préalable de la BDD sur cette colonne permet de simplifier un peu la procédure, de même que celle qui permettra de servir la ListBox avec les matricules.

Choix dans la ComboBox Noms : au départ l'utilisateur ne peut agir que sur cette Combo pour identifier l'agent concerné par l'évènement. Le choix permet de garnir la ListBox lbxBD1 avec le matricule correspondant à ce choix, plusieurs s'il y a des homonymes.

Si un seul, il sera automatiquement sélectionné, ce qui déclenchera le remplissage des TextBox. Si plusieurs, à l'utilisateur de choisir le bon matricule. Il peut d'ailleurs les sélectionner tour à tour, afin de déterminer s'il y a lieu à l'aide des autres informations, quel est le bon. Ses changements, tant dans la sélection du nom que tu matricule s'il y a lieu sont suivis par les autres contrôles.

lbxBD1 est une ListBox accueillant une liste à 2 colonnes dont l'une est masquée et contient le numéro de ligne du matricule dans la feuille BDD. La propriété Value de la ListBox renvoie ce numéro de ligne, qui lors de la sélection est stockée dans une variable niveau module lnBD qui sera utilisé lors de la validation pour récupérer rapidement les informations concernant l'agent.

Saisie de l'évènement : une fois identifié l'agent, il peut passer à la saisie. Cela commence en principe par la sélection d'une situation (mais aucun ordre n'est imposé). Cette sélection (Combo Ev1), entraîne l'affectation du niveau à EvNiv.

Il n'a pas été défini de critères de contrôle de validité de la saisie des différents champs, aussi seuls pour l'instant sont soumis à contrôle ceux destinés à accueillir des dates (Ev2, Ev6 et Ev10), de façon à s'assurer que la saisie sera bien identifiable comme date.

Validation : lorsque l'utilisateur valide sa saisie de l'évènement, dans la mesure où il n'a pas été défini de champ obligatoire, la vérification préalable ne porte que sur le fait qu'un agent a bien été identifié, et qu'un évènement (situation) a bien été défini.

L'affectation se fait ensuite en utilisant le nom LstEv couvrant la 1re colonne de la base évènement : on définit la ligne d'insertion, on sert en 1re colonne sur cette ligne le niveau, les 16 colonnes suivantes avec la ligne de la BDD en une fois pour l'ensemble, on sert ensuite les 10 dernières colonnes à partir des saisies, en distinguant l'affectation des dates (conversion afin d'éviter une inversion jour/mois toujours possible sinon).

A l'issue, le bouton Valider est désactivé, pour éviter que la validation soit dupliquée accidentellement (les données restent présentes dans le Userform pour être utilisées lors du lancement éventuel de la constitution de la Fiche, il convient donc d'éviter toute manoeuvre indue...)

Les boutons Ficher et Réinitialiser sont, eux, activés. L'utilisateur peut ainsi lancer la constitution de la Fiche, ou si pour une raison quelconque il ne le souhaite pas, peut Réinitialiser (ce qui effacera les données présentes dans le Userform) afin de saisir un nouvel évènement.

A suivre pour la Fiche...

Cordialement.

Le fichier... (petit problème pour l'insérer avec le message).

Bonjour MFerrand

Superbe travail c'est clair que je n'aurais pas fait mieux

Par contre j'ai decouvert un bug lorsque la feuil1 est vide (premiere utilisation) j'ai cette erreur quand je clic sur le bouton valider.

erreur

et lorsque je clic sur Débogage cette ligne est surligner.

  
        lni = .Rows.Count + 1 

En tous cas je le redit Mais Bravo et

Bonjour,

Rien d'anormal, si la feuille est vide la plage n'existe pas...

Si tu dois démarrer à vide, on va procéder autrement : définition de la plage :

=DECALER(Feuil1!$A$2;;;NBVAL(Feuil1!$C:$C))

on enlève le -1 qui compensait l'en-tête, ainsi la plage nommée inclut une ligne vide à la fin, elle est donc toujours définie.

Mais en contrepartie, la ligne d'insertion d'un nouvel évènement ne sera plus la première ligne qui suit la plage, mais la dernière ligne de la plage:

Private Sub cbValid_Click()
    ...
    With [LstEv]
        lni = .Rows.Count
        ...

Cordialement.

Une autre petite modification dans Userform1 :

lni, variable destinée à recueillir la ligne d'insertion dans la base évènement est basculée en varaible niveau module.

Elle est ainsi conservée et peut être réutilisée par la procédure associée au bouton FICHE : cette dernière l'utilise pour définir une variable String NPMat constituée le NomPrénom de l'agent et le Matricule séparés par " - "

NB- Je fait le prélèvement sur Feuil1 par sécurité, mais tu auras à stabiliser tes matricules qui paraissent de façon un peu aléatoires en valeur texte (cadrés à gauche dans la cellule) ou en valeur numérique (cadrés à droite), en mettant la colonne Matricule de la base évènement en format Texte, ce qui devrait éliminer ou au moins limiter les erreurs d'incompatibilité de type susceptible de survenir, ou la non reconnaissance d'un matricule provoquée par la disparition des 0 initiaux. Les matricules de ton modèle ne présentant aucune régularité de forme, il est difficile d'adopter une mise en forme qui garantisse leur reconnaissance...

Cette procédure n'appellera pas le formulaire FICHE mais la procédure d'ouverture du formulaire Agent en lui passant la chaîne texte concaténée NPMat :

Private Sub cbFiche_Click()
    Dim NPMat$
    With [LstEv]
        NPMat = .Cells(lni, 3) & " - " & .Cells(lni, 2)
    End With
    Me.Hide
    Agent NPMat
End Sub

Cet argument est optionnel pour la procédure

Agent

, il sera présent lorsqu'elle est appelée à partir de Userform1, et dans ce cas elle va rechercher les lignes évènements relatives à l'agent concerné, en se limitant à celui-ci. Si elle est appelée directement (l'argument aura la valeur ""), elle chargera une liste des NomPrénom-Matricule de la base évènements pour sélection de l'agent dont on souhaite éditer la fiche.

Le Userform FICHE est recomposé : il comporte une Combo (à 2 colonnes dont une masquée, la 1re montre la liste des Agent-Matricule, la seconde stocke une chaîne listant les numéro de lignes des évènements de l'agent séparés par des points-virgule). A la sélection d'un agent (ou automatiquement dans le cas d'un seul agent lorsque l'appel est fait à partir de Userform1), la valeur de la Combo renvoyée par le choix effectué, est constituée par ce ou ces numéros de ligne(s) et permet de servir une ListBox avec les situations enregistrées (aucune sélection à faire dans la ListBox, elle est purement informative, si l'utilisateur se rend compte qu'il s'est trompé d'agent, il modifie sa sélection agent et le reste suit). La validation (bouton Valider) provoquera l'édition de la Fiche.

Il me reste à écrire cette procédure de validation, et tester ce qui précède, dès que j'ai un moment car j'ai aussi d'autres choses qui m'attendent...

Cordialement.

Bon! J'ai réussi en voulant regarder autre chose au passage à fermer ton fichier sans enregistrer !

Bon pour tout refaire !

Déjà refait le Userform (FICHE), la procédure Combo, les modifs de userform1, me reste plus que la proc de lancement avant de continuer...

Re bonjour

Fait une Pause

C'est deja sympa alors va y doucement .

Mais pas trop.

J'ai en principe fini, mais il me faut tout de même tester a minima pour éliminer les grosses bévues éventuelles... Mais ça devra attendre demain.

Super.

Je vous remercie encore beaucoup.

A demain alors.

Bien cordialement

Re,

Si tu souhaites vraiment te lancer dans les tests... tu cours le risque que ça plante au premier lancement, une virgule mal placée suffit pour ça !

Je te mets le fichier : la procédure de lancement du usf FICHE est Agent (dans Module1), elle est soit lancée par le bouton FICHE de Userform1, soit par le bouton Agent de la feuille FICHE AGENT.

Sa structure est simple : If... [code si lancement par b. FICHE] Else [code si lancement par b.Agent] End If

Le code du usf FICHE est relativement réduit : juste la proc. de la Combo qui affiche les situations dans la ListBox et la proc. du bouton VALIDER qui lance la validation.

(Pas d'Initialize : l'initialisation est réalisée par la procédure appelante ; pas de proc. associée à la ListBox qui est juste là pour affichage)

Et la proc. de validation proprement dite, qui édite la fiche est dans Module1 : EditFiche.

Si tu souhaites une sauvegarde en pdf de la fiche, il faut l'introduire à la fin de cette procédure.

Cordialement.

Re

MERCI beaucoup .

Je regarde tous cela Afin de comprendre au mieux.

Et te tiendrai au courant.

Rechercher des sujets similaires à "modification fichier"