Optimisation du code (vitesse)

Bonjour,

je suis en train de créer une interface permettant de consulter une liste de commande.

Celle-ci possèdera des champs pour filtrer et trier.

Cependant je me heurte à un problème, j'aimerai savoir quelle serait la manière optimal pour filtrer (par exemple selon le nom du fournisseur). Je sais le faire mais je pense qu'il existe une manière plus rapide et mieux optimiser que vous seulement avez le secret .

Ci-joint le code pour importer les données et récupérer la liste de fournisseur et d'acheteur.

Private Sub UserForm_initialize()

    Application.ScreenUpdating = False
    Set wbk1 = Workbooks.Open("lechemin")

    dataSrc = wbk1.Sheets(1).UsedRange.Offset(2).Resize(wbk1.Sheets(1).UsedRange.Rows.Count - 2) 'Pour retirer l'en-tête

    Set listeAcheteur = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(dataSrc) 'Liste des acheteurs pour la combobox de tri selon nom du fournisseur
        cell = dataSrc(i, 28)
        listeAcheteur(cell) = ""
        acht.List = listeAcheteur.Keys
    Next i

    wbk1.Close
    ListBox1.Clear 'On vide la liste

    'Paramètrage des colonnes de la listbox
    ListBox1.ColumnCount = 10
    ListBox1.ColumnWidths = "100;50;50;50;70;50;90;50;50;50"

    'Ajoute des données dans les colonnes de droite
    For i = 2 To UBound(dataSrc) 'Boucle sur le nb de ligne a ajouté
        ListBox1.AddItem    'ajout dans la list d'un item

        For j = 0 To ListBox1.ColumnCount - 1 'Boucle sur le nombre de colonne
            ListBox1.List(ListBox1.ListCount - 1, j) = dataSrc(i, j + 1) 'Ajout d'une valeur
        Next j

    Next i

    Set listeFNR = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(dataSrc) 'Liste des fournisseurs
        cell = dataSrc(i, 1)
        listeFNR(cell) = ""
        fnr.List = listeFNR.Keys
    Next i

End Sub

Pour simplifier , existe t'il une fonction ou autre pour trier/filtrer un tableau tel que dataSrc ?

Est-ce possible de faire une importation plus rapide des données ? L'userform prend déjà quelque seconde à s'ouvrir alors que je n'ai pas importé la moitié des données pourtant j'ai bien stocké dans un tableau pour ajouter les données dans la listbox

Toute aide est le bienvenue !

Merci pour votre temps !

Bonjour,

YAPA de déclarations dans ton truc ?

ça serait bien qu'on aie tout le saucisson et pas seulement une rondelle de code...

Déjà tu as zappé pas mal de chose et puis tu as mis un peu la charrue avant les boeufs :

Ça sent le silkyroad mal digéré :

acht.List = listeAcheteur.Keys 'nà rien à faire dans ta boucle For

de même :

fnr.List = listeFNR.Keys 'nà rien à faire dans ta boucle For

C'est deux instructions sont les dernières à injecter (une fois tout trié...)

On a besoin que d'un UserForm en ordre de marche et de wbk1.

Il faut nous fournir également un specimen du wbk1

Bricole le un petit peu pour qu'il reste anonyme et met nous tout le bébé

Tu remplaces la ligne d'en-tête par une rangée équivalente de toto,titi,tata,riri,fifi...

Tu remplaces tous les 1 ou tous les 3 par des 5 par exemple et toutes les voyelles par des "e" et ton wbk1 y sera anonyme...

A+

Important ; identifier en rouge les 10 colonnes qui doivent entrer dans le ListBox

Bonjour,

tout d'abord merci pour les conseils et prendre le temps de me répondre . La plus part de mon code est issu de morceau que j'ai récupéré à droite à gauche en adaptant à mes besoins. Pas étonnant qu'il y est des problèmes de conceptions.

Et non il n'y a pas de déclaration, je sais c'est pas bien

Ci-joint mon userform et BDD.

9data.xlsm (18.77 Ko)
8interface.xlsm (24.82 Ko)

Bonjour,

A lire avec attention...

J'ai passé un petit moment sur ton classeur malheureusement il ne m'est pas d'une grande utilité : Les Données de DATA sont incompréhensibles : On ne sait pas trop ou sont les commandes, les fournisseurs, les divers champs...

D'ailleurs dans le code tu fais référence à la colonne 28 qui semblerait être la colonne acheteur, mais celle-cj n'est pas colorée en rouge dans les DATAS.

J'ai quand même remis un peu d'ordre dans TOUSSA. mais j'ai tout renommé à ma main c'est du codage standard tes noms de contrôle et de variable sont trop exotiques pour permettre de s'y retrouver facilement.

=> De plus il y a une ligne 3 dans DATA qui mériterait d'être supprimée... Basta !

Bon le UserForm marche (enfin les combos...) pour le reste je ne vois pas trop ou tu veux en venir avec ton histoire de tri/filtre.

Et surtout avec les évènement Change (pour ne pas parler de la macro DataChange en préparation.)

=> Pourquoi cette interface n'est-elle pas directement dans le DATA.xlsm ???

Mais surtout tu devrais supprimer la ListBox1 et la remplacer par un Listview me semble-t-il plus approprié pour ce que tu veux faire.

