Bonjour,
J'ai un bon problème devant moi.
1. J'ai une liste de tous les exe d'un parc de 1400 postes ce qui donne environ 400 000 lignes. Le tableau contient le nom de l'ordinateur, l'identifiant de la personne, le système d'exploitation, le nom du fichier, son emplacement, sa version et sa description. (voir le fichier test.xlsx).
2. Je dois épurer cette liste au maximum pour ne garder que certains exe.
Ma solution:
J'ai créé un dictionnaire dans un autre classeur et je le charge comme array avec un vba. Puis pour chaque entrée dans le dictionnaire, je fais une recherche dans la colonne appropriée et supprime la ligne. Je refais la même recherche tant que le mot existe.
Une fois que le mot n'est plus là, je prend la seconde entrée dans le dictionnaire. Actuellement, le dictionnaire a environ 300 lignes mais un même mot du dictionnaire peut apparaitre 5000 fois dans le tableau.
Mon problème:
Si par exemple, je recherche le mot Prowin.exe, ce mot apparaît à différent endroits dans mon tableau mais toujours dans la même colonne. Or l'action de recherche et de suppression de la ligne unique prend du temps.
Serait-il possible de rechercher toutes les chaines contenant Prowin.exe dans une colonne et de simplement supprimer les lignes?
En pièce jointe, vous retrouverez un échantillon de mon fichier. Je n'y ai laissé que les Office.
Que devrais-je faire pour optimiser la suppression de mes lignes afin de ne conserver que les Outlook et les Wordview. Dans les faits mon dictionnaire a plus de mot. Parfois les mots à supprimer font parti de la chaine de caractère dans les descriptions.
Je remarque que suivant mon exécution, le traitement est lent et accélère puisqu'il y a de moins en moins de ligne. Mais cela demande tout de même du temps.
Voici un échantillon de mon code:
SVP, soyez indulgent pour mon code Mais je suis évidemment ouvert aux propositions.
J'ai un bon problème devant moi.
1. J'ai une liste de tous les exe d'un parc de 1400 postes ce qui donne environ 400 000 lignes. Le tableau contient le nom de l'ordinateur, l'identifiant de la personne, le système d'exploitation, le nom du fichier, son emplacement, sa version et sa description. (voir le fichier test.xlsx).
2. Je dois épurer cette liste au maximum pour ne garder que certains exe.
Ma solution:
J'ai créé un dictionnaire dans un autre classeur et je le charge comme array avec un vba. Puis pour chaque entrée dans le dictionnaire, je fais une recherche dans la colonne appropriée et supprime la ligne. Je refais la même recherche tant que le mot existe.
Une fois que le mot n'est plus là, je prend la seconde entrée dans le dictionnaire. Actuellement, le dictionnaire a environ 300 lignes mais un même mot du dictionnaire peut apparaitre 5000 fois dans le tableau.
Mon problème:
Si par exemple, je recherche le mot Prowin.exe, ce mot apparaît à différent endroits dans mon tableau mais toujours dans la même colonne. Or l'action de recherche et de suppression de la ligne unique prend du temps.
Serait-il possible de rechercher toutes les chaines contenant Prowin.exe dans une colonne et de simplement supprimer les lignes?
En pièce jointe, vous retrouverez un échantillon de mon fichier. Je n'y ai laissé que les Office.
Que devrais-je faire pour optimiser la suppression de mes lignes afin de ne conserver que les Outlook et les Wordview. Dans les faits mon dictionnaire a plus de mot. Parfois les mots à supprimer font parti de la chaine de caractère dans les descriptions.
Je remarque que suivant mon exécution, le traitement est lent et accélère puisqu'il y a de moins en moins de ligne. Mais cela demande tout de même du temps.
Voici un échantillon de mon code:
Code:
Sub Supprimevaleurs(S_StrNomduFichier, S_StrChiffrierdestination, S_tablodesretraits, S_VFeuilDataCol4, S_VFeuilDataCol6, S_VFeuilDataCol7)
Dim LDerniereLigne As Long
Dim LDerniereColonne As Long
Dim LPosition As Long
Dim Trouve As Range
Dim PlageDeRecherche As Range
Dim Valeur_Cherchee As String
Dim AdresseTrouvee As String
Dim L_ligne As Long
'http://www.commentcamarche.net/faq/36886-vba-recherche-de-donnees-la-methode-find
Workbooks(S_StrNomduFichier).Activate
Sheets(1).Select
'On détermine les dernières lignes et colonnes du tableau
LDerniereColonne = ActiveSheet.UsedRange.Columns.Count
LDerniereLigne = Sheets(1).Cells(Application.Rows.Count, 1).End(xlUp).Row
'LDerniereLigne = Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
For LPosition = LBound(S_tablodesretraits, 1) To UBound(S_tablodesretraits, 1) 'On va passer toutes les lignes du dictionnaire
Select Case S_tablodesretraits(LPosition, 2)
Case S_VFeuilDataCol4(0) 'On fait une recherche avec le nom du fichier
Valeur_Cherchee = S_tablodesretraits(LPosition, 1) 'Valeur recherchée
Set PlageDeRecherche = ActiveSheet.Columns(4)
Call Cherche(PlageDeRecherche, S_StrNomduFichier, Valeur_Cherchee)
Case S_VFeuilDataCol6(0) 'On fait une recherche avec l'emplacement du fichier
Valeur_Cherchee = S_tablodesretraits(LPosition, 1) 'Valeur recherchée
Set PlageDeRecherche = ActiveSheet.Columns(6)
Call Cherche(PlageDeRecherche, S_StrNomduFichier, Valeur_Cherchee)
Case S_VFeuilDataCol7(0) ' On fait une recherche avec la description du fichier.
Valeur_Cherchee = S_tablodesretraits(LPosition, 1) 'Valeur recherchée
Set PlageDeRecherche = ActiveSheet.Columns(7)
Call Cherche(PlageDeRecherche, S_StrNomduFichier, Valeur_Cherchee)
End Select
Next
End Sub
'============================================
'============================================
Sub Cherche(C_PlageDeRecherche, C_StrNomduFichier, C_Valeur_Cherchee)
Set Trouve = C_PlageDeRecherche.Cells.Find(What:=C_Valeur_Cherchee, LookAt:=xlPart)
Do
If Not Trouve Is Nothing Then
Workbooks(C_StrNomduFichier).Activate
Sheets(1).Select
'http://www.commentcamarche.net/faq/18696-vba-recherche-find-avec-retour-multiple
'AdresseTrouvee = Trouve.Address
'AdresseTrouvee = Trouve.Row
L_ligne = Trouve.Row
'Rows(L_ligne & ":" & L_ligne).Select
'Range("A472526:H472526").Select
'Workbooks(S_StrNomduFichier).Sheets(1).Range("A472526:H472526").Select
Workbooks(C_StrNomduFichier).Sheets(1).Rows(L_ligne & ":" & L_ligne).Select
'Rows("1:1").Select
[B] Selection.Delete Shift:=xlUp[/B]
Set Trouve = C_PlageDeRecherche.Cells.Find(What:=C_Valeur_Cherchee, LookAt:=xlPart)
End If
Loop While Not Trouve Is Nothing 'Tant que l'on trouve des valeurs on fait la recherche
End Sub
SVP, soyez indulgent pour mon code Mais je suis évidemment ouvert aux propositions.
Pièces jointes
Dernière édition: