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 :

Problème sélection par defaut dans un listview


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2021
    Messages
    334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 334
    Points : 602
    Points
    602
    Par défaut Problème sélection par defaut dans un listview
    Bonjour,

    Je viens de faire appel a l'objet listview qui est sympa et offre plus de possibilités que la simple listbox (interface avec l'utilisateur notamment).

    Mais le problème c'est que quand on la rempli (ici a l'initialisation + changement d'un combobox), est toujours sélectionné par défaut la première ligne(ou premier item) et le pire c'est que c'est même pas visible, la ligne est pas sélectionnée visuellement.

    Voici le code de l'USF :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    Option Explicit
     
    Private Sub ComboBox1_Change()
    listviewrefresh Me.ListView1, Feuil5, ComboBox1.Value
    Set ListView1.SelectedItem = Nothing
    End Sub
     
    Private Sub UserForm_Initialize()
    ComboAdd ComboBox1, Feuil11
    ThisWorkbook.Connections("Requête*-*OF_en_cours").Refresh
    If listviewrefresh(Me.ListView1, Feuil5, ComboBox1.Value) = False Then
        Label1.Visible = True
    Else
        Label1.Visible = False
    End If
    Set ListView1.SelectedItem = Nothing
    End Sub
    Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
        ListView1.Sorted = False
        ListView1.SortKey = ColumnHeader.Index - 1
     
        If ListView1.SortOrder = lvwAscending Then
            ListView1.SortOrder = lvwDescending
            Else
            ListView1.SortOrder = lvwAscending
        End If
     
        ListView1.Sorted = True
    End Sub
     
    Private Sub CommandButton1_Click()
    Dim i As Integer
    Dim k As Integer
    Dim item As ListItems
     
    For i = 1 To ListView1.ListItems.count
       If ListView1.ListItems(i).Selected Then
            ModifOF "N°OF_BDD", ListView1.ListItems(i).Text, "Ordonancement", "Cloture", True
            k = k + 1
       End If
    Next i
     
    Select Case k
        Case 0
            MsgBox "Vous n'avez sélectionné aucun OF", vbInformation, "Selection"
        Case 1
            MsgBox k & " OF a été clôturé, vous pouvez le consulter dans la section <OF cloturés>", vbInformation, "Enregistré"
        Case Else
            MsgBox k & " OF ont été clôturés, vous pouvez les consulter dans la section <OF cloturés>", vbInformation, "Enregistré"
    End Select
     
    DoEvents
    ThisWorkbook.Connections("Requête*-*OF_en_cours").Refresh
    If listviewrefresh(Me.ListView1, Feuil5, ComboBox1.Value) = False Then
        Label1.Visible = True
    Else
        Label1.Visible = False
    End If
    End Sub
     
    Private Sub Listbox1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
    ListBox1.Sorted = False
    ListBox1.SortKey = ColumnHeader.Index - 1
    ListBox1.SortOrder = IIf(ListView1.SortOrder = 0, 1, 0)
    ListBox1.Sorted = True
    End Sub
     
    Private Sub CommandButton3_Click()
    Dim wop As String
    Dim k As Integer
    Dim i As Integer
     
    k = 0
     
    For i = 1 To Me.ListView1.ListItems.count
       If Me.ListView1.ListItems(i).Selected Then
       k = k + 1
       End If
    Next i
     
    If k > 1 Then
    If MsgBox("Vous allez annoter tous les WOP sélectionnés avec la même annotation, voulez vous continuer ?", vbYesNo, "Multiselect") = vbNo Then GoTo fin
    End If
     
    Annotation.Show
     
    For i = 1 To Me.ListView1.ListItems.count
       If Me.ListView1.ListItems(i).Selected Then ModifOF "N°OF_BDD", Me.ListView1.ListItems(i), "Ordonancement", "Notes", Annot
    Next i
     
    If k > 1 Then
        MsgBox "Les OF ont bien été annotés avec la mention <" & Annot & ">"
    Else
        MsgBox "L'OF a bien été annoté avec la mention <" & Annot & ">"
    End If
     
    DoEvents
    ThisWorkbook.Connections("Requête*-*OF_en_cours").Refresh
    listviewrefresh Me.ListView1, Feuil5, ComboBox1.Value
    GoTo fin
    fin:
    End Sub
    Et voici ma fonction listviewrefresh qui me permet d'alimenter le listview selon un tableau structuré + une condition sur un des champs du tableau renseigné via un combobox :

    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
    38
    39
    40
    41
    42
    Function listviewrefresh(mylistView As listView, sht As Worksheet, TriMach As String) As Boolean
    Dim myCol As ListColumn
    Dim myTab As ListObject
    Dim nbcol As Integer
    Dim i As Integer
    Dim j As Integer
    nbcol = sht.ListObjects(1).ListColumns.count
    mylistView.ListItems.Clear
    mylistView.ColumnHeaders.Clear
    Set myTab = sht.ListObjects(1)
    listviewrefresh = True
    If sht.ListObjects(1).ListRows.count = 0 Then
        listviewrefresh = False
    Exit Function
    End If
    For i = 1 To myTab.ListColumns.count
        Set myCol = myTab.ListColumns(i)
        mylistView.ColumnHeaders.Add , , myCol.Name, myCol.DataBodyRange.Width
    Next i
     
    If UCase(TriMach) = UCase("tout") Then
        For i = 1 To myTab.ListRows.count
            mylistView.ListItems.Add , , myTab.DataBodyRange(i, 1)
            For j = 2 To nbcol
                mylistView.ListItems(i).ListSubItems.Add , , myTab.DataBodyRange(i, j)
            Next j
        Next i
    Else
        For i = 1 To myTab.ListRows.count
            If myTab.DataBodyRange(i, 3) = TriMach Then
                mylistView.ListItems.Add , , myTab.DataBodyRange(i, 1)
                For j = 2 To nbcol
                    mylistView.ListItems(i).ListSubItems.Add , , myTab.DataBodyRange(i, j)
                Next j
            End If
        Next i
    End If
    mylistView.View = lvwReport
    mylistView.FullRowSelect = True
    mylistView.LabelEdit = lvwManual
    mylistView.Gridlines = True
    End Function
    J'ai essayé de vider l'objet "SelectedItem" du listview âpres chaque remplissage, sans succès.

    Sinon a part ça j'ai pas de soucis, ça fonctionne relativement bien

    PS: la fonction "ModifOF" est une fonction générique de modification de champs de BDD Access

    Si quelqu'un a des idées je suis preneur (également des idées d'amélioration qui n'aurait rien à voir avec avec la problématique)

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

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 181
    Points : 5 512
    Points
    5 512
    Par défaut
    Bonjour,

    Pour info, une ListView a la propriété "HideSelection" mise à Vrai par défaut. L'élément sélectionné n'apparait donc que si la ListView est elle-même sélectionnée. Si c'est mis à Faux, l'élément sélectionné apparait en grisé si la ListView elle-même n'est pas sélectionnée.

    Cordialement.

    (et si vous changez aussi la couleur de fond de la ListView (Backcolor), le grisé apparaitra plus clairement)

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2021
    Messages
    334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 334
    Points : 602
    Points
    602
    Par défaut
    Salut Eric, merci pour la réponse.

    Le problème n'est pas forcement de ne pas voir la sélection mais que le premier item de la listview soit sélectionné à l'initialisation de ma listview. Quand je lance la macro du bouton sans avoir rien sélectionné, ça me mets que le premier item est sélectionné.

    Par contre c'est déjà bien de pouvoir apercevoir la sélection. Je vais faire comme ça pour le moment

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

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 181
    Points : 5 512
    Points
    5 512
    Par défaut
    Bonjour,

    Une possibilité pour qu'aucune ligne n'apparaisse sélectionnée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    '   Set ListView1.SelectedItem = Nothing    '--- sans effet
        ListView1.ListItems(1).Selected = True
        ListView1.ListItems(1).Selected = False
    Cordialement.

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

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 181
    Points : 5 512
    Points
    5 512
    Par défaut
    Maintenant, il est aussi possible de mettre en gras la ligne sélectionnée pour la rendre un peu plus remarquable:
    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
    Private Sub SelectedBold()
        Dim k As Long, k2 As Long
        With ListView1
            For k = 1 To .ListItems.Count
                If .ListItems(k).Selected Then
                    .ListItems(k).Bold = True
                Else
                    .ListItems(k).Bold = False
                End If
                For k2 = 1 To .ListItems(k).ListSubItems.Count
                   .ListItems(k).ListSubItems(k2).Bold = .ListItems(k).Bold
                Next k2
            Next k
        End With
    End Sub
    Cordialement.

Discussions similaires

  1. Afficher date jour par defaut dans Combox de dates...
    Par nicburger dans le forum Access
    Réponses: 5
    Dernier message: 08/02/2006, 14h59
  2. Mettre une date par defaut dans une textBox.
    Par yaumme dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 01/12/2005, 22h39
  3. Table par defaut dans un select sur 2 tables
    Par gibee dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/10/2005, 21h05
  4. [interbase 6]probleme valeur par defaut dans lookupcombobox
    Par macadam314 dans le forum Bases de données
    Réponses: 1
    Dernier message: 09/05/2005, 14h24
  5. AFFICHAGE PAR DEFAUT DANS DBLOOKUPCOMBOX
    Par AYITE dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/02/2004, 20h57

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