Userform VBA

Résolu
2000Kennedy Messages postés 44 Statut Membre -  
Polux31 Messages postés 7219 Statut Membre -
Bonjour,

Je souhaiterais lier des données qui se trouvent dans une colonne d'un fichier source avec une textbox qui se trouve dans un Cadre de mon formulaire. Le but étant de récupérer dans cette textbox les différentes catégories de produits qui se trouvent dans ma colonne du fichier source.

Dans cette colonne de mon tableau du fichier source, il apparait plusieurs fois les mêmes catégories de produits. Je souhaiterais que juste les différents type de catégorie apparaissent 1 unique fois dans ma textbox.

Et je souhaiterais que cela se réalise quand je clique sur le bouton "ouvrir".

Je ne sais pas du tout comment m'y prendre...si quelqu'un pourrait m'éclairée svp?

Voilà ce que j'ai commencer à faire:

Private Sub Ouvrir1_Click()

Dim Fichier As String
Fichier = Application.GetOpenFilename
Workbooks.Open Fichier
Sheets("GCE_Globale_cible").Activate
CheminSo.Caption = Fichier

End Sub

Merci :)

6 réponses

  1. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour,

    Voilà un exemple. Sur mon Userform, j'ai une ListBox (Listbox1) et un bouton (OuvrirList). Les données à afficher sont sur la colonne G de la feuille 1 de mon classeur courant. Le code est sur l'éditeur de mon Userform. Quand je clique sur le bouton, la liste s'affiche dans ListBox1.

    Tu dois pouvoir l'adapter facilement à ton cas.

    Option Explicit
    
    'Variables globales
    Private mTab()      'tableau de données à afficher
    Private ind As Long 'Indice de tableau
    
    
    Private Sub OuvrirList_Click()
    Dim ws As Worksheet 'Objet feuille
    Dim derlig As Long  'Dernière ligne renseignée
    Dim i As Long       'Indice de boucle
    
        ReDim mTab(ind)     'Initialisation du tableau
        '
        Set ws = Worksheets(1)  'Instance de la feuille
        '
        derlig = ws.Range("G65536").End(xlUp).Row   'Recherche de la dernière ligne de la colonne G
        '
        'Boucle pour parcourir la colonne, ici la colonne G
        For i = 2 To derlig
            'On vérifie si la valeur existe déjà dans le tableau
            If doesExist(ws.Range("G" & i).Value) = False Then
                'La valeur n'existe pas, on la met dans le tableau
                ReDim Preserve mTab(ind)
                mTab(ind) = ws.Range("G" & i).Value
                ind = ind + 1
            End If
        Next i
        '
        'Appel de la procédure d'affichage dans une listbox
        AfficheList
        
    End Sub
    '// Procédure d'affichage du contenu du tableau dans un Listbox
    Sub AfficheList()
    Dim i As Long
    
        For i = LBound(mTab()) To UBound(mTab())
            Me.ListBox1.AddItem mTab(i)
        Next i
        
    End Sub
    
    '//Fonction qui contrôle si la valeur existe dans le tableau
    '//Retour = Booléen
    '//Paramètre = str - la valeur à contrôler
    '
    Private Function doesExist(ByVal str As Variant) As Boolean
    Dim i As Long
        
        'On parcours le tableau
        For i = LBound(mTab()) To UBound(mTab())
            'Si la valeur existe dans le tableau on retourne True
            If mTab(i) = str Then
                doesExist = True
                'Et on sort de la fonction
                Exit Function
            End If
        Next i
        'Si la valeur n'est pas trouvée, on retourne False
        doesExist = False
        
    End Function


    Bon courage

    ;o)
    1
  2. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Re,

    Dans la userform avec les listboxes :

    Private Sub CommandButton1_Click()
    Dim Fichier As String
    Dim wk As Workbook
    Dim ws As Worksheet
    
    Fichier = Application.GetOpenFilename
    
    Set wk = Workbooks.Open(Fichier)
    Set ws = wk.Worksheets(1)    'A adapter
    
    Call Module1.OuvrirList("A", ws, 1)    'A adapter
    Call Module1.OuvrirList("B", ws, 2)    'A adapter
    Call Module1.OuvrirList("C", ws, 3)    'A adapter
    Call Module1.OuvrirList("D", ws, 4)    'A adapter
    
    End Sub


    Dans un module nommé Module1:

    Option Explicit
    
    
    'Variables globales
    Private mTab()      'tableau de données à afficher
    Private ind As Long 'Indice de tableau
    
    Public Sub OuvrirList(ByVal col As String, ByRef mSheet As Worksheet, ByVal mList As Integer)
    Dim ws As Worksheet 'Objet feuille
    Dim derlig As Long  'Dernière ligne renseignée
    Dim i As Long       'Indice de boucle
    
        ind = 0
        ReDim mTab(ind)     'Initialisation du tableau
        '
        derlig = mSheet.Range(col & 65536).End(xlUp).Row   'Recherche de la dernière ligne de la colonne
        '
        'Boucle pour parcourir la colonne
        For i = 2 To derlig
            'On vérifie si la valeur existe déjà dans le tableau
            If doesExist(mSheet.Range(col & i).Value) = False Then
                'La valeur n'existe pas, on la met dans le tableau
                ReDim Preserve mTab(ind)
                mTab(ind) = mSheet.Range(col & i).Value
                ind = ind + 1
            End If
        Next i
        '
        'Appel de la procédure d'affichage dans une listbox
        AfficheList (mList)
        
    End Sub
    '// Procédure d'affichage du contenu du tableau dans un Listbox
    Private Sub AfficheList(ByVal mList As Integer)
    Dim i As Long
    
    With UserForm1
        Select Case mList
            Case 1
                For i = LBound(mTab()) To UBound(mTab())
                    .ListBox1.AddItem mTab(i)
                Next i
            Case 2
                For i = LBound(mTab()) To UBound(mTab())
                    .ListBox2.AddItem mTab(i)
                Next i
            Case 3
                For i = LBound(mTab()) To UBound(mTab())
                    .ListBox3.AddItem mTab(i)
                Next i
            Case 4
                For i = LBound(mTab()) To UBound(mTab())
                    .ListBox4.AddItem mTab(i)
                Next i
        End Select
    End With
        
    End Sub
    
    '//Fonction qui contrôle si la valeur existe dans le tableau
    '//Retour = Booléen
    '//Paramètre = str - la valeur à contrôler
    '
    Private Function doesExist(ByVal str As Variant) As Boolean
    Dim i As Long
        
        'On parcours le tableau
        For i = LBound(mTab()) To UBound(mTab())
            'Si la valeur existe dans le tableau on retourne True
            If mTab(i) = str Then
                doesExist = True
                'Et on sort de la fonction
                Exit Function
            End If
        Next i
        'Si la valeur n'est pas trouvée, on retourne False
        doesExist = False
        
    End Function


    J'espère que ça ira pour toi.

    ;o)
    1
  3. 2000Kennedy Messages postés 44 Statut Membre 2
     
    petit up sur ce post :)
    0
  4. 2000Kennedy Messages postés 44 Statut Membre 2
     
    Merci j'essaye tout de suite. :) :)
    0
    1. 2000Kennedy Messages postés 44 Statut Membre 2
       
      (Je suis débutante en VBA)
      mTab correspond à quoi svp? j'ai un retour sur mtab: "Sub ou Function non définie"

      J'ai tester sur un fichier excel test. et ça marche très bien. j'ai juste un bouton et une listbox dans ma userform test.

      Dans le formulaire dans lequel je souhaiterais intégrer votre code, j'ai plein de boutons et de listbox. j'ai l'impression qu'il y a conflit je ne sais pas pk. :x
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. 2000Kennedy Messages postés 44 Statut Membre 2
     
    Code adapté merci beaucoup :)
    0
    1. Polux31 Messages postés 7219 Statut Membre 1 204
       
      Content pour toi.

      Si tu as réussi à l'adapter, c'est que n'est plus tout à fait une débutante ^^ ...

      Bravo et bon courage.

      N'oublie pas de passer le sujet en résolu, merci

      ;o)
      0
    2. 2000Kennedy Messages postés 44 Statut Membre 2
       
      ah oui. Par contre une question, je pensais que c'était bon mais en fait non. lol

      En fait j'ai plein de colonnes dans un fichier source autre que le fichier excel sur lequel je travaille. Je voudrais que les données des colonnes du tableau de l'onglet "GCE_Globale" (il y a plusieurs colonnes) s'intègrent respectivement dans des listboxs de mon formulaire. Et c'est la que ça bloque. en gros pour le moment:

      Fichier = Application.GetOpenFilename
      Workbooks.Open Fichier
      CheminSo.Caption = Fichier

      puis je dois copier l'onglet dont j'ai besoin dans la feuille 1 du fichier de mon formulaire. Mais j'aimerais que cela se fasse sans avoir à copier de cette manière. comment est ce que je peux m'y prendre.?

      merci :)
      0
    3. Polux31 Messages postés 7219 Statut Membre 1 204
       
      oula ... mon neurone a du mal à tout digérer ...

      Je te dis ce que je comprends :

      Tu as un fichier Excel avec un Userform. Tu as plusieurs listbox sur ce userform. Tu veux ouvrir un fichier et mettre dans les listbox les données contenues dans les colonnes du fichier que tu as ouvert. Est-ce bien cela ?

      J'attends le retour pour me pencher là dessus.
      0
    4. 2000Kennedy Messages postés 44 Statut Membre 2
       
      Dsl, j'étais partie manger. je ne peux pas joindre de doc ou quoi que ce soit, je suis sur un proxy qui me bloque.

      J'ai en effet des colonnes A B C D dans la source par exemple

      et je voudrais dans ma listbox1 avoir les données non doublonnées de la colonne A, dans ma listbox2 avoir les données non doublonnées de la colonne B etc.


      L'objectif de mon formulaire est d'avoir en regard 2 listbox, 1 des listbox qui récupère les données du fichier source, et une autre listbox correspondant à un autre fichier tiré d'une BDD Access. Le but étant par la suite à l'aide d'un bouton de lié le tableau source avec la BDD et générer un tableau uniquement rempli par des codes. Ce bouton serait la pour valider les 2 libellés.

      Tout un programme pour une débutante quoi. lol
      0
    5. Polux31 Messages postés 7219 Statut Membre 1 204
       
      Ok mon neurone digère mieux.

      Je te passe ça dans l'aprem. Je te donne un exemple et tu adaptes à ton zinzin. Ça te va ?
      0
  7. 2000Kennedy Messages postés 44 Statut Membre 2
     
    Merci Beaucoup :D Cha marche :) Bonne journée! :) C'est la deuxième fois que tu m'aides sur ce fofo ! ;)
    0
    1. Polux31 Messages postés 7219 Statut Membre 1 204
       
      De rien, j'essaie de faire de mon mieux ^^

      Bonne continuation et bon courage.

      ;o)
      0