IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Stocker dans une liste les données d'une colonne d'une feuille Excel en VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 8
    Par défaut Stocker dans une liste les données d'une colonne d'une feuille Excel en VBA
    Bonjour,

    Voilà j'ai toujours le même problème, à savoir : stocker dans une liste des éléments qui se trouvent dans une feuille Excel. En fait il s'agit de prendre les données d'une colonne entière. Seulement, je ne sais pas où se trouvera la dernière donnée vu que la feuille peut varier et la colonne aussi. Ma fonction GetList doit être réutilisable. J'essaie donc de récupérer les élments dans une variable tableau mais ça ne fonctionne pas.. J'ai des erreurs d'exécution.

    Désolé si mon code n'a plus trop de sens, j'ai essayé tellement de choses..

    Pourriez-vous m'aider s'il vous plaît ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    Public Function GetList(table As Object, colonne As Integer)
    'Cette fonction permet de stocker dans une liste les données d'une colonne
    'excel dans une table donnée (feuille excel)
     
        Dim i As Integer, j As Integer, k As Integer, d As String
        'i = premiere ligne, j = dernière ligne, k = position ds le tableau
        Dim liste()
        'tableau qui contient l'ensemble des valeurs d'une colonne
     
        With table
     
        k = 64 + colonne
        d = Chr(k)
            j = Range(d & 1).End(xlDown).Row
     
            'compter le nombre de cellule dans la colonne
     
     
            For i = 2 To j
                ' ajout de la valeur de la cellule i dans l'élément k du tableau
                liste(i) = table.Range(d & i).Value
                'erreur d'exécution 13 : incompatibilité de type
                'erreur d'exécution 9 l'indice n'appartient pas à la sélection
     
     
               i = i + 1
     
     
            Next i
     
        End With
     
    End Function

    Généralement je n'arrive pas non plus à récupérer la valeur choisie par l'utilisateur dans la liste de choix... (la combobox serait dans un userform). Avez-vous des conseils? merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 436
    Par défaut
    Bonjour,

    Pas certain que c'est ce que vous essayez de faire, mais voici toujours une solution pour stocker dans une liste ce qui se trouve dans une colonne d'une feuille. A vous de l'adapter.
    Il est supposé qu'il n'y a aucune cellule vide dans la colonne indiquée (xlDown s'arrête à la première cellule vide rencontrée).
    La variable tableau Liste est déclarée au niveau du module pour pouvoir être utilisée dans une autre sub.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Option Explicit
     
    Dim Liste() As String
     
    Private Sub GetList(wSh As Worksheet, kC As Integer)
        'stocke dans Liste les données de la colonne kC de la feuille wSh
        Dim kR As Long
        kR = wSh.Cells(1, kC).End(xlDown).Row
        Debug.Print kR
        ReDim Liste(kR - 1)   '--- adapte la dimension de la liste au nombre de lignes
        With wSh
            For kR = 2 To .Cells(1, kC).End(xlDown).Row
                Liste(kR - 1) = .Cells(kR, kC).Value
                Debug.Print kR - 1, Liste(kR - 1)
            Next kR
        End With
    End Sub
     
    Sub Test()
        GetList Sheets("Feuil1"), 2
    End Sub
    Bonne continuation.
    Fichiers attachés Fichiers attachés

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par marie_111 Voir le message
    J'ai des erreurs d'exécution.
    Quel est le message d'erreur ?
    Quelle ligne de code est désignée par le débugage ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function GetList(table As Object, colonne As Integer)
    Que représente "table" ?
    Quel type d'objet ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        k = 64 + colonne
        d = Chr(k)
            j = Range(d & 1).End(xlDown).Row
    Il serait plus simple et plus propre d'écrire : j = Cells(Rows.Count, colonne).End(xlUp).Row.

    Cela dit, es-tu sûr que c'est la feuille active que tu souhaites tester.
    Si tu n'en es pas sûr, il vaudrait mieux spécifier la référence de la feuille en parent du Range ou du Cells.
    Si tu comptes sur ton With table pour remplir ce rôle, tu fais deux erreurs.
    D'abord, ton "table" aurait du être déclaré comme Worksheet et non pas comme Objet dans les paramètres de la fonction.
    Ensuite, pour qu'un élément se réfère à un With, il faut mettre un "." devant.
    https://docs.microsoft.com/fr-fr/off...with-statement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            For i = 2 To j
                liste(i) = table.Range(d & i).Value
    Il vaudrait mieux définir la taille de ta variable vecteur avant de la remplir.
    On ne met pas d'incrémentation sur la variable d'itération d'une boucle For To.
    C'est la boucle elle-même qui se charge de cette itération.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Function GetList(table As Object, colonne As Integer)
    'Cette fonction permet de stocker dans une liste les données d'une colonne excel dans une table donnée (feuille excel)
     
    End Function
    A aucun moment tu n'indiques quelle valeur doit transmettre cette fonction (ce qui est la raison première d'une fonction).
    Tu n'indiques même pas quel est le type de la fonction elle-même.

    Si ton but est de mettre des données dans une variable, alors ça ne sert à rien car la variable va disparaitre dès que la fonction sera achevée.

  4. #4
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 8
    Par défaut
    Bonjour,

    Je vous remercie pour votre aide.


    Citation Envoyé par Menhir Voir le message
    Quel est le message d'erreur ?
    Que représente "table" ?
    Quel type d'objet ?
    Les messages d'erreur étaient : "erreur d'exécution 13 : incompatibilité de type" ou bien "erreur d'exécution 9 l'indice n'appartient pas à la sélection"
    Table représente feuille de données Excel ... J'imagine que c'est un Worksheet du coup.



    Citation Envoyé par Menhir Voir le message
    A aucun moment tu n'indiques quelle valeur doit transmettre cette fonction (ce qui est la raison première d'une fonction)

    Si ton but est de mettre des données dans une variable, alors ça ne sert à rien car la variable va disparaitre dès que la fonction sera achevée.
    C'est vrai.. C'est un oubli de ma part. Du coup j'ai ajouté une variable Liste qui va ensuite être transférée dans GetList


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
     
    Public Function GetList(table As Worksheet, colonne As Integer)
    'Cette fonction permet de stocker dans une liste Liste() les données d'une colonne
    'excel dans une table donnée (feuille excel)
     
        Dim i As Integer, j As Integer, k As Integer, d As String
        'i = premiere ligne, j = dernière ligne, k = position ds le tableau
        Dim liste () 
        'tableau qui contient l'ensemble des valeurs d'une colonne
     
        With table
     
        k = 64 + colonne
        d = Chr(k)
            j = Cells(Rows.Count, colonne).End(xlUp).Row
     
     
            'compter le nombre de cellule dans la colonne
     
     
            For i = 2 To j
     
            'def taille de var liste
            ReDim Liste(j - 1)
                ' ajout de la valeur de la cellule i dans l'élément k du tableau
                Liste(i) = table.Range(d & i).Value
     
            Next i
     
        End With
    GetList = Liste
    End Function

    Du coup ça m'a eu l'air de fonctionner, mais ça s'est compliqué quand j'ai voulu mettre le contenu de la variable dans une liste de choix :
    (je ne sais pas quelle syntaxe utiliser; à la ligne 22 ça bloque avec une erreur de type "l'indice n'appartient pas à la sélection" .. j'ai essayé plusieurs méthodes, comme Additem, en vain..)
    Mais Du coup en déclarant table en worksheet j'ai pas d'autre choix que de mettre worksheet devant le nom de feuille quand je l'appelle? (ligne 8) Parce que du coup si la variable table est récupérée depuis une autre fonction ça va me poser des soucis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
     
     Sub UserForm_Initialize()
        'Remplit la liste de choix
        Dim liste() As Variant
        OuvrirClasseur
        lister = GetList(Worksheets("GEST_CARAC_TABLES"), 3)  ' TEST récupération d'une colonne Excel  
     
     
     
        Me.ComboBox1.Clear                 'On vide la liste présente dans l'objet
     
        'Déclaration des variables
     
        Dim fin As Integer                'fin de la liste
        Dim i As Integer                    'compteur d'éléments
     
            fin = UBound(liste)
     
           For i = 1 To fin
                Me.ComboBox1(i) = liste(i).Value  'remplissage de la liste dans le userform
           Next i
     
     
    End Sub

    Pouvez-vous m'éclairer s'il vous plaît ? Merciii

Discussions similaires

  1. [XL-2010] Parcourir des boutons radio (option bouton) regroupé dans une feuille excel en vba
    Par rob1son76 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 26/02/2017, 13h26
  2. [XL-2010] Importer des données de plusieurs fichiers dans une feuille excel en VBA
    Par Alibel dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/10/2013, 15h16
  3. Ajout d'un bouton dans une feuille excel avec vba
    Par nsqualli dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/11/2008, 15h35
  4. Réponses: 2
    Dernier message: 10/09/2007, 16h40
  5. Réponses: 9
    Dernier message: 19/02/2007, 20h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo