Creer un code pour textbox

XGCATHY

XLDnaute Nouveau
Bonjour,
J'essaie de créer un userform.
J'ai trois deux comboBox, une appelée UNITE, l'autre METIER et j'ai une Textbox appelée REFERENCE UNITE METIER. Dans cette textbox je voudrai faire apparaître le résultat de la formule CONCATENER(UNITE;"-";METIER), laquelle formule est dans le fichier COMPETENCES, en colonne A.
Je souhaiterai, que l'UNITE sélectionnée dans la liste de choix "UNITES" et le METIER sélectionné dans la liste de choix "METIERS" permettent de trouver la ligne dans laquelle se trouve la référence qui elle-même se trouve dans la colonne REF_UNITE_METIER de la feuille COMPETENCES ; ceci a pour but de vérifier que la référence n'existe pas déjà. Je voudrais que cette référence s'affiche dans la textBox REF UNITE METIER.
Ensuite, si elle n'existe pas, et seulement si elle n'existe pas, créer une nouvelle ligne qui devra être renseignée.
Dans les Textbox, compétences techniques et compétences professionnelles apparaîtront les compétences si elles ont été créées ou bien elles seront saisies.
Je ne sais pas si je suis claire, mais voici mon fichier (allégé, mon fichier contient déjà 200 références, une fois terminé il avoisinera les 3000). J'ai fait une erreur voir plusieurs quelque part, sans aucun doute ?
J'espère que vous voudrez bien m'aider car je ne sais pas du tout comment m'y prendre et cela fait déjà plusieurs jours que j'essaie.
D'avance un gros merci pour tout ce que vous pourrez faire pour m'aider
 

Pièces jointes

  • BaseCompetenceTEST.xlsm
    34.8 KB · Affichages: 29

Dranreb

XLDnaute Barbatruc
Re : Creer un code pour textbox

Bonsoir.
Je ne comprends pas bien à quoi sert cette réf unité métier.
Ce qui serait facile c'est de chercher uniquement les associations unités et métiers présentes dans la feuille COMPETENCES en liant les 2 ComboBox grâce à mes modules de service très pratiques et facile à utiliser.
Il ne serait éventuellement pas impossible de proposer en plus des unités et métiers qui n'y figurent pas, cherchés dans les feuilles UNITES et METIERS. Mais ça compliquerait. Pourquoi serait-ce plus simple de les choisir que de les taper s'ils n'y figurent pas encore ?
 

XGCATHY

XLDnaute Nouveau
Re : Creer un code pour textbox

Bonsoir Dranreb,

La réponse à la question que tu poses est dans ta dernière phrase ? Car le challenge, est à la fois de trouver les métiers associés à des unités qui existent pour éventuellement renseigner ou modifier les compétences et aussi s'ils n'existent pas de les créer en respectant la structure (caractère, espaces etc.) des unités et des métiers. En fait, cette base contient des données qui viennent de deux autres sources (unités et métiers) sur lesquelles je n'ai pas la main.La base créée avec l'USF servira à créer les nouveaux Métiers tout en gardant les anciens qui doivent être libellés exactement comme ils figurent dans la source. C'est uniquement pour cette raison que j'ai opté pour la liste de choix. Mais je fais peut-être fausse route, et je suis preneuse de ce que tu appelles "lier deux Combobox" (ça m’intéresse beaucoup)ou "modules de service" dont je ne sais absolument rien, surtout si c'est facile à utiliser. Si tu peux m'expliquait ce serait super ! Quitte à ce que je revoie la structure de la base.
Je te remercie par avance.
 

Dranreb

XLDnaute Barbatruc
Re : Creer un code pour textbox

