Bonjour à tous,


J'utilise une ListView pour afficher des items récupérer depuis un classeur Excel. Je donne la possibilité à l'utilisateur de choisir les colonnes qu'il souhaite afficher dans la listView à l'aide d'un petit userform où il a la possibilité de cocher/décocher des checkbox correspondant aux colonnes et également sélectionner leur positions, c'est à dire l'ordre des colonnes. jusque la tout fonctionne.

C'est au moment de crée mes ColumnHeader que le problème survient. En effet j'affiche la colonne uniquement si la case relative a la colonne a été cocher. Or je fais une batterie de test les un après les autres pour savoir si elles ont été cohcer ou pas. Cependant il arrive que la position de la colonne concerné, soit 3 (par exemple), soit ajouter alors qu'aucunes colonnes avec l'index 2 n'a encore été crée vu que je ne connais pas a l'avance l'index. Je ne sais pas si je suis claire.

EXEMPLE: (je précise que la première colonne ne peux pas être changer de place)
l'utilisateur veut que la colonne NOM soit en deuxième positions, index = 2
et que la colonne ENTREE soit en troisiéme position, index = 3

cela donne:

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
 
With risky_position_listview
        With .ColumnHeaders
                .Clear
 
                .Add 1, , "Ticker/ISIN", 50
                If name_checkbox = "true" Then
                'Sheets("settings").Cells(21, 3).Value
                    .Add 2, , "Nom", 100
                End If
 
                If entry_checkbox = "true" Then
                'Sheets("settings").Cells(17, 3).Value
                    .Add 3, , "Entrée", 40
                End If
 
End With
CELA fontionne car excel ajoutera bien la colonne d'index 2 avant la colonne d'index 3

Or si l'utilisateur échange la position des colonnes donc NOM avec l'index 3 et ENTREE avec l'index 2.
Cela donne

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
 
With risky_position_listview
        With .ColumnHeaders
                .Clear
 
                .Add 1, , "Ticker/ISIN", 50
                If name_checkbox = "true" Then
                'Sheets("settings").Cells(21, 3).Value
                    .Add 3, , "Nom", 100
                End If
 
                If entry_checkbox = "true" Then
                'Sheets("settings").Cells(17, 3).Value
                    .Add 2, , "Entrée", 40
                End If
End With
Ici une erreur "index out of bounds" nous sera renvoyé car excel ajoute une colonne d'index 3 avant la colonne d'index 2 or je ne peux pas changer l'ordre d'execution de mes If.

Voici mon code en entier:

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
103
104
105
106
107
108
109
110
111
112
'on nettoie la ListView
    ClearListView risky_position_listview
     'on initialise les colonnes
    Call get_active_risk_columns
 
    With risky_position_listview
        With .ColumnHeaders
                .Clear
 
                .Add 1, , "Ticker/ISIN", 50
 
                If name_checkbox = "true" Then
                'Sheets("settings").Cells(21, 3).Value
                    .Add 2, , "Nom", 100
                End If
 
                If entry_checkbox = "true" Then
                'Sheets("settings").Cells(17, 3).Value
                    .Add 3, , "Entrée", 40
                End If
 
 
'
'                If action_number_checkbox = "true" Then
'                    .Add Sheets("settings").Cells(13, 3).Value, , "Nombre d'action", 100
'                End If
'
'                If broker_free_checkbox = "true" Then
'                    .Add , , "Frais de courtage", 100
'                End If
'
'                If entry_date_checkbox = "true" Then
'                    .Add , , "Date d'entrée", 100
'                End If
'
'                If market_checkbox = "true" Then
'                    .Add , , "Marché", 100
'                End If
'
'                If maximum_loss_checkbox = "true" Then
'                    .Add , , "Pertes maximum", 100
'                End If
 
'                If stop_loss_checkbox = "true" Then
'                    .Add , , "Stop loss", 100
'                End If
'
'                If trade_risk_checkbox = "true" Then
'                    .Add , , "risque par trade utilisé", 100
'                End If
 
        End With
 
        .Gridlines = True
        .View = lvwReport
        .FullRowSelect = True
 
 
        'Set plage1 = Sheets("journal").Range("M2:M" & [A65536].End(xlUp).Row)
        Set plage1 = Sheets("journal").Range("M2:M" & Sheets("journal").Range("A65536").End(xlUp).Row)
 
        i = 1
        For Each Cell In plage1
            If Cell.Value = "false" Then
 
                With .ListItems
                    'on affiche tout le temps une colonne "Ticker/ISIN"
                   .Add , , Cell.Offset(0, -11).Value
                End With
 
                If action_number_checkbox = "true" Then
                    .ListItems(i).ListSubItems.Add Sheets("settings").Cells(13, 3).Value, , Cell.Offset(0, -9).Value
                End If
 
                If broker_free_checkbox = "true" Then
                    .ListItems(i).ListSubItems.Add Sheets("settings").Cells(14, 3).Value, , Cell.Offset(0, -3).Value
                End If
 
                If entry_checkbox = "true" Then
                    .ListItems(i).ListSubItems.Add Sheets("settings").Cells(17, 3).Value, , Cell.Offset(0, -8).Value
                End If
 
                If entry_date_checkbox = "true" Then
                    .ListItems(i).ListSubItems.Add Sheets("settings").Cells(18, 3).Value, , Cell.Offset(0, -7).Value
                End If
 
                If market_checkbox = "true" Then
                    .ListItems(i).ListSubItems.Add market_column_index, , Cell.Offset(0, -10).Value
                End If
 
                If maximum_loss_checkbox = "true" Then
                    .ListItems(i).ListSubItems.Add Sheets("settings").Cells(20, 3).Value, , Cell.Offset(0, 4).Value
                End If
 
                If name_checkbox = "true" Then
                    .ListItems(i).ListSubItems.Add Sheets("settings").Cells(21, 3).Value, , Cell.Offset(0, -12).Value
                End If
 
                If stop_loss_checkbox = "true" Then
                    .ListItems(i).ListSubItems.Add Sheets("settings").Cells(26, 3).Value, , Cell.Offset(0, -4).Value
                End If
 
                If trade_risk_checkbox = "true" Then
                .ListItems(i).ListSubItems.Add Sheets("settings").Cells(28, 3).Value, , Cell.Offset(0, 3).Value
                End If
 
                i = i + 1
 
            End If
        Next Cell
 
    End With
Avez-vous une solution pour régler mon probléme ?

Merci beaucoup !