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 :

Redimensionner automatiquement les colonnes d'une Listview [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Logisticien
    Inscrit en
    Avril 2016
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Avril 2016
    Messages : 70
    Points : 85
    Points
    85
    Par défaut Redimensionner automatiquement les colonnes d'une Listview
    Bonjour le forum !

    J'aimerai savoir s'il est possible de fait autofit dans une Listview Excel !
    Un peu comme dans une feuille Excel où on ferait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Column("X:Y").EntireColumn.AutoFit
    Je voudrai avoir un bout de code similaire mais pour un Control Listview
    que je pourrai placer dans CommanButton nommé Ajuster et qui au
    Click adapterait la largeur des colonne de ma Listview par rapport à
    son contenu sans être obligé de faire un double Click entre chaque
    colonne du Control.

    Bien à vous.

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    J'aimerai savoir s'il est possible de fait autofit dans une Listview Excel
    Une listview n'est pas un composant natif de VBA/Excel
    La largeur à déterminer d'une colonne pour correspondre à son contenu nécessite :
    - la détermination de celui des articles de la dite colonne contenant la chaîne graphique de texte la plus longue
    - la calcul de cette largeur graphique
    S'amuser à passer préalablement en revue tous les articles de toutes les colonnes pour déterminer les largeurs idéales correspondantes des colonnes serait plutôt pénélisant.
    Reste qu'une information d'importance n'est pas donnée : quelle est la source exacte des données qui alimentent cette listview ?
    selon le cas, on peut en effet "profiter" de propriétés autres que les siennes propres.
    Si tu es dans un tel cas, tu es chanceux
    Si non --->> il va falloir mettre en place autre chose.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour
    le columnwidth pour la listview se gere dans le columnheader

    si ta listeview est modifiée dynamiquement (ajout/suppression)
    veille a bien mettre des "key"(2d argument dans"add")dans le header et la liste
    et que ces clés(key) correspondent
    et tu modifie dynamiquement dans le header la colonne répondant a la clé de la colonne de ta liste


    si la source est une plage tu peux le faire des le départ comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     With .ColumnHeaders
                .Clear
                'ajout des entete et dimention des colonnes For i = 1 To 5
                For c = 1 To 5
                    .Add c, c, Cells(1, c), Round(Sheets(1).Cells(1, c).Width)
                Next
            End With
    après si tes colonne de la plages sources sont moins large que le texte qu'elle contiennent tu peux modifier le columnwidth a chaque ajout des listitem ET !! subitem
    un peu comme ceci ,pour la calcul je me suis pas casser la tête il est basé sur le len(...)*5
    donc les colonnes feront comme largeur 5 multiplié par le nombre de caractères de la valeur
    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
    35
    36
    37
    Private Sub CommandButton1_Click()
    '----- remplissage ListView------------------------
        With ListView1
            With .ColumnHeaders
                .Clear
                'ajout des entete et dimention des colonnes For i = 1 To 5
                For c = 1 To 5
                    .Add c, "col" & c, Cells(1, c), Round(Sheets(1).Cells(1, c).Width)
                Next
            End With
            'Remplissage de la 1ere colonne (création de 3 lignes)
            With .ListItems
                For i = 2 To 11
                    .Add i - 1, , Sheets(1).Cells(i, 1)
                    If Len(Cells(i, c)) * 4 > ListView1.ColumnHeaders(1).Width Then ListView1.ColumnHeaders(1).Width = Len(Cells(i, c)) * 4
                    For c = 2 To 5
                        ListView1.ListItems(i - 1).ListSubItems.Add c - 1, , Cells(i, c)
                        If Cells(i, c) = "activated" Then ListView1.ListItems(i - 1).ListSubItems(c - 1).ForeColor = RGB(255, 0, 0)
                        If Cells(i, c) = "cadre" Then ListView1.ListItems(i - 1).ListSubItems(c - 1).ForeColor = RGB(100, 150, 0)
                    If Len(Cells(i, c)) * 5 > ListView1.ColumnHeaders(c).Width Then ListView1.ColumnHeaders(c).Width = Len(Cells(i, c)) * 5
                    Next
                Next
            End With
            '------------------------------------------------
            'fonctionne en vb6 mais pas en vba
            'For Each lvi In ListView1.ListItems
            'If Index Mod 2 = 0 Then
            'lvi.BackColor = vbYellow
            'Else
            'lvi.BackColor = vbCyan
            'End If
            'Next
            '--------------------------------------------------
        End With
        'Spécifie l'affichage en mode "Détails"
        ListView1.View = lvwReport
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Membre régulier
    Homme Profil pro
    Logisticien
    Inscrit en
    Avril 2016
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Avril 2016
    Messages : 70
    Points : 85
    Points
    85
    Par défaut
    Rebonjour à vous !

    Merci pour vos propositions.

    Il est claire que j'avais omis un détail important consernant la source de données
    comme l'a dit Unparia. J'utilise une base de données (Access.mdb 2010) Toutefois, Une
    partie de mes données sont stockées dans Excel d'où l'utilité louable de la propostion
    de Patrick qui fonctionne comme je souhaite. C'est nickel, je l'ai juste modifier
    un peu pour rendre les colonnes Dynamiques

    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
     
    Option Explicit
    Dim C As Integer, I As Integer
    Private Sub CommandButton1_Click()
    '----- remplissage ListView------------------------
        With ListView1
            With .ColumnHeaders
                .Clear
                'ajout des entêtes et dimention des colonnes For i = 1 To 5
                For C = 1 To ShData.Columns.End(xlToRight).Column 'Identifier dynamiquement le nombre de colonne dans la feuille
                    .Add C, "col" & C, Cells(1, C), Round(ShData.Cells(1, C).Width)
                Next
            End With
            'Remplissage de la 1ere colonne (création de 3 lignes)
            With .ListItems
                For I = 2 To ShData.Columns.End(xlToRight).Column
                    .Add I - 1, , ShData.Cells(I, 1)
                    If Len(Cells(I, C)) * 4 > ListView1.ColumnHeaders(1).Width Then ListView1.ColumnHeaders(1).Width = Len(Cells(I, C)) * 4
                    For C = 2 To ShData.Columns.End(xlToRight).Column' Identifier dynamiquement le nombre de colonne dans la feuille
                        ListView1.ListItems(I - 1).ListSubItems.Add C - 1, , Cells(I, C)
                        If Len(Cells(I, C)) * 5 > ListView1.ColumnHeaders(C).Width Then ListView1.ColumnHeaders(C).Width = Len(Cells(I, C)) * 5
                    Next
                Next
            End With
        End With
        ListView1.View = lvwReport
        ListView1.FullRowSelect = True
        'Remarque: le redimentionnement est fonction des ListSubItems et non des ColumnHeaders
        'autrement dit, si le contenu de l'entête de colonne > contenu de la cellule, la largeur ne va
        'pas s'adapter correctement si non tout marche !
    End Sub
    En attendant trouver comment adapter ce code pour une source de données Access, Un grand merci
    déjà pour ce bout de code.

    Cordialement.

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour pour la source Access c'est simple tu le fait âpres !!
    ou donne moi ton code remplissage par la base Access je vais voir ce que je peux faire
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Membre régulier
    Homme Profil pro
    Logisticien
    Inscrit en
    Avril 2016
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Avril 2016
    Messages : 70
    Points : 85
    Points
    85
    Par défaut
    Bonjour.

    Pour la source Access, j'ai intégré les critère pour afficher uniquement
    les données du mois courant dans la ListView

    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
    35
    36
    37
     
    Sub AlimentationLviewAvecDonneeAccess()
    On Error GoTo HnErr
    Dim oMonth As String, oYears As String,SQLQuery As String
    Dim List As Object
    'Affectation des variables aux controles
    oMonth = FrmAddNew.Controle3
    oYears = FrmAddNew.Controle4
    'Définition des conditions pour afficher uniquement les données du mois de l'année en cours
    SQLQuery = "SELECT * FROM MOUVEMENTS  WHERE CMOIS LIKE '*" _
    & oMonth & "*' AND ANNEES LIKE '*" & oYears & "*'" 
    Call OpenAccmdbConnexion
       Set Rs = DataSources.OpenRecordset(SQLQuery) 'Initialisation et mémorisation des critères
        On Error Resume Next
        FrmAddNew.LvSkTemp.ListItems.Clear
        While Not Rs.EOF 'Importation des données Access dans et affichage dans la listview
            Set List = FrmAddNew.LvSkTemp.ListItems.Add(Text:=Rs(0))  'N°
                List.SubItems(1) = Rs(1) 'Dates
                List.SubItems(2) = Rs(2) 'Mois
                List.SubItems(3) = Rs(3) 'Années
                List.SubItems(4) = Rs(4) 'Projet
                List.SubItems(5) = Rs(5) 'etc....
                List.SubItems(6) = Rs(6)
                List.SubItems(7) = Rs(7)
                List.SubItems(8) = Rs(8)
                List.SubItems(9) = Rs(9)
                List.SubItems(10) = Rs(10)
                List.SubItems(11) = Rs(11)
                List.SubItems(12) = Rs(12)
                List.SubItems(13) = Rs(13)
                Rs.MoveNext
             Wend
         Set List = Nothing
    Call DisConnectDb
    Exit Sub
    HnErr:
        MsgBox err.Number & " " & err.Description,16+0,"Erreur d'exécution"
    Pour le code précédent que tu m'as proposé, j'ai apporté quelques modifications
    pour le rendre opérationnel dans tous les ListView de mon projet en créant une fonction
    que j'ai placé dans un module Standard. ça m'a vraiment aidé et je remet le code
    s'il peut être utile aux autres

    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
     
    Public Function DynCtrlAndData(oSh As Worksheet, oForm As UserForm, oLview As ListView)
     
    'Code à palcer dans un module Standard
    '----- remplissage ListView dynamiquement Opérationnelle pour les toutes les ListView du projet------------------------
     
        With oLview
            With .ColumnHeaders
                .Clear
                'ajout des entêtes et dimention des colonnes For f = 1 To n colonnes
                For f = 1 To oSh.Columns.End(xlToRight).Column
                'Identifier dynamiquement le nombre de colonne dans la feuille
                    .Add f, "col" & f, Cells(1, f), Round(oSh.Cells(1, f).Width)
                Next
            End With
            'Remplissage de la 1ere colonne (création de 3 lignes)
            With .ListItems
                For I = 2 To oSh.Columns.End(xlToRight).Column
                    .Add I - 1, , oSh.Cells(I, 1)
                    If Len(Cells(I, f)) * 4 > oLview.ColumnHeaders(1).Width Then oLview.ColumnHeaders(1).Width = Len(Cells(I, f)) * 4
                    For f = 2 To oSh.Columns.End(xlToRight).Column
                        oLview.ListItems(I - 1).ListSubItems.Add f - 1, , Cells(I, f)
                        If Len(Cells(I, f)) * 5 > oLview.ColumnHeaders(f).Width Then oLview.ColumnHeaders(f).Width = Len(Cells(I, f)) * 5
                    Next f
                Next I
            End With
        End With
     
    'Le code d'appel se fait dans la procédure Activate ou dans un Bouton de  L'UserForm : call DynCtrlAndData(CodeNamedelaFeuil,NomDeUserForm,NomListView)******
    End Function
    Merci Patrick

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    While Not Rs.EOF 'Importation des données Access dans et affichage dans la listview
            Set List = FrmAddNew.LvSkTemp.ListItems.Add(Text:=Rs(0))  'N°
                List.SubItems(1) =1) 'Dates
                List.SubItems(2) = Rs(2) 'Mois
                List.SubItems(3) = Rs(3) 'Années
                List.SubItems(4) = Rs(4) 'Projet
                List.SubItems(5) = Rs(5) 'etc....
                List.SubItems(6) = Rs(6)
    ...........
    pourquoi ne fait tu pas cela dans une boucle
    et dans chaque tour de boucle tu test le len( Rs((X))*5 pour un éventuel redimensionnement de la colonne comme je le fait pour pour une source range
    je connais pas access mais il dois bien y avoir une fonction rs.count ou quelque chose comme ca non???????
    si Rs.EOF te donne le count
    se serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set List = FrmAddNew.LvSkTemp.ListItems.Add(Text:=Rs(0))  'N°
                List.SubItems(1) =1) 'Dates ?????????????
           for i=2 to Rs.EOF 
          List.SubItems(i) = Rs(i)
          'ici le mémé test que celui que je t'ai donné pour la source range 
          next
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trier les colonnes d'une ListView
    Par Thomas Lebrun dans le forum Contribuez
    Réponses: 0
    Dernier message: 28/12/2010, 23h53
  2. Trier les colonnes d'une ListView
    Par Thomas Lebrun dans le forum Contribuez
    Réponses: 0
    Dernier message: 28/12/2010, 19h26
  3. Remplir les colonnes d'une listview
    Par Mathew77 dans le forum Windows Forms
    Réponses: 22
    Dernier message: 18/06/2009, 12h33
  4. Redimensionner les colonnes d'une listview
    Par Gaetch dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 20/07/2007, 10h36
  5. [VBA] Trier les colonnes d'une listview
    Par alncool dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 01/09/2005, 14h12

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