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 :

Remplir ListView avec une autre ListView


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 238
    Par défaut Remplir ListView avec une autre ListView
    Bonjour a tous,

    Je suis entrain de coder un petit truc sur Excel
    Et dans mon exécution j’alimente une listview.

    Un peu plus tard j'ai besoin de modifier ma listview du coup j'ai pensé à me faire une listview tampon pour stocker ma première liste

    Mais le problème c'est que je voudrais alimenter ma premier listview en faisant un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    userform1.listview1 = userform1.listview2
    Mais cela ne fonctionne pas^^

    Merci de votre aide

  2. #2
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut Dans une variable tableau ?
    Bonjour,

    Et pourquoi ne pas stocker le contenu du ListView dans une variable tableau?

    En utilisant ce tutoriel, tu peux modifier le code comme ceci :
    Dans un Module standard, la première ligne étant en entête du module (variable public) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Liste() As Variant
     
    Sub Stockage_ListView()
    Dim i As Integer, j As Integer
       ReDim Preserve Liste(1 To ListView1.ListItems.Count, 1 To ListView1.ColumnHeaders.Count)
       'Boucle sur toutes les lignes
       For i = 1 To ListView1.ListItems.Count
          Liste(i, 1) = ListView1.ListItems(i).Text
          'Boucle sur les colonnes
          For j = 1 To ListView1.ColumnHeaders.Count - 1
             Liste(i, j + 1) = ListView1.ListItems(i).ListSubItems(j).Text
          Next j
       Next i
    End Sub

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 238
    Par défaut
    Bonjour pijaku,
    Merci de ta réponse.

    Effectivement j'y ai pensé, mais le problème c'est que je ne sais pas comment garder une variable entre deux exécutions de code
    si ça existe je veux connaitre comment on fait, ça m'éviterais pleins de code ^^

    car je crée ma listview sur l'appuie d'un bouton sur mon classeur
    a la fin de la création de la listview, j'affiche mon userform avec la listview

    mais entre ce moment la, et le moment ou l'utilisateur va cliquer sur des controls que j'ai mis,
    mes variables perdent leur porté, ducoup perde leur valeur, donc mon tableau est a refaire, il faut donc que je le stock dans un Control (même si c'est sur un userform que j'utilise pas)
    donc autant alimenter le Control au lieu de se faire chier a faire un tableau puis ensuite alimenter un Control avec le tableau.

    Enfin je ne sais pas ce que tu en penses, j'avoue que je ne sais pas quoi faire la !
    car la création de ma listview prend moins de 1sec (0.5 environ) ce qui est assez court
    je me tâte donc a recrée ma listview a chaque fois que j'en ai besoin.
    mais crée une variable tableau avec mes cellules Excel et ensuite alimenter ma listview avec ce tableau est encore plus rapide (surtout si je dois le faire plusieurs fois)
    après je me dit que c'est une appli perso donc qu'elles sot pas optimisé a fond je m'en moque un peu, mais ca fait toujours plaisir de pas attendre 15 ans l’exécution de la macro

    je suis perdu ^^

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Quel est l'intérêt de faire ça? J'imagine que tu y vois une utilité?

    Pour t'aider du mieux que nous pouvons dit nous la finalité.

  5. #5
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    bonjour
    Citation Envoyé par sharox Voir le message
    Effectivement j'y ai pensé, mais le problème c'est que je ne sais pas comment garder une variable entre deux exécutions de code
    si ça existe je veux connaitre comment on fait, ça m'éviterais pleins de code
    Static dans l'aide de VBA

    mais entre ce moment la, et le moment ou l'utilisateur va cliquer sur des controls que j'ai mis,
    mes variables perdent leur porté, ducoup perde leur valeur, donc mon tableau est a refaire, il faut donc que je le stock dans un Control (même si c'est sur un userform que j'utilise pas)
    donc autant alimenter le Control au lieu de se faire chier a faire un tableau puis ensuite alimenter un Control avec le tableau.
    Une banale feuille de calcul que tu protèges ou que tu caches, peut faire la job.

    Ou bien:

    Un banal fichier texte
    Le registre
    un fichier .ini

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 238
    Par défaut
    Bonjour a tous,

    Donc je vous explique
    En gros sur une feuil Excel j'ai une liste (plusieurs lignes et colonnes)
    cette liste n'est pas identique a chaque ouverture de fichier (elle récupéré dans mes dossier des fichiers)
    donc j'ai crée un bouton qui ouvre un userform
    avant l'ouverture de cette userform je recrée la liste que j'ai sur la feuille dans une listview qui est présente dans l'userform
    et et ensuite j'ai des boutons qui permettent de faire un tri (genre / date / durée)
    et la je bloque pour le tri de genre, je veux afficher dans la listview juste les lignes avec le bon genre

    et je voulais ne pas recréer la listview en regardant dans ma feuille a chaque fois

    voila pour l'histoire ^^

  7. #7
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut Toi, tu n'as pas lu le tutoriel que je t'ai donné...
    Bonjour,

    Pour le tri va voir ici :
    http://silkyroad.developpez.com/VBA/ListView/#LII-F

    Si c'est tout ce qu'il te faut...

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 238
    Par défaut
    Bonjour,
    Merci pour le lien mais je l'ai déjà lu 3 ou 4 fois en une semaine ^^
    Il est super utile mais je n'ai pas trouvé ce que je voulais faire

    Et je m'excuse je me suis mal exprimé :
    et la je bloque pour le tri de genre, je veux afficher dans la listview juste les lignes avec le bon genre
    Je voulais dire que quand je fais un tri par genre, j'ai ensuite plusieurs choix avec tous les genres présents dans ma feuille Excel
    Et selon le genre qu'il choisit, je voudrais afficher dans l'userform que les lignes qui ont le bon genre (donc un filtre)

    donc j'ai cherche une fonction genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     userform1.listview1.line(x).visible = false
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     userform1.listview1.line(x).hide
    mais du coup je pense utiliser la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListView1.ListItems.Remove x
    Voila
    PS : je met résolu sur ce sujet, mais je vais le chekcker encore le post au cas ou vous auriez d'autres idées !

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 238
    Par défaut
    Donc pour répondre au post pour les prochains !

    il n'est pas possible de copier une listview vers une autre avec un simple "copier / coller"
    On est obliger de recrée la listview lignes par lignes / colonnes par colonnes

    du coup je vais mettre ma solution, même si ce n'est pas ça que je voulais ^^'
    vu que ma création de listview est assez rapide ( j'ai environ 250 lignes et 8 colonnes)
    je la recrée quand le nombre de ligne de ma listview n'est pas égale au nombre de ligne de la feuille Excel
    et pour faire un filtre, sur chaque ligne qui est pas bonne, je fait .remove pour la supprimer

    Voici le code de création de la listview (ni plus ni moins que ce qu'il y a sur la page web présent dans ce post)

    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
    Sub intégration_list_view()
     
        Range("A1").Select
        Selection.End(xlDown).Select
        last_ligne = ActiveCell.Row
        Range("A1").Select
     
          '----- remplissage ListView------------------------
        With UserForm1.ListView1
            'Définit le nombre de colonnes et Entêtes
            .FullRowSelect = True
            With .ColumnHeaders
                .Clear 'Supprime les anciens entêtes
                .Add , , Range("A1").Value, 150 'Ajoute 3 colonnes en spécifiant le nom de l'entête, et la largeur des colonnes
                .Add , , Range("B1").Value, 75
                .Add , , Range("C1").Value, 75
            End With
        End With
     
        UserForm1.ListView1.ListItems.Clear
        For nb_lignes = 2 To last_ligne Step 1
            ligne_table = nb_lignes - 1
            UserForm1.ListView1.ListItems.Add , , Sheets("Feuil1").Range("A" & nb_lignes).Value
            UserForm1.ListView1.ListItems(ligne_table).ListSubItems.Add , , Range("B" & nb_lignes).Value
            UserForm1.ListView1.ListItems(ligne_table).ListSubItems.Add , , Range("C" & nb_lignes).Value
        Next
     
    End sub
    Voila voila
    Merci de votre aide en tout cas

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 238
    Par défaut
    Bonjour a tous,

    donc après quelques test :
    Apres appuie sur le bouton qui permet d'afficher l'userform avec la listview,le temps d'attente 0.5 sec
    Donc pour moi je trouve ca assez rapide, cela me convient !

    Par contre un peu plus tard, quand mon userform est déjà ouverte, la même macro dure 2 sec
    Donc 4x plus longtemps que la première et cela ce vois a l’écran, c'est beaucoup trop long

    j'utilise déjà les bouts de code qui permet d'optimiser la rapidité d’exécution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
        Application.EnableEvents = False
    mais je n'ai pas l'impression que cela est effet sur la listview de l'userform (ou sur l'userform tout court)
    Si vous avez une solution
    je suis preneur !

Discussions similaires

  1. [Débutant] Remplir ListView avec une requete SQL server
    Par theuma dans le forum Accès aux données
    Réponses: 2
    Dernier message: 02/05/2013, 10h32
  2. Remplir ListView avec une base de données
    Par Boris56 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/05/2012, 12h40
  3. ouvrir listview depuis une autre listview
    Par lallier dans le forum Composants graphiques
    Réponses: 8
    Dernier message: 06/05/2010, 19h03
  4. [XL-2003] Remplir une listView avec une autre ListView
    Par monichou86 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 21/12/2009, 10h56
  5. Remplir une ListView avec une BD
    Par manikou dans le forum MFC
    Réponses: 1
    Dernier message: 17/05/2005, 09h48

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