OVH Cloud OVH Cloud

Comment accélérer le chargement d'une listview

5 réponses
Avatar
Gortex
Bonjour,
dans l'userform1 la listview1 qui dois charger et colorer sous condition
les 20000 lignes de la Feuil1
mais l'execution et longue"Private Sub InitList(Nom As String, Col&)"
Comment accélérer le chargement de listview1 si vous avez
une solution d'optimisation du code svp merci d'avance
Cordialement


Dim Ctrl As Control
Dim Sh As Object
Dim Lig&, Col&, L&, C&

Private Sub UserForm_Initialize()
Me.Caption = "e;"e;
Me.BackColor = &H80000005
For Each Ctrl In Me.Controls
Select Case Left(Ctrl.Name, 3)
Case "e;Tex"e;
Ctrl.BackColor = &H80000018
Ctrl.Font.Name = "e;Arial Narrow"e;
Ctrl.Font.Size = 14
Ctrl.Font.Bold = True
Ctrl.Height = 24
Case "e;Com"e;
Ctrl.BackColor = &H80000018
Ctrl.Font.Name = "e;Arial Narrow"e;
Ctrl.Font.Size = 14
Ctrl.Font.Bold = True
Ctrl.Height = 24
Case "e;Lab"e;
Ctrl.BackColor = &H80000005
Ctrl.BackStyle = 0
Ctrl.Font.Name = "e;Arial Narrow"e;
Ctrl.Font.Size = 14
Ctrl.Font.Bold = True
Ctrl.TextAlign = 3
Ctrl.Height = 24
Case "e;Lis"e;
Ctrl.LabelEdit = 1
Ctrl.View = lvwReport 'affichage en mode Rapport
Ctrl.Gridlines = True 'affichage d'un quadrillage
Ctrl.FullRowSelect = True 'Sélection des lignes comlètes
Ctrl.LabelEdit = False
Ctrl.BackColor = &H80000005 '&H80000018
' Ctrl.ForeColor = &HFF&
Ctrl.Font.Name = "e;Arial Narrow"e;
Ctrl.Font.Size = 12
Ctrl.Font.Bold = True
Case "e;But"e;
' Ctrl.Font.Name = "e;Arial Narrow"e;
' Ctrl.Font.Size = 12
' Ctrl.Font.Bold = True
Ctrl.Top = 330
End Select
Next Ctrl

End Sub

Private Sub UserForm_Activate()
ComboBox1.List = Feuil1.Range("e;A2:B"e; & Feuil1.Range("e;A"e; & Rows.Count).End(xlUp).Row).Value
With ListView1.ColumnHeaders
.Clear
.Add , , "e;Num"e;, 0
.Add , , "e;Code art."e;, 70, lvwColumnLeft
.Add , , "e;Type Ets"e;, 55, lvwColumnCenter
.Add , , "e;Nom Ets (Client)"e;, 95, lvwColumnCenter
.Add , , "e;Désignation"e;, 220, lvwColumnCenter
.Add , , "e;D.U. (F)"e;, 60, lvwColumnCenter
.Add , , "e;D.U. (D/P)"e;, 60, lvwColumnCenter
.Add , , "e;D.U. (ST)"e;, 50, lvwColumnCenter
.Add , , "e;Unité"e;, 35, lvwColumnCenter
.Add , , "e;Qté"e;, 50, lvwColumnCenter
.Add , , "e;Sous-traitant"e;, 140, lvwColumnCenter
End With
Set Sh = Feuil2
ComboBox1.ListIndex = 0
InitList "e;"e;, 1
End Sub

Private Sub InitList(Nom As String, Col&)
Dim L&
Dim Nlig&
With ListView1
.ListItems.Clear
For L = 2 To 20000 ' Sh.Range("e;A"e; & Rows.Count).End(xlUp).Row
If UCase(Sh.Cells(L, Col).Text) Like UCase(Nom) & "e;*"e; Then
.ListItems.Add , , L ' Numero de Ligne
.ListItems(.ListItems.Count).ListSubItems.Add , , Sh.Cells(L, 1)
If LCase(Sh.Cells(L, 3)) = LCase("e;Néant"e;) Then
.ListItems(.ListItems.Count).ListSubItems(1).ForeColor = vbRed 'vbBlue
End If
.ListItems(.ListItems.Count).ListSubItems.Add , , Sh.Cells(L, 2)
If LCase(Sh.Cells(L, 3)) = LCase("e;Néant"e;) Then
.ListItems(.ListItems.Count).ListSubItems(2).ForeColor = vbRed 'vbBlue
End If
.ListItems(.ListItems.Count).ListSubItems.Add , , Sh.Cells(L, 3)
If LCase(Sh.Cells(L, 3)) = LCase("e;Néant"e;) Then
.ListItems(.ListItems.Count).ListSubItems(3).ForeColor = vbRed 'vbBlue
End If
.ListItems(.ListItems.Count).ListSubItems.Add , , Sh.Cells(L, 4)
If LCase(Sh.Cells(L, 3)) = LCase("e;Néant"e;) Then
.ListItems(.ListItems.Count).ListSubItems(4).ForeColor = vbRed 'vbBlue
End If
.ListItems(.ListItems.Count).ListSubItems.Add , , Sh.Cells(L, 5)
If LCase(Sh.Cells(L, 3)) = LCase("e;Néant"e;) Then
.ListItems(.ListItems.Count).ListSubItems(5).ForeColor = vbRed 'vbBlue
End If
.ListItems(.ListItems.Count).ListSubItems.Add , , Sh.Cells(L, 6)
If LCase(Sh.Cells(L, 3)) = LCase("e;Néant"e;) Then
.ListItems(.ListItems.Count).ListSubItems(6).ForeColor = vbRed 'vbBlue
End If
.ListItems(.ListItems.Count).ListSubItems.Add , , Sh.Cells(L, 7)
If LCase(Sh.Cells(L, 3)) = LCase("e;Néant"e;) Then
.ListItems(.ListItems.Count).ListSubItems(7).ForeColor = vbRed 'vbBlue
End If
.ListItems(.ListItems.Count).ListSubItems.Add , , Sh.Cells(L, 8)
If LCase(Sh.Cells(L, 3)) = LCase("e;Néant"e;) Then
.ListItems(.ListItems.Count).ListSubItems(8).ForeColor = vbRed 'vbBlue
End If
.ListItems(.ListItems.Count).ListSubItems.Add , , Sh.Cells(L, 9)
If LCase(Sh.Cells(L, 3)) = LCase("e;Néant"e;) Then
.ListItems(.ListItems.Count).ListSubItems(9).ForeColor = vbRed 'vbBlue
End If
.ListItems(.ListItems.Count).ListSubItems.Add , , Sh.Cells(L, 10)
If LCase(Sh.Cells(L, 3)) = LCase("e;Néant"e;) Then
.ListItems(.ListItems.Count).ListSubItems(10).ForeColor = vbRed 'vbBlue
End If
End If
Next
End With
On Error Resume Next
ListView1.ListItems(1).Selected = False
Set ListView1.SelectedItem = Nothing
Button2.Visible = False
Button3.Visible = False
End Sub

Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
Lig = Val(ListView1.SelectedItem)
For C = 1 To 10
Controls("e;TextBox"e; & C).Value = Sh.Cells(Lig, C)
Next
Button2.Visible = True
Button3.Visible = True
End Sub

Private Sub ComboBox1_Change()
Col = Val(ComboBox1.Column(1))
End Sub

Private Sub TextBox12_Change()
InitList TextBox12.Value, Col
End Sub
Private Sub TextBox3_Change()
If TextBox3 = "e;Néant"e; Then
TextBox1.ForeColor = vbRed
TextBox2.ForeColor = vbRed
TextBox3.ForeColor = vbRed
TextBox4.ForeColor = vbRed
TextBox5.ForeColor = vbRed
TextBox6.ForeColor = vbRed
TextBox7.ForeColor = vbRed
TextBox8.ForeColor = vbRed
TextBox9.ForeColor = vbRed
TextBox10.ForeColor = vbRed
Else
TextBox1.ForeColor = vbBlack
TextBox2.ForeColor = vbBlack
TextBox3.ForeColor = vbBlack
TextBox4.ForeColor = vbBlack
TextBox5.ForeColor = vbBlack
TextBox6.ForeColor = vbBlack
TextBox7.ForeColor = vbBlack
TextBox8.ForeColor = vbBlack
TextBox9.ForeColor = vbBlack
TextBox10.ForeColor = vbBlack
End If
End Sub
Private Sub BButton1_Click()
For C = 1 To 10
Controls("e;TextBox"e; & C).Value = "e;"e;
Next
ComboBox1.ListIndex = 0
TextBox12.Value = "e;"e;
InitList "e;"e;, 1
End Sub