Il s'agit d'un type d'objet virtuel appelé ComboBoxLiées défini par un module de classe du même nom.
Il suffi de déclarer une variable globale (c'est à dire en tête du module de l'UserForm) de ce type, en général je l'appelle CL, puis, dans une Sub UserForm_Initialize on lui attribue des ressources, on lui indique une expression Range représentant la plage de la base de données, enfin on lui indique chaque ComboBox qu'il devra prendre en charge, accompagné du numéro de colonne ou de l'entête de colonne dans la base d'où il devra tirer sa List, en la restreignant selon les choix déjà effectués dans les autres ComboBox.
Comme une ComboBox, il décrète des évènements, dont un transmet le numéro de ligne dans la base (et non dans la feuille) contenant la combinaison des valeurs tapées ou choisies si elle existe.
 

XGCATHY

XLDnaute Nouveau
Re : Creer un code pour textbox

Je vois l'articulation générale, et je crois que c'est exactement ce qu'il me faudrait ! Le hic c'est que mes connaissances en code sont très limitées, donc variable globale ?? Objet virtuel ??? Sub UserForm_Initialize ???? Je n'ai aucune idée de comment traduire tout ça dans mon fichier sous forme de code. Pourtant tu as piqué ma curiosité, pourrais-tu m'envoyer un bout de fichier pour que je comprenne, stp...
Merci de ton aide.
 

Dranreb

XLDnaute Barbatruc
Re : Creer un code pour textbox

Une variable globale est une variable connue et partagée au moins par toutes les procédure de ce module si elle est déclarée en tête avec le mot clé Private, voire au delà du module si c'est avec Public.
UserForm est un objet de tous les UserForm quels que soit leurs noms, figurant dans la liste déroulante de gauche qui surmonte la fenêtre de code. Initialize est un évènement de cet objet qui survient lors du chargement en mémoire de l'UserForm. Il figure, lui, dans la liste de droite. Conseil: Toujours utiliser ces listes déroulantes de dessus pour implanter les modèles de procédures destinées à prendre en charge les évènements.
Je vais équiper ton classeur des 5 modules de service nécessaires dont 3 de classe.
Et ajouter peut être un peu de programmation applicative adaptée à ton cas. (par opposition avec la programmation de service dans mon jargon personnel)
 

Dranreb

XLDnaute Barbatruc
Re : Creer un code pour textbox

Voila, voila.

Je n'ai rien écrit pour exécuter les opérations de mise à jour finale (manque des boutons Effacer, Annuler, Ajouter, Modifier, Supprimer)

Oups. J'ai oublié un LCou = 0 quelque part. Ça pourrait gêner par la suite parce que LCou va nous permettre de savoir si on est en voie de modification ou d'ajout. Ça pourrait être le même bouton pour les deux d'ailleurs mais qui porte tantôt "Ajouter" tantôt "Modifier".
C'est là :
VB:
Private Sub CL_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
If NbrLgn = 1 Then Exit Sub
LCou = 0
ReDim VLgn(1 To 1, 1 To 13)
GarnirTBx
End Sub
Je le joins corrigé, au cas où tu ne l'aurais pas encore récupéré…
 

Pièces jointes

  • CBxLiéesXGCATHY.xlsm
    133.9 KB · Affichages: 30
Dernière édition:

XGCATHY

XLDnaute Nouveau
Re : Creer un code pour textbox

Bonjour Dranreb,
Car nous sommes sur le petit matin avec tout ça.
Encore merci beaucoup, c'est un travail de dingue que tu as fait. C'est génial.
Il faut que je potasse maintenant pour assimiler. Je vais créer les boutons manquants en espérant y arriver. Je testerai ensuite pour voir les modifs et les nouveaux enregistrements.
Si tu veux bien je reviendrai vers toi si j'ai un souci. A bientôt et merci encore.
 

XGCATHY

XLDnaute Nouveau
Re : Creer un code pour textbox

Bonjour Dranreb,

Je suis déçue, je m'en veux d'être aussi nulle, mais c'est trop compliqué pour moi. Je suis bien obligée d'admettre que je serai incapable d'en assurer la maintenance en cas de PB. Donc me voilà rendue à la case départ. Il faut que je trouve le moyen de simplifier le fichier. La question est comment ? Je n'en ai pas la moindre idée. En tout merci encore pour l'aide.
 

Dranreb

XLDnaute Barbatruc
Re : Creer un code pour textbox

Bonsoir.
Pourtant ce ne sont pas de grosses procédures.
Et pas compliquées, il suffit de penser un peu à l'envers de ce que j'ai fait pour afficher les infos existantes, avec les mêmes expressions un peu partout (CL.PlgTablo.Rows(LCou) et VLgn(L, C) essentiellement) mais les affectations y étant faites dans l'autre sens. Refaire à l'envers ce qui est fait dans GarnirChamps en quelque sorte: on charge d'abord les valeurs des contrôles dans VLgn qu'on affecte ensuite à CL.PlgTablo.Rows(LCou).Resize(, 13).Value
Un peu plus compliqué si on veut sécuriser, c'est à dire désactiver les boutons qui ne sont pas pertinents selon le contexte.
Joignez ce que vous avez fait, je corrigerai.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Creer un code pour textbox

Bonjour.

Ça peut ressembler à ça, mais on peut encore mieux faire :
VB:
Option Explicit
Private WithEvents CL As ComboBoxLiées
Private LCou As Long, VLgn()
'

Private Sub UserForm_Initialize()
Set CL = New ComboBoxLiées
CL.Plage FeuiCompét.Rows(2)
CL.Add Me.ComboUNITE, "B"
CL.Add Me.ComboMETIER, "C"
CL.CouleurSympa
CL.Actualiser
End Sub
'

Private Sub CL_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
If NbrLgn = 1 Then Exit Sub
LCou = 0
ReDim VLgn(1 To 1, 1 To 13)
GarnirTBx
BtnValider.Enabled = Complet
BtnValider.Caption = "Ajouter (Entrée)"
BtnSupprimer.Enabled = False
BtnQuitter.Caption = IIf(Complet, "Annuler", "Effacer") & " (Echap)"
End Sub
'

Private Sub CL_BingoUn(ByVal Ligne As Long)
LCou = Ligne
VLgn = CL.PlgTablo.Rows(LCou).Resize(, 13).Value
GarnirTBx
BtnValider.Enabled = True
BtnValider.Caption = "Modifier (Entrée)"
BtnSupprimer.Enabled = True
BtnQuitter.Caption = "Annuler (Echap)"
End Sub
'

Private Sub GarnirTBx()
Dim C As Long
For C = 1 To 5
   Me("Text" & C & "KTECH").Text = VLgn(1, 3 + C)
   Me("Text" & C & "KPRO").Text = VLgn(1, 8 + C)
   Next C
End Sub
'

Private Sub BtnQuitter_Click()
If CL.ChangéÀLEchap Then Exit Sub
Select Case Left$(BtnQuitter.Caption, 1)
   Case "A": GarnirTBx:   BtnQuitter.Caption = "Effacer (Echap)"
   Case "E": CL.Nettoyer: BtnQuitter.Caption = "Quitter (Echap)"
   Case "Q": Unload Me: End Select
End Sub
'

Private Sub BtnValider_Click()
Dim C As Long
If LCou = 0 Then
   CL.ValeursVers VLgn
   LCou = CL.PlgTablo.Rows.Count
   CL.PlgTablo.Rows(LCou).Copy
   CL.PlgTablo.Rows(LCou).Insert
   Application.CutCopyMode = False
   LCou = LCou + 1: End If
For C = 1 To 5
   VLgn(1, 3 + C) = Me("Text" & C & "KTECH").Text
   VLgn(1, 8 + C) = Me("Text" & C & "KPRO").Text
   Next C
CL.PlgTablo.Rows(LCou).Resize(, 13).Value = VLgn
CL.Actualiser
End Sub
'

Private Sub BtnSupprimer_Click()
CL.PlgTablo.Rows(LCou).Delete
CL.Actualiser
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
311 737
Messages
2 082 036
Membres
101 878
dernier inscrit
1475214