VBA USERFORM
[b]userform recherche[/b]
je souhaite dans combobox1 avoir un menu déroulant où je choisis en premier lieu les clients sans doublons.(autorisation de saisie intuitive )
Dans combobox2 un menu déroulant s'afficherait avec uniquement les ao/cons de client en question(choisi dans combobox1).
Dans combobox3 un menu déroulant s'afficherait avec uniquement l'objet marche du client et n° ao/cons en question simultanément (selon le choix du combobox1 et combobox2 au meme temps)
la colonne des clients sera alimenter chaque jour avec d'autre client nouveau ou existant mais le n° ao/cons change. je veux si j ajoute un client a la cellule A1048576 sera ajouter automatiquement a la liste déroulante client de mémé pour n° ao/cons et objet marche c et a dire elle n est pas limite
la colonne de n° ao/cons peut contenir un même réferance pour deux ou plusieurs client
aussi je veut afficher le résultat associer au 3 liste déroulante avec le bouton recherche
un bouton nouveau recherche qui initialise les 3 liste
déroulante
un bouton modifier qui sauvegarde les changement associer au 3 liste
déroulante
[b]userform nouveau[/b]
les 3 combobox sont alimenter comme j ai indiquer dans userform recherche
c est a dire si le client existe déjà je le récupéré directement (saisie intuitive) sinon je le tape manuellement
un bouton nouveau enregistrement qui ajoute les données a la dernière ligne vide
aidez moi svp c est très urgent et merci
Bonjour Radhouane, bonjour le forum,
Je ne dispose pas sur mon PC des contrôles DTPicker. Je ne peux pas les utiliser dans le code et donc il te faudra adapter la solution que je te propose. Elle utilise la propriété [Tag] des contrôles.
Cette propriété [Tag], à définir uniquement sur les contrôles à renseigner, permet de leur attribuer le numéro de la colonne correspondante au contrôle (par exemple : la TextBox4 = [Caution Provisoire/Montant] se trouve en colonne F (=6), j'attribue à la TextBox4 la propriété [Tag] = 6. La TextBox5 = [Caution définitive/Montant] se trouve en colonne H (=8), j'attribue à la TextBox5 la propriété [Tag] = 8).
Il te faudra faire de même avec les DTPikers pour que le code que je te propose fonctionne !
Je n'ai touché qu'à l'UserForm RECHERCHE, tu pourras appliquer le même principe pour NOUVEAU.
Le code :
Private O As Worksheet 'déclare la variable O (Onglet)
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Private LI As Integer 'déclare la variable LI (LIgne)
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
'DTPicker1.Value = Now
'DTPicker2.Value = Now
'DTPicker3.Value = Now
'DTPicker4.Value = Now
'DTPicker5.Value = Now
'DTPicker6.Value = Now
'DTPicker7.Value = Now
'DTPicker8.Value = Now
Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A7").CurrentRegion 'définit le tableau des valeurs TV (attention, il commence à la ligne 6 !)
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
'Remarque, les données commencent à la troisième ligne du tableau des valeurs TV qui correspond à la ligne 8 de l'onglet !
'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la troisième)
For I = 3 To UBound(TV, 1)
D(TV(I, 1)) = "" 'alimente le dictionnaire D avec les données en colonne 1 du tableau des valeurs TV
Next I 'procaine ligne de la boucle
Me.ComboBox1.List = D.keys 'alimente la ComboBox1 avec la liste des éléments du dictionaire D sans doublons
End Sub
Private Sub ComboBox1_Change() 'au changement dans la ComboBox1
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Me.ComboBox2.Clear 'vide la ComboBox2
Me.ComboBox3.Clear 'vide la ComboBox3
If Me.ComboBox1.Value = "" Then Exit Sub 'si la ComboBox1 est effacée, sort de la procédure
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 3 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la troisième)
If TV(I, 1) = Me.ComboBox1.Value Then 'condition si la donnée ligne I, colonne 1 du tableau des valeurs TV est égale à la valeur de la ComboBox1
D(TV(I, 2)) = "" 'alimente le dictionnaire D avec les données en colonne 2 du tableau des valeurs TV
End If 'fin de la condition
Next I 'procaine ligne de la boucle
Me.ComboBox2.List = D.keys 'alimente la ComboBox2 avec la liste des éléments du dictionaire D sans doublons
End Sub
Private Sub ComboBox2_Change() 'au changement dans la ComboBox1
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Me.ComboBox3.Clear 'vide la ComboBox3
If Me.ComboBox2.Value = "" Then Exit Sub 'si la ComboBox2 est effacée, sort de la procédure
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 3 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la troisième)
'condition si la donnée ligne I, colonne 1 du tableau des valeurs TV est égale à la valeur de la ComboBox1
'et la donnée ligne I colonne 2 du tableau des valeurs TV est égale à la valeur de la ComBobox2
If TV(I, 1) = Me.ComboBox1.Value And TV(I, 2) = Me.ComboBox2.Value Then
D(TV(I, 3)) = "" 'alimente le dictionnaire D avec les données en colonne 3 du tableau des valeurs TV
End If 'fin de la condition
Next I 'prochaine ligne de la boucle
Me.ComboBox3.List = D.keys 'alimente la ComboBox2 avec la liste des éléments du dictionaire D sans doublons
End Sub
Private Sub CommandButton1_Click() 'bouton "Rechercher"
Dim CTRL As Control 'déclare la variable CTRL (ConTRôLe)
For I = 3 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la troisième)
'condition si la donnée ligne I, colonne 1 du tableau des valeurs TV est égale à la valeur de la ComboBox1
'et la donnée ligne I colonne 2 du tableau des valeurs TV est égale à la valeur de la ComBobox2
'et la donnée ligne I colonne 3 du tableau des valeurs TV est égale à la valeur de la ComBobox3
If TV(I, 1) = Me.ComboBox1.Value And TV(I, 2) = Me.ComboBox2.Value And TV(I, 3) = Me.ComboBox3.Value Then
LI = I + 5 'définit la ligne LI (I + 5 : voir remarque dans l'initialisation de l'UserForm)
Exit For 'sort de la boucle
Next I 'prochaine ligne de la boucle
For Each CTRL In Me.Controls 'boucle sur tous les contrôle de l'userForm
'si la propriété [Tag] du contrôle n'est pas vide, récupère dans le contrôle la valeur de la cellule ligne = LI, colonne = propriété [tag] du contrôle convertie en Byte, de l'onglet O
If CTRL.Tag <> "" Then CTRL.Value = O.Cells(LI, CByte(CTRL.Tag)).Value
Next CTRL 'prochaine contrôle de la boucle
End Sub
Private Sub CommandButton2_Click() 'bouton "Modifier"
Dim CTRL As Control 'déclare la variable CTRL (ConTRôLe)
For Each CTRL In Me.Controls 'boucle sur tous les contrôle de l'userForm
'si la propriété [Tag] du contrôle n'est pas vide, renvoie la valeur du contrôle dans la cellule ligne = LI, colonne = propriété [tag] du contrôle convertie en Byte, de l'onglet O
If CTRL.Tag <> "" Then O.Cells(LI, CByte(CTRL.Tag)).Value = CTRL.Value
Next CTRL 'prochaine contrôle de la boucle
End Sub
Private Sub CommandButton4_Click() 'bouton "Nouvelle Recherche"
Unload Me 'vide et ferme l'UserForm en cours
RECHERCHE.Showáffiche l 'UserForm RECHERCHE
End Sub
Private Sub CommandButton3_Click() 'bouton "Annuler"
Unload Me 'vide et ferme l'UserForm en cours
End SubLe fichier :