Alimenter Listview sous conditions

Bonjour à tous,

Je suis en train de buter depuis plusieurs jours sur un point, et même en y revenant à tête reposer, je n'arrive pas à comprendre l'erreur... Voici donc mon sujet : Je cherche à alimenter une listview ("ListView1") qui est dans mon userfom, à partir des données de la feuille "Liste CONTRATS", tout en vérifiant que la ligne que j'ajoute dans mon userform n'est pas présente dans la colonne B de ma feuille "Liste FACTURES".

L'idée qui se cache derrière ça, c'est d'afficher uniquement dans la listview les contrats qui n'ont pas fait l'objet de facture. Car lorsqu'un contrat est créé, je dois faire une facture. Mais je ne veux pas facturer deux fois sur le même contrat, d'où ma volonté de n'afficher que les contrats pour lesquels je n'ai pas encore de facture.

Voici mon code :

Private Sub Userform_Initialize()

Worksheets("Liste CONTRATS").Activate

    'Ligne avec les titres
    Set rg2 = [B2]

    'Nombre de colonnes de données
    m = 15

    With Me.ListView1

        'Ajout des titres de colonnes
        For y = 1 To m
            .ColumnHeaders.Add , , rg2.Offset(0, y - 1)
        Next y

        'Ajout des éléments de la première colonne
        Set rg2 = [B3]

        Do Until IsEmpty(rg2)

                 If Application.WorksheetFunction.CountIf(Worksheets("Liste FACTURES").Range("B2:B100"), rg2) = 0 Then  

                        .ListItems.Add , , rg2

                       'Ajout des éléments des autres colonnes
                    For y = 1 To m
                            .ListItems(rg2.Row - 2).ListSubItems.Add , , rg2.Offset(0, y)
                    Next y

                Enf if

            Set rg2 = rg2.Offset(1, 0)

        Loop

    'Permet de choisir une ligne complète
    .FullRowSelect = True
    'Permet de sélectionner plusieurs lignes
    .MultiSelect = False
    'Format d'affichage des données
    .View = lvwReport
    'Permet de désélectionner automatiquement la première ligne lors de l'affichage
    ListView1.ListItems(1).Selected = False
    Set ListView1.SelectedItem = Nothing

    End With

End Sub

Le problème étant que j'ai un message d'erreur "index out of bounds - Erreur 35600". Merci d'avance pour votre aide précieuse.

Bonne journée,

Corsaiire

Bonjour,

J'ai déjà eu ce genre de problème aussi, avec une ListBox pour ma part, le truc c'est que... ce n'est pas ton programme qui est en cause d'après moi.

Le souci avec les ListBox et ListView, et je pense que c'est la même chose avec les ComboBox, c'est que le nombre de colonnes que tu peux avoir en utilisant la méthode que tu as utilisé (.add), te limite à un maximum d'environ 10 colonnes.

Si tu veux pouvoir enregistrer plus de 10 colonnes dans ton contrôle, tu es apparemment obligé de passer par un tableau de 15 colonnes, et de l'affecter à la liste de valeur de ton contrôle, pour ma ListBox ça donnait à peu près:

ListBox1.List = tableau

et là ça marchait, ça acceptait d'avoir plus de 10 colonnes, si tu passes m à 7 pour le test, est-ce que tu as le même message d'erreur? si ce n'est pas le cas, c'est que c'est ça qui doit te limiter...

Pour les headers, je ne sais pas si il faut procéder de la même façon, je te laisse voir pour modifier ton programme en fonction de ça

Si tu as besoin d'aide pour modifier ton programme, n'hésite pas à demander

Bonjour Ausecour,

Merci pour ta réponse, mais malheureusement j'ai exactement le même problème...

Corsaiire

Re,

sur quelle ligne ton fichier plante? est-ce que tu peux nous joindre une copie?

Re,

Par soucis de confidentialité, je ne peux pas donner tout le fichier donc je viens de reconstituer un fichier avec ce qui nous pose problème. Le seul hic est que la ligne des titres ne s'affiche pas dans ce fichier, et les lignes s'affichent dans les colonnes, je ne comprends pas pourquoi mais bon... Ce code marche pourtant dans mon fichier d'origine...

Corsaiire

49test.xlsm (109.06 Ko)

Bonjour toutes et tous

coucou Ausecour

@Corsaiire à tester sans les cellules fusionnées

Informations liées aux coordonées des clients

et

Informations liées au prix

cellules fusionnées

et voir également le 2ème onglets

coordonées ==> coordonnées

crdlt,

André

Hello André,

Oups, la petite faute d'orthographe, merci

Cependant, ça ne marche pas mieux en supprimant les cellules fusionnées des deux onglets

Corsaire

Bonjour,

trouvé!

Tu n'avais pas la bonne vue, tu avais un truc Icon, il faut ajouter:

.View = lvwReport

Tu verras que ça marchera beaaaaaucoup mieux en ajoutant ça vers la fin de ton programme

C'est l'affichage en mode "Détail", en tableau quoi

Bonjour Ausecour,

Je ne suis pas sûr de comprendre, je l'avais déjà dans mon code ça. Je remets un fichier plus propre en pièce jointe avec mon problème. Le but étant donc que le contrat "FR21/20/11" n'aparaisse pas dans la listview vu qu'il est déjà dans la feuille "Liste FACTURES".

Ca va être plus clair comme ça

Cordialement,

Corsaiire

30test-2.xlsm (82.86 Ko)

Re,

Ah, sur ton dernier fichier ta listview n'affichait rien de mon côté, et le code manquait

En tout cas pas grave, sur le fichier que tu viens de joindre, je viens de passer en débugage, ton problème se trouve ici:

For y = 1 To m
    .ListItems(rg2.Row - 2).ListSubItems.Add , , rg2.Offset(0, y)
Next y

Le souci est simple, tu utilises la ligne de ta cellule pour savoir à quelle ligne de ta ListView tu dois ajouter des éléments, le souci c'est que si comme dans ton cas, un élément n'est pas ajouté car il ne remplit pas les conditions, tu te retrouves avec une cellule en ligne 3 qui veut ajouter des éléments à la ligne 3 de ta ListView, alors qu'elle n'a que 2 lignes... ça te crée le message d'erreur "index out of bound". Il faut utiliser:

For y = 1 To m
    .ListItems(.ListItems.Count).ListSubItems.Add , , rg2.Offset(0, y)
Next y

De cette façon, tu écris toujours à la dernière ligne de ta liste, en utilisant la propriété Count qui te dit: "j'ai 2 lignes", donc tu écris à la ligne 2

Voici le fichier corrigé:

100copie-de-test-2.xlsm (84.71 Ko)

Re,

Alors là... chapeau ! Un grand merci à toi, ça fonctionne à merveille.

Bonne journée à toi et désolé pour le loupé avec mon fichier au début.

Corsaire

Rechercher des sujets similaires à "alimenter listview conditions"