Besoin d’aide pour module de classe

fenec

XLDnaute Impliqué
Bonjour le forum,
Besoin de vos compétences
Ayant plusieurs textbox renommés avec le même code ainsi que dans initialisation de mon userform, j’ai après de nombreuses recherche lu qu’il fallait passer par des modules de classe mais mon niveau vba est trop faible et n’y suis pas parvenu.
Cordialement
Philippe
 

Pièces jointes

  • BD Forum.xls
    167.5 KB · Affichages: 64
  • BD Forum.xls
    167.5 KB · Affichages: 78
  • BD Forum.xls
    167.5 KB · Affichages: 85

fenec

XLDnaute Impliqué
Re : Besoin d’aide pour module de classe

Bonjour le forum, Dranreb
Venant de tester votre fichier il me semble encore avoir un petit bogue " comme vous dites ", je vérifie demain car manque de temps ce soir.

J’ai également constaté que si l’on supprime une personne la numérotation en colonne " A" de la BD n’ai plus logique, d’où ma question :
Est-il possible de renuméroter cette colonne si personne supprimée ?

J'ai remarqué aussi que vous aviez supprimé de la base l'enregistrement de l'âge ainsi que l'ancienneté alors que ce point m'était demandé. Sur ce point je vais reprendre votre code précédent qui le gérais et vais voir si je parviens à le réintégrer dans votre nouveau fichier.

Pardonnez- moi si j’abuse de votre temps

Dans un deuxième temps je rajouterais ma 3ème frame et vous demanderais de l’aide à nouveau si besoin.

Cordialement,
Philippe.
 

Dranreb

XLDnaute Barbatruc
Re : Besoin d’aide pour module de classe

Bonsoir

À quoi sert-elle au juste la numérotation en colonne A ? C'est normal que si on supprime une personne, ça supprime son numéro, non ? Ou alors ce n'est pas un renseignement propre à la personne mais un numéro d'ordre de ligne indépendant de ce qu'elle contient, et il faudrait une formule :
Code:
=LIGNE()-2

Je n'ai jamais enregistré l'age ni l'ancienneté. C'est depuis mes 1ères propositions une formule, mais elle a sauté, je ne sais pas quand. C'est en L3 :
Code:
=ENT((AUJOURDHUI()-K3)/365,2425)
C'est peut être dû à des essais de suppressions quand il reste moins de 3 lignes. De fait il faut la remettre après effacement du reste:
VB:
Private Sub BtnSupprimer_Click()
If MsgBox("Voulez vous vraiment supprimer " & Me.CBxPrénom & " " & Me.CBxNom & " ? (Action irréversible)", _
   vbYesNo + vbExclamation, Me.Caption) = vbYes Then
   If CL.PlgTablo.Rows.Count < 3 Then
      CL.PlgTablo.Rows(LCou).Value = Empty
      CL.PlgTablo.Cells(LCou, "A").Value = 0
      CL.PlgTablo.Cells(LCou, 5).FormulaR1C1 = "=INT((TODAY()-RC[-1])/365.2425)"
      CL.PlgTablo.Cells(LCou, 12).FormulaR1C1 = "=INT((TODAY()-RC[-1])/365.2425)"
   Else
      CL.PlgTablo.Rows(LCou).Delete: End If
   MsgBox "Données supprimées.", vbInformation, Me.Caption: End If
LibérerLaRecherche
End Sub
Ou même mieux: ne plus effacer les formules en faisant :
VB:
CL.PlgTablo.Rows(LCou).SpecialCells(xlCellTypeConstants).Value = Empty
Si la colonne A devient aussi une formule, on ne pourra plus s'en servir dans la Sub BtnEntrée_Click pour reconnaître une ligne non significative, il faudra plutôt tester si le nom est vide :
VB:
If IsEmpty(CL.PlgTablo.Cells(1, 2).Value) Then
Et il ne faudra plus écrire le numéro, plus bas, au Case "Ord"

