Masquer la première ligne du Listview

Bonjour,

Je me permets de remettre le sujet sur la table. J'ai parcourus les différentes réponses mais je n'arrive pas à adapter mon code aux autres codes.

Si je masque la ligne A2 dans mon code au niveau de l'alimentation de mon listview, quand je veux ajouter/modifier une ligne cela m'ajoute une ligne ou j'ai un bug au niveau de ma function CDbl-Agnostic.

Vous pouvez accéder au formulaire par l'onglet formulaire ou bien pour accéder au code par visual basic.

Est ce que quelqu'un pourrait m'aiguiller ? Je me mets le fichier TEST en PJ

Merci

Bonjour

Le code appelle la macro Function CDbl_Agnostic dans laquelle vous avez cette ligne --> CDbl_Agnostic = CDbl(txt) où "txt" doit être une valeur chiffre.
Lorsque votre code atteint la ligne --> pivotCell.Offset(0, 51).Value = CDbl_Agnostic(TxtCom), TxtCom est une valeur Texte.

Le code plante puisque la ligne Cdbl_Agnostic attend une valeur chiffre avec cette instruction --> CDBL(Txt)

Mettez l'instruction On Error Resume Next juste avant la ligne CDbl_Agnostic = CDbl(txt)

Si ok -->

Cordialement

Merci Dan pour ta réponse, effectivement ça fonctionne très bien.

Par contre dit moi, est ce que tu sais comment faire pour masquer la ligne A2, et que lorsque je modifie une ligne ça n'en ajoute pas une nouvelle ?

Par contre dit moi, est ce que tu sais comment faire pour masquer la ligne A2,

Mais pourquoi vous mettez cette ligne en fait ? Je me suis posé la question en voyant votre fichier

Sinon dans le code Sub AlimenterListView(), changez le A2 par A3 à cette ligne --> For Each c In f.Range("A2:A" & Lr)
D'ailleurs pour simplifier une partie, pourquoi vous ne faites pas ceci plutôt dans cette partie de code

        For Each c In f.Range("A3:A" & Lr)
            .ListItems.Add , , c

            For i = 1 To 53
                .ListItems(Ligne).ListSubItems.Add , , c.Offset(, i)
            Next i

            Ligne = Ligne + 1

        Next c

en oubliant pas de déclarer en début de code --> DIM i as byte

Quelques remarques :
- Au fait votre code Private Sub UserForm_Activate(), vous pouvez la supprimer et mettre les deux CALL dans la macro Initialize. A vérifier toutefois
- vous avez utilisé Rowssource pour alimenter les combox. C'est une instruction que je ne vous conseille pas du tout. Cela peut vous causer parfois des problèmes. Il faut lui privilégier la méthode Additem ou mieux encore dans votre cas la méthode List (vu que vous êtes en tableaux structurés)

Bonjour Dan, merci pour tous les éléments que tu m'as apportés.

Cependant malgré ton conseil de remplacer A2 par A3 dans la sub alimenterListview (ce que j'avais déjà essayé) me masque bien la ligne A2. Problème c'est que quand je veux modifier une ligne ultérieurement cette dernière ne se modifie pas convenablement, pareil pour l'ajout d'une nouvelle ligne et pour la suppression pareil. Aurais-tu encore un peu de temps et d'énergie à m'accorder s'il te plait.

En te remerciant par avance, je te souhaite une agréable journée Dan.

PS : je remets le nouveau fichier.

Bonjour

Vous n'avez pas suivi exactement ce que je vous ai écrit dans ma remarque de mon post précédent. Si vous ajoutez les deux CALL dans le code initalize sans supprimer le code Activate, les deux macros sont exécutées deux fois.

Je reviens aussi sur mon post précédent où je vous ai posé une question à laquelle vous n'avez pas donné réponse. Cela concerne la ligne 2. Pourquoi mettez vous cela dans le fichier ?

Ne repostez pas de fichier ... dites moi ce que vous faites

Bonjour Dan,

Dans la version que j'ai déposé effectivement j'ai omis de supprimer le code activate.

Pour répondre à ta question, je laisse cette ligne "A2" avec les valeurs allant de 0 to 53 en la masquant, car si je supprime la ligne A2 dans mon Listview mon code ne fonctionne plus.

Je suis à l'écoute si tu as un moyen de passer outre cette ligne qui ne sert à rien sauf : éviter le bug lors de la suppression de la première ligne et de vérifier ma que ma numérotation ce suit. Dans l'absolue elle n'a rien à faire là sauf au départ.

Merci Dan

Pour répondre à ta question, je laisse cette ligne "A2" avec les valeurs allant de 0 to 53 en la masquant, car si je supprime la ligne A2 dans mon Listview mon code ne fonctionne plus

Si cela fonctionne, il suffit de supprimer cette ligne et remettre la cellule de référence A3 à A2 --> For Each c In f.Range("A2:A" & Lr)

Ensuite, le code pour la suppression comme ceci :

Private Sub BtnSuppr_Click()
    Dim f As Worksheet
    Dim selectedRow As Integer
    Dim db As Range

    Set f = ThisWorkbook.Sheets("TEST")
    selectedRow = ListView1.SelectedItem.Index + 1

     f.Rows(selectedRow).EntireRow.Delete

    Set f = Nothing
    Call AlimenterListView
End Sub

Un grand merci pour ton temps et pour ta patience Dan.

Je te souhaite une belle après-midi

encore merci

PS : je mets en résolue

Ok parfait
Sachez qu'il y a pas mal de chose qui peuvent être amendées comme je l'avais dit dans mes remarques mais aussi dans la simplification des codes

A vous de voir si intérêt

Cordialement

Pour la macro effacer, utilisez plutôt celle-ci

Private Sub BtnEffacer_Click()
Dim c As control

For Each c In FRM_PACTRA.Controls
    Select Case TypeName(c)
        Case "TextBox"
            c.Value = ""
        Case "listbox", "ComboBox"
            c.Value = ""
            c.ListIndex = -1
    End Select
Next c
end sub

Crdlt

Il est vrai Dan que mon code est assez lourd et sans doute dénué de sens de temps en temps.

Quand je vois votre code pour "EFFACER" je me doute qu'il y moyen d'optimiser grandement mon code. Je ne voudrais, cependant, ne pas abuser de votre gentillesse.

Je reste ouvert à toutes suggestions.

Encore merci Dan

J'ai regardé pour RowSource. Si j'utilise "Additem", le problème de ce que je vois, c'est que ce n'est pas dynamique. Or, la liste est amenée à bouger assez souvent.

Pour la méthode "List" je n'ai pas trouvé d'élément correspondant à cette dernière.

Pour la méthode "List" je n'ai pas trouvé d'élément correspondant à cette dernière.

Voyez votre macro Initialize ci-dessous avec les 3 premières combo Entite, Manager et Agence

Private Sub UserForm_Initialize()

Me.Height = 545
Me.Width = 661.5

With Feuil1
    CboEntite.List = .ListObjects("LEntite").DataBodyRange.Value
    CboMana.List = .ListObjects("LMana").DataBodyRange.Value
    CboAgence.List = .ListObjects("LAgence1").DataBodyRange.Value

End With

Call AlimenterListView
End Sub

Ce que vous devez faire pour chaque combo :
- Couper la valeur présente dans rowssource
- ajouter la ligne pour la combo en ajoutant le nom repris dans rowssource que vous avez coupé dans "listobjects"
- répétez les 2 points ci dessus pour chaque combo

Rem :
- Avant d'ouvri l'USF, veillez à ne pas oublier de supprimer les rowssources pour les 3 lignes que je vous ai préparées ci-dessus.
- J'ai supprimé l'appel de la macro Effacer qui n'est pas nécessaire lorsque vous chargez l'userform (à vérifier). SI vous la conservez, il faut qu'elle soit avant l'instruction With
- Si à l'ouverture vous avez une erreur type 9, c'est que vous avez laissé un rowssource dans une combo
- Lorsque vous choisissez le nom à mettre dans listobjects, vous devez toujours prendre celui dont la valeur est en grisé dans la rubrique "fait référence à" dans le gestionnaire de noms

Merci pour tous vos conseils de qualités que j'ai appliqué à la lettre. Ça permet vraiment d'avoir une vue d'ensemble sur les listes.

Par contre, j'ai une question. J'avais commencé à prendre un codage sur les combobox en cascade mais la je vois pas trop comment l'intégrer à la fonction en remplacement de ROWSOURCE, "CboEntite.List = .ListObjects("LXXX").DataBodyRange.Value" dans sub initialize. J'imagine qu'il faut combiner les deux mais j'ai pas l'impression de pouvoir y arriver. Si jamais vous avez encore un peu de temps rien que pour m'aiguiller.

Le codage est le suivant :

'Les données sont dans les colonnes A à E, d'un onglet nommé "LIST".
'La procédure effectue un remplissage conditionnel des Combobox en fonction de
'ce qui est sélectionnée dans le contrôle précédent:
'La sélection du ComboBox1 (données colonne B) définit le contenu du ComboBox2 (données colonne C) ,
'La sélection du ComboBox2 définit le contenu du ComboBox3 (données colonne D) …etc...

Private Sub UserForm_Initialize()
Dim Ws As Worksheet
Dim NbLignes As Integer

'Définit la feuille contenant les données
Set Ws = Worksheets("LISTE")

'Définit le nombre de lignes dans la colonne B
NbLignes = Ws.Range("B2000").End(xlUp).Row

'Remplissage du ComboBox1
Alim_Combo 1 'a voir ici pour le alim combo
'End Sub

Private Sub CboAct_Change()
'Remplissage Combo2
Alim_Combo 2, CboAct.Value 'pareil
End Sub

Private Sub CboSecteur_Change()
'Remplissage Combo3
Alim_Combo 3, CboSecteur.Value
End Sub

Private Sub CboMana_Change()
'Remplissage Combo4
Alim_Combo 4, CboMana.Value
End Sub
'
'
'Procédure pour alimenter les ComboBox
Private Sub Alim_Combo(CbxIndex As Integer, Optional Cible As Variant)
Dim j As Integer
Dim Obj As Control
Dim Ws As Worksheet
Dim NbLignes As Integer

'Définit le ComboBox à remplir
Set Obj = Me.Controls("ComboBox" & CbxIndex)
'Supprime les anciennes données
Obj.Clear
'
'alimente le Combobox initial (Combobox1)
If CbxIndex = 1 Then
'Boucle sur les lignes de la colonne B (à partir de la 2eme ligne)
For j = 2 To NbLignes
Obj = Ws.Range("B" & j)
'Remplit le ComboBox sans doublons
If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("B" & j)
Next j
Else

'Alimentation conditionnelle des autres Combobox en fonction de
'ce qui est sélectionnée dans le contrôle précédent:
'(La sélection du ComboBox1 définit le contenu du ComboBox2,
'La sélection du ComboBox2 définit le contenu du ComboBox3 …etc...)
For j = 2 To NbLignes
If Ws.Range("B" & j).Offset(0, CbxIndex - 2) = Cible Then
Obj = Ws.Range("B" & j).Offset(0, CbxIndex - 1)
If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("B" & j).Offset(0, CbxIndex - 1)
End If
Next j
End If
'
'Enlève la sélection dans le ComboBox
Obj.ListIndex = -1
End Sub

J'imagine que pour vous cela doit être évident… croyez-vous que cela soit possible ?

Lorsque vous postez un code, veillez à utiliser les balises de code en cliquant sur l'icone </> et en mettant votre code dans la fenêtre.
J'ai corrigé votre post.

Dans votre explication, pour bien comprendre en fonction de votre fichier.
La combo cbentité doit contenir toute la colonne A ?
Ensuite, mettons que vous complétez la combo CboMana et que vous choisissez A, qu'est ce que je dois trouver dans la combo CboAct ?
Idem pour cboAct...

Bonjour Dan,

Merci pour l'astuce, je n'y manquerai pas la prochaine fois.

Le combobox CboEntite doit contenir les éléments de la liste LEntite et non toute la colonne "A", à moins qu'il y est un moyen de prendre toute la colonne A et d'avoir dans la combobox que les élements de la liste ENTITE.

J'ai classé les combobox dans un ordre bien précis pour que la cascade suive la base de donnée dans l'onglet "TEST" sauf pour deux collones (Choix colonne F et Type d'encartage colonne G).

La cascade doit suivre l'ordre suivant :

1) CboEntite colonne A= LEntite

2) CboAct colonne B= LAct