Private Sub Button1_Click()
Dim Dligne&
Dligne = Sh.Range("e;A"e; & Rows.Count).End(xlUp).Row + 1
For C = 1 To 10
Sh.Cells(Dligne, C) = Controls("e;TextBox"e; & C).Value
Next
BButton1_Click
End Sub

Private Sub Button2_Click()
For C = 1 To 10
Sh.Cells(Lig, C) = Controls("e;TextBox"e; & C).Value
Next
BButton1_Click
End Sub

Private Sub Button3_Click()
Sh.Rows(Lig).Delete
BButton1_Click
End Sub

Private Sub Button4_Click()
Unload Me
End Sub

5 réponses

Avatar
Michd
Bonjour,
Ce ne sont que des suggestions, je n'ai rien testé.
Utilise une copie de ton fichier aux fins de test.
Cette procédure pourrait se lire ainsi, quelques lignes de code à adapter.
Ce qui est le plus long dans cette procédure, c'est coloré chacun des items
et il n'y a pas beaucoup de choses que l'on peut faire pour cela. Tu as près
de 20 000 lignes sur plusieurs colonnes, est-ce nécessaire que tous les
éléments soient en couleur? Tu peux toujours tester la procédure en inhibant
la ligne de code responsable de l'application de la couleur et voir si tu
gagnes beaucoup de temps.
.ListItems(Compteur).ListSubItems(K).ForeColor = vbRed 'vbBlue
'----------------------------
Private Sub InitList(Nom As String, Col&)
Dim Compteur As Long, K As Long
Dim T As Variant, Nb As Long
'Définir la plage de cellules : ' Sh.Range("e;A"e; &
Rows.Count).End(xlUp).Row
With Sh
'La plage de cellules à adapter
T = .Range("A2:A" & .Range("A" & .Rows.Count).End(xlUp).Row).Value
'Nb = Nombre de cellules dans la plage
Nb = UBound(T, 1)
End With
With ListView1
.ListItems.Clear
For L = 2 To Nb
If UCase(Sh.Cells(L, Col).Text) Like UCase(Nom) & "e;*"e; Then
Select Case LCase(Sh.Cells(L, 3))
case is = LCase("e;Néant"e;)
Compteur Compteur + 1
.ListItems.Add , , L 'Numero de Ligne
.ListItems(Compteur).ListSubItems.Add , , T(L, 1)
K = K + 1
.ListItems(Compteur).ListSubItems(K).ForeColor = vbRed
'vbBlue
End Select
End If
Next
End With
'----------------------------
Dans la procédure "Private Sub UserForm_Initialize()"
Essaie de définir le plus de caractéristiques des contrôles de l'userform en
mode création lorsque cela est possible!
MichD
Avatar
gortex
Le dimanche 15 Avril 2018 à 15:30 par Michd :
Bonjour,
Ce ne sont que des suggestions, je n'ai rien testé.
Utilise une copie de ton fichier aux fins de test.
Cette procédure pourrait se lire ainsi, quelques lignes de code à
adapter.
Ce qui est le plus long dans cette procédure, c'est coloré chacun
des items
et il n'y a pas beaucoup de choses que l'on peut faire pour cela. Tu as
près
de 20 000 lignes sur plusieurs colonnes, est-ce nécessaire que tous les
éléments soient en couleur? Tu peux toujours tester la
procédure en inhibant
la ligne de code responsable de l'application de la couleur et voir si tu
gagnes beaucoup de temps.
.ListItems(Compteur).ListSubItems(K).ForeColor = vbRed 'vbBlue
'----------------------------
Private Sub InitList(Nom As String, Col&)
Dim Compteur As Long, K As Long
Dim T As Variant, Nb As Long
'Définir la plage de cellules : ' Sh.Range("e;A"e; &
Rows.Count).End(xlUp).Row
With Sh
'La plage de cellules à adapter
T = .Range("A2:A" & .Range("A" &
.Rows.Count).End(xlUp).Row).Value
'Nb = Nombre de cellules dans la plage
Nb = UBound(T, 1)
End With
With ListView1
.ListItems.Clear
For L = 2 To Nb
If UCase(Sh.Cells(L, Col).Text) Like UCase(Nom) & "e;*"e; Then
Select Case LCase(Sh.Cells(L, 3))
case is = LCase("e;Néant"e;)
Compteur Compteur + 1
.ListItems.Add , , L 'Numero de Ligne
.ListItems(Compteur).ListSubItems.Add , , T(L, 1)
K = K + 1
.ListItems(Compteur).ListSubItems(K).ForeColor = vbRed
'vbBlue
End Select
End If
Next
End With
'----------------------------
Dans la procédure "Private Sub UserForm_Initialize()"
Essaie de définir le plus de caractéristiques des contrôles
de l'userform en
mode création lorsque cela est possible!
MichD
Re
Merci
pour moi c'est pas la ligne de la colorisation qui rallonge l'execution
j'ai teste ta proposition mais ne fonctionne pas
voici le fichier teste
Cordialement
https://www.cjoint.com/c/HDpsHm5zIqQ
Avatar
Michd
Je peux raccourcir la procédure, mais difficilement le temps requis pour
mettre en couleur au-delà de
80 000 entrées dans le listview. Si tu montes en mémoire vive qu'une fois le
formulaire durant une session de travail et te contentes de le masquer
(Hide) au lieu de le décharger de la mémoire vive... Cela est "acceptable".
Je ne connais pas de solution à ce problème!
'----------------------------------------------------------
Private Sub InitList(Nom As String, Col&)
Dim A As Long, T As Variant, Nb As Long
'Définir la plage de cellules : ' Sh.Range("e;A"eRows.Count).End(xlUp).Row
With Sh
'La plage de cellules à adapter
T = .Range("A2:J" & .Range("A" & .Rows.Count).End(xlUp).Row).Value
'Nb = Nombre de cellules dans la plage
Nb = UBound(T, 1)
End With
With ListView1
.ListItems.Clear
For L = 1 To Nb
If UCase(Sh.Cells(L, Col).Text) Like UCase(Nom) & "*" Then
For A = 1 To 10
.ListItems.Add , , L
.ListItems(L).ListSubItems.Add , , T(L, A)
If L Mod 2 = 1 Then
.ListItems(L).ListSubItems(A).ForeColor = vbYellow
End If
Next
End If
Next
End With
On Error Resume Next
ListView1.ListItems(1).Selected = False
Set ListView1.SelectedItem = Nothing
Button2.Visible = False
Button3.Visible = False
End Sub
'----------------------------------------------------------
MichD
Avatar
gortex
Le lundi 16 Avril 2018 à 00:55 par Michd :
Je peux raccourcir la procédure, mais difficilement le temps requis pour
mettre en couleur au-delà de
80 000 entrées dans le listview. Si tu montes en mémoire vive
qu'une fois le
formulaire durant une session de travail et te contentes de le masquer
(Hide) au lieu de le décharger de la mémoire vive... Cela est
"acceptable".
Je ne connais pas de solution à ce problème!
'----------------------------------------------------------
Private Sub InitList(Nom As String, Col&)
Dim A As Long, T As Variant, Nb As Long
'Définir la plage de cellules : '
Sh.Range("e;A"eRows.Count).End(xlUp).Row
With Sh
'La plage de cellules à adapter
T = .Range("A2:J" & .Range("A" &
.Rows.Count).End(xlUp).Row).Value
'Nb = Nombre de cellules dans la plage
Nb = UBound(T, 1)
End With
With ListView1
.ListItems.Clear
For L = 1 To Nb
If UCase(Sh.Cells(L, Col).Text) Like UCase(Nom) & "*" Then
For A = 1 To 10
.ListItems.Add , , L
.ListItems(L).ListSubItems.Add , , T(L, A)
If L Mod 2 = 1 Then
.ListItems(L).ListSubItems(A).ForeColor = vbYellow
End If
Next
End If
Next
End With
On Error Resume Next
ListView1.ListItems(1).Selected = False
Set ListView1.SelectedItem = Nothing
Button2.Visible = False
Button3.Visible = False
End Sub
'----------------------------------------------------------
MichD
Bonsoir
ca ne fonctionne pas
Avatar
Michd
| ca ne fonctionne pas
Extraordinaire, la précision avec laquelle tu énonces ce qui ne va pas!
Est-ce que je dois faire un effort pour répondre à ce type de message?
Voici ton fichier : https://www.cjoint.com/c/HDymCDdRSTi
MichD