VBA USERFORM

radhouane

XLDnaute Nouveau
userform recherche

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

userform nouveau

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 et merci
 

Pièces jointes

  • gestion appel d\'offre et consultation.xlsm
    34.8 KB · Affichages: 52

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Radhouane, bonjour le forum,

Désolé, question d'éthique, je ne vais pas ici citer un forum concurrent. C'est malheureux que tu sois même pas foutu de te souvenir où tu postes...
Voilà ce que je te disais dans l'autre 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 :

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 Sub

Le fichier :
 

Pièces jointes

  • Redhouane_v01.xlsm
    39.5 KB · Affichages: 76

Discussions similaires

Réponses
3
Affichages
298

Statistiques des forums

Discussions
312 211
Messages
2 086 295
Membres
103 171
dernier inscrit
clemm