3) CboSecteur colonne C= LSecteur

4) CboMana Colonne D= LMana

5) CboAgence Colonne E= LAgences

6) CboCollab Colonne H= LCollaborateurs

En sélectionnant dans ma combobox Entite l'entité "A" il faut que je trouve dans ma conbobox Activite (colonne B) les activités liés à l'entité A, ainsi de suite.

ENTITEACTIVITESECTEUR
A

A

A

B

ACTIVITE 1

ACTIVITE 1

ACTIVITE 2

ACTIVITE 1

TERRE

MER

TERRE

TERRE

Je sais pas si je m'exprime bien ?

Encore merci Dan

Si possible il faudrait également que mon listview soit filtré en fonction des combobox. Mais la, je vois pas comment.

Ce qui veut dire combobox en cascade + filtrer le listview. Ca me semble bien difficile...

Le combobox CboEntite doit contenir les éléments de la liste LEntite et non toute la colonne "A", à moins qu'il y est un moyen de prendre toute la colonne A et d'avoir dans la combobox que les élements de la liste ENTITE.

Votre fichier n'est pas représentatif. Si je comprends vous avez des doublons en colonne A ?

Si c'est bien le cas à la vue du tableau de votre post, ce que je vous ai proposé est à revoir complètement
Idéalement il faudrait que les 3 colonnes votre feuille Liste soient arrangées comme vous me le montrez.
On pourrait même faire un seul tableau avec ces 3 colonnes

Je peux faire cela dans votre fichier ?

Ce que je fais Dan, je remets au propre mon fichier pour que ce soit plus parlant et je le poste.

Encore merci Dan, c'est impressionnant cette solidarité.

Rechercher des sujets similaires à "masquer premiere ligne listview"