Remarque: les formules sont reconduites dans la Sub BtnEntrée_Click par la séquence CL.PlgTablo.Rows(LCou).Copy suivi de CL.PlgTablo.Rows(LCou).Insert. On ne s'en occupe donc pas dans la programmation.
Vous voyez, on ne peut décidément pas vider complètement le tableau, parce qu'il faut préserver les formules et les formats.
 
Dernière édition:

fenec

XLDnaute Impliqué
Re : Besoin d’aide pour module de classe

Bonjour le forum, Dranreb

Je reviens vers vous après un problème de connexion internet car je rencontre encore deux petits soucis.

1: J’ai modifié la programmation en fonction de votre dernier post mais lors de l’enregistrement d’une nouvelle personne la numérotation ne s’effectue pas alors que l’on ne supprime plus les formules.

Code:
CL.PlgTablo.Rows(LCou).SpecialCells(xlCellTypeConstants).Value = Empty

2: J’ai ensuite rajouté ma troisième frame et la, si je la renseigne, je ne peux plus supprimer la fiche créer.

J’espère être assez clair dans mes explications

Vous mon dernier fichier.

Cordialement,
Philippe
 

Pièces jointes

  • BD Dranreb Forum.xls
    351 KB · Affichages: 32
  • BD Dranreb Forum.xls
    351 KB · Affichages: 41
  • BD Dranreb Forum.xls
    351 KB · Affichages: 43
C

Compte Supprimé 979

Guest
Re : Besoin d’aide pour module de classe

Bonjour le Fil, Salut Dranreb

Juste de passage pour dire à Dranreb, quel superbe boulot esthétique et parfaitement fonctionnel ;)

A part que je n'ai pas compris comment on fait pour enregistrer un nouveau salarié (peut-être pas encore prévu)

Bravo l'ami
liorem_10_10.gif
 

Pièces jointes

  • liorem_10_10.gif
    liorem_10_10.gif
    579 bytes · Affichages: 56
  • liorem_10_10.gif
    liorem_10_10.gif
    579 bytes · Affichages: 56
Dernière modification par un modérateur:

fenec

XLDnaute Impliqué
Re : Besoin d’aide pour module de classe

Re, bonjour BrunoM45

L'enregistrement est prévu, essayez comme ceci
Pour enregistrer un nouveau salarié vous renseignez :
Nom, prénom, date de naissance, N° SS, matricule et date d’entrée.
Vous verrez alors l’info qui indique que la nouvelle fiche est prête à être ouverte
Cliquer alors sur ouvrir
Compléter votre fiche et cliquer sur le bouton ajouter

Dranreb: le 1er point est résolu j'avais oublié de supprimer le contrôle IDt dans le Tag

Cordialement,
Philippe
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Besoin d’aide pour module de classe

Bonjour.

Merci d'avoir expliqué à BrunoM45 la procédure prévue pour enregistré un nouveau salarié.

Je soupçonne une incohérence de nature ou de forme de donnée entre l'entrée et de sortie, de sorte que la fiche apparaît modifiée dès qu'elle est affichée, or on n'a pas le droit de supprimer une fiche qu'on a commencé à modifier.

Je vais examiner tout ça pour voir ce qu'il en est.

À +

Je vois une chose qu'il ne faut surtout pas faire tant que l'userform est chargé: un Call Tri_Bd_Personnel. Ça faussera complètement l'effet le dernier CL.Actualiser effectué par LibérerLaRecherche à partir de l'emplacement après tri du nouveau salarié ajouté !

Encore qu'un existant actuellement pourrait éventuellement en être amené à disparaître, il va hélas falloir un Select Case Right$(.TBx.Tag, 3) supplémentaire quelque part pour contrôler si une date facultative de TextBox a changé. 3 possibilités:
1) - Dans le module de classe TextBoxMmbr, mais ça ne me plait pas beaucoup, même s'il a déjà une propriété Valeur, un peu trop simple, utilisée seulement dans HabiliterContrôles mais pas dans la BtnEntrée_Click.
2) - Dans la Sub HabiliterContrôles
3) - Dans une Private Function ValeurTbx(ByVal TBx As MSForms.TextBox) histoire de ne pas avoir à écrire deux fois les mêmes instructions, dans HabiliterContrôles et dans BtnEntrée_Click. Ça se passe entre ces deux choses et la classe TextBoxMmbr. Il faut une politique claire de sortie des données tant pour le contrôle si changé par rapport à l'entrée que pour l'écriture. Là, plusieurs code ont voulu en faire un bout chacun dans son coin, ça ne va pas. Je n'ai pas assez pensé le truc. Et vous qu'est ce que vous en pensez ?