Je te joins tes 2 fichiers en retour pour que tu voies un peu les modifs que j'ai apporté afin de les rendre un peu compréhensible. Mais il reste encore beaucoup à faire. Je pense que tu sous-estimes beaucoup l'étendue du travail que représente un tel UserForm.

Je te joins également un vieux classeur qui fonctionne un peu sur le même type de ce que tu cherches à faire.

Pour voir un peu le fonctionnement du Listview Cliquer sur Gestion Client.

En cliquant sur l'en-tête des colonnes du Listview on voit que ça te trie les enregistrement sur la colonne choisie.

En double cliquant sur une des lignes du Listview on voit apparaitre une fiche client et la liste des commandes.

En double cliquant sur une des commandes de ce client on voit apparaitre le détail de cette commande...

C'est un peu pareil avec Gestion Commandes...

Bon si tu veux voir le détail de TOUSSA et le VBA YAKA cliquer dans le formulaire d'accueil sur le mot Accueil.

Hum... tu comprendras que c'est un travail considérable ! Et qui ne peut se faire avec un petit exemple de données bidon et un codage du style usine à gaz et sans déclarations...

Ayant vu ce dernier classeur tu comprendras également que tu ne peux trier/filtrer sans une gestion rigoureuse des Index, iD, et N° de lignes. TOUSSA doit être mené avec une grande cohérence et en particulier avec un index dans la première colonne de ta base de donnée. Qu'il soit visible ou pas est un autre problème, mais aucune base de donnée digne de ce nom n'y échappe...

Donc si tu veux continuer sur ta lancée, libre à toi moi je suis disponible, mais prière de fournir une BD/DATA plus cohérente le type de donnée doit être identifiable, le format également et on doit savoir du premier coup d'oeil quel est la colonne Commande, Date, Fournisseurs et autres sans être obligé de pleurer à chaque fois le renseignement indispensable...

A+

15data.xlsm (16.88 Ko)
21interface.xlsm (21.93 Ko)

Bonjour,

Je suis désolé pour le fichier DATA qui avec du recul me parait "bidon".

Concernant le fait que la BDD soit séparé de l'interface vient de ma hiérarchie (je suis en stage).

L'idée de la listview m'était venu, il y a longtemps mais je ne l'avais pas trouvé la boite d'outils, j'avais donc abandonné. Grâce à ton message j'ai donc rechercher une nouvelle fois et j'ai réussi à ajouter (trop?) simplement la listview à la boite à outils.

J'ai déjà réalisé une interface similaire cependant celle-ci gérait beaucoup moins de donnée 500max. Le seul "problème" pour moi est le temps d’exécution pour certaine macro dû à la quantité de données (20 000min.).

De plus je ne suis pas trop dans l'optique de demander à quelqu'un d'autre de faire mon travail, ce que je recherche plutôt c'est des conseils. J'ai tendance à penser qu'un forum n'est pas un site d'appel d'offre comme je le constate parfois ...

Au final, j'aimerai savoir quelles sont tes "astuces" pour traiter une quantité de donnée importante ? (Par exemple l'astuce de traiter les données dans un tableau et non directement dans la listbox que j'avais découvert sur ce forum il y a 1 ou 2 mois.)

Je préfère le faire moi-même afin de progresser plus rapidement (je suis avant tout en stage pour apprendre ).

J'aurai du commencer par ça, je te remercie pour ta ferveur vis à vis de mes fichiers, témoins de ton investissement

Cordialement.

Bonsoir,

Array, Dico, Combo TOUSSA est très suffisant : De toute façon un Combo (ou ListBox) de plus de 20 éléments devient très vite ingérable sauf à l'utiliser comme dans Google : On entre les premières lettre et ça filtre directement les entrées. Tu en trouveras des exemples chez JB (voir à la fin)

Sinon les Méthodes AddItem et List sont très suffisantes pour nourrir tes combos. Si ton usf n'est pas instantané à charger c'est qu'il y a un lézard qui se prélasse quelque part dans ton initialisation. Je peux pas plus préciser... YFO demander au cas par cas : Même si tu aimes faire par toi même ça n'empêche pas de demander l'analyse des vieux routiers... D'ailleurs très souvent en essayant de formuler la question ça amène très souvent sur la piste de la réponse...

Pour Filtrer des données rien de tel que d'utiliser le filtre automatique d'Excel.

Pour trier des données c'est pareil... Cependant il existe des algo très rapide. Tu en trouveras de nombreux exemples chez JB à la rubrique Tri et Dictionnary... Ce site doit devenir ta référence de base !

A+

re,

je te rassure il l'est déjà !

Merci pour les infos, cependant je ne comprend pas trop cette partie

Pour Filtrer des données rien de tel que d'utiliser le filtre automatique d'Excel.

Il est possible d'utiliser les filtres auto excel sur une listbox ? Comment ?

Cordialement

Bonjour,

Non, non mais à l'occase quand c'est possible tu peux déjà partir sur une base filtrée.

Il y a aussi les List/Combo en cascade, toussa demande à être pensé. Difficile d'être plus précis quand on n'est pas complètement dans le jus. mébon... TOUSSA s'improvise pas ! Un UserForm professionel ça à quand même une certaine complexité...

A+

Ok merci ! Je vais essayer de manipuler un peu les listviews pour en dégager les avantages et désavantages. Merci beaucoup pour ton aide !

Rechercher des sujets similaires à "optimisation code vitesse"