Bon j'ai opté pour la 3iéme solution.
 

Pièces jointes

  • CBxLiéesFenec.xls
    339.5 KB · Affichages: 42
  • CBxLiéesFenec.xls
    339.5 KB · Affichages: 50
  • CBxLiéesFenec.xls
    339.5 KB · Affichages: 56
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Besoin d’aide pour module de classe

Bonjour.

Pour la numérotation, si vous tenez à laisser la CBxN°Ord avec Tag "Idt Org" et la recherche dessus, il faut aussi laisser les Case "Ord" mais sans rien faire derrière pour empêcher de jouer les Case Else qui les suivent.
Mais le mieux ce serait de ne plus prévoir de contrôle du tout pour cette info qui ne sert à rien, ou à la rigueur juste un Label en y mettant LCou.
 
Dernière édition:

fenec

XLDnaute Impliqué
Re : Besoin d’aide pour module de classe

Bonjour le forum, Dranreb ,BrunoM45
Merci d'avoir expliqué à BrunoM45 la procédure prévue pour enregistré un nouveau salarié.
c'est le moins que je puisse faire et je rejoins ses propos
quel superbe boulot esthétique et parfaitement fonctionnel
Après quelques essaies de votre solution, tout semble être rentrer dans l'ordre.
Pour la numérotation, elle ne me sert en fait qu'à connaitre le nombre de salarié.
Mais que voulez dire par:
ou à la rigueur juste un Label en y mettant LCou.

PS:
Je vois une chose qu'il ne faut surtout pas faire tant que l'userform est chargé: un Call Tri_Bd_Personnel
Comment faire le tri de la base de données alors?
Dois je rajouter un bouton?
Cordialement,
Philippe.
 
Dernière édition:
C

Compte Supprimé 979

Guest
Re : Besoin d’aide pour module de classe

Bonjour le fil

Pour info : le numéro de SS ne fonctionne pas correctement
le faite de remplir tous les 1er champs ne permet pas d'ouvrir une nouvelle fiche

A+
 

fenec

XLDnaute Impliqué
Re : Besoin d’aide pour module de classe

Bonsoir BrunoM45
Dranreb a rajouté un chiffre au N°de SS afin de pouvoir mettre des N° bidon pour faire des tests essayer avec le votre vous verrez que tout fonctionne parfaitement
Voir post #24
Cordialement,
Philippe.
 

Dranreb

XLDnaute Barbatruc
Re : Besoin d’aide pour module de classe

Mais que voulez dire par:
ou à la rigueur juste un Label en y mettant LCou.
Si vous tenez à ce que le numéro de la ligne du gars continue d'apparaître encore quelque part dans l'UserForm, il suffirait d'un Label dans lequel vous mettriez la valeur de la variable LCou, dès que celle ci est initialisée <> 0, car elle est alors très exactement le numéro d'ordre d'une ligne existante dans CL.PlgTablo, donc exactement la même valeur que ce que renvoie la formule =LIGNE()-2 à cette ligne là.

Comment faire le tri de la base de données alors?
Dois je rajouter un bouton?
Ce que je fais assez souvent c'est une Worksheet_SelectionChange dans la feuille qui classe le tableau sur la colonne dont on a sélectionné le titre. Ça donnerait ça dans notre cas :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Columns.Count > 1 Or Target.Row <> 2 Then Exit Sub
PlgUti(Me.Rows(3)).Sort Key1:=Target, Order1:=xlAscending, Header:=xlNo, _
   OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
   DataOption1:=xlSortNormal
End Sub
Mais il ne faudrait pas non plus l'exécuter pendant que l'UserForm est affiché. Au fait, pourquoi a-t-il sa propriété ShowModal à False ? C'est un peu dangereux. Il n'y a pas que le Tri qui peut fausser les choses. Des modification à la volée directement dans la feuille aussi !
Quoi qu'il en soit, du moment qu'il ne change pas pendant que l'UserForm est affiché, l'ordre de classement n'a strictement aucune incidence sur les listes des ComboBox: tout y est reclassé en interne par les fonctions du module MSujetCBx à l'aide d'un objet TableIndex.
 
Dernière édition:

fenec

XLDnaute Impliqué
Re : Besoin d’aide pour module de classe

Bonjour le forum, Dranreb
Il est vrai que le numéro ne sert en rien dans l’userform mais je vais essayer d’intégrer un label au cas ou je devrais le laisser en espérant ne pas faire de bêtises.
Pour ce qui est du tri je ne connaissais pas cette méthode passant généralement par un bouton ou en appelant la procédure (merci pour cette solution)

Au fait, pourquoi a-t-il sa propriété ShowModal à False ? C'est un peu dangereux.

Simplement pour voir les transferts de données lors des essais, je le remettrais à True à la fin.

Cordialement,
Philippe
 

Dranreb

XLDnaute Barbatruc
Re : Besoin d’aide pour module de classe

Bonjour.

Si c'est juste pour des vérifications vous pourriez avoir intérêt à faire Application.GoTo PlgLCou dans la CL_BingoUn derrière votre LabLCou.Caption = LCou, ce qui diminuerait encore l'intérêt de ce dernier, d'ailleurs.
 
Dernière édition:

fenec

XLDnaute Impliqué
Re : Besoin d’aide pour module de classe

Bonjour le forum, Dranreb

Avec votre solution pour vérifier les données j’abandonne complètement le N° qui ne sert plus à rien.

Mais encore besoin de vos lumières si je n’abuse pas trop.
Ayant vidé mon fichier afin d’avoir un modèle vide j’ai constaté plusieurs choses. Une erreur de ma part je ne sais pas !

1. Dans certains texbox la grandeur d’écriture est plus grande alors que la taille de la police est la même.

2. Si pas de salariés enregistrés et que j’ouvre l’userform, je suis obligé de le fermer par la croix, le bouton quitter n’étant pas actif mais effacer qui ne répond pas.

3. Si la base de données est vide à l’ajout de salarié une ligne reste vide.
1er salarié ok en ligne 1
2ème salarié en ligne 3 et ligne 2 vide
Après le tri ligne 3 vide.

Je continue mes recherches sur ces points.

Cordialement,
Philippe.
 

Dranreb

XLDnaute Barbatruc
Re : Besoin d’aide pour module de classe

Bonjour.

Alors là, c'est vraiment très étrange ! J'avais remarqué en effet les tailles différentes mais j'étais persuadé que les polices l'étaient.
Ça m'a bien l'air d'être un bogue dans MSForms: ça à l'air de dépendre du Top des TextBox: jusqu'à 46,2 c'est grand, à partir de 46,3 c'est plus petit. Autre découverte: Quand on supprime le Caption "Enfants" de la Frame3 le problème semble disparaître.

La base de données ne doit pas être vide: elle doit au moins contenir la formule =LIGNE()-2 en A3:A4 et les formules d'ancienneté et les bons formats sur les 2 1ères lignes. Les noms doivent être vides en revanche. Ces lignes seront en principe employées en priorité lors de la création des 2 1ers vrais salariés, dans BtnEntrée_Click, grâce aux instructions :
If IsEmpty(CL.PlgTablo.Cells(1, 2).Value) Then
LCou = 1
ElseIf IsEmpty(CL.PlgTablo.Cells(1, 2).Value) Then
LCou = 2
.
 

Discussions similaires

Statistiques des forums

Discussions
312 347
Messages
2 087 504
Membres
103 565
dernier inscrit
Fabien78