Optimisation du temps d'éxécution

Bonjour,

commencons par présenter le projet. Le but est de comparer des listes de contacts à une grosse base de données.

projet détaillé (pour les plus motivés)

Je prépare pour mon entreprise une grosse base de données(bdd) qui regroupe tous les contacts (tableau excel classique). Le VBA permet l'ajout de contacts à cette liste et de tester la présence de contacts. L’utilisateur ajoute sa liste de contacts qu'il souhaite ajouter (par copier coller de son tableau) dans une feuille "contacts à ajouter" et voila ce que fait mon code :

1°)compare les contacts à ajouter à la base de données existante(comparaison par email)

2°)ajoute automatiquement tous les nouveaux contacts

3°)au premier contact qui est déjà dans la base de données, un userform apparait pour demander à l'utilisateur s'il veut l'ajouter quand même (et s'il veut faire cela pour tous les autres contacts en doublons de son fichier). Il peut être intéressant d'avoir des emails en double car on peut etre en contact avec une même personne dans des contextes différents (un chef d'entreprise qui est également responsable d'une association par exemple)

4°)la base de données est mise à jour et l'utilisateur récupère un fichier excel avec 3 feuilles

  • son fichier de base
  • liste de ses contacts deja présents dans la bdd
  • liste des nouveaux contacts

Tout fonctionne très bien, mais le processus est trop long !(1000 contacts à ajouter - 5min).

Je sais que excel n'est pas un gestionnaire de base de données mais il n'y a qu'un seul ordinateur avec Access dans l'entreprise donc je n'ai pas trop le choix sur le logiciel.

Pour info, la base de données est un tableau de 50.000 lignes avec 6 colonnes.

Comment accélérer la procédure ?

procédure détaillée

Pour chaque ligne, je fait une recherchev (dans une cellule cachée du tableau) de l'adresse email à ajouter dans la bdd et en fonction du résultat :

  • email non présent dans la bdd, on l'ajoute directement
  • email présent : on charge dans un userform depuis la bdd les infos associées a cet email et l'utilisateur choisi si il l'ajoute ou non (avec une option pour appliquer son choix à tous les autres doublons)
les ajouts se font cellules par cellules d'une feuille sur une autre.

puis une simple exportation du résultat vers un nouveau classeur

J'ai quelques idées mais avant de tout changer (apres tout ca fonctionne et c'est deja beau !) j'aimerai votre avis. Voici mes pistes de réflexions :

  • faire des copiers/collers de plage de cellules au lieux de recuperer des valeurs par cellules
  • faire la fonction recherchev (vlookup) en vba plutot que dans une celulle cachée du classeur
  • verouiller l'affichage (des fois que l'affichage en live pendant l'execution ralentisse le processus)
  • c'est impossible, il y a trop de vérifications à faire pour que ce soit rapide

Qu'en pensez-vous ?

Mon ordinateur a 8go de ram et un quadcore i7 donc la puissance de calcul est la.

merci d'avance,

Simon

Bonjour Simon et bienvenue sur le forum,

Afin de répondre plus facilement à ta problématique, il serait pratique de nous diffuser un fichier exemple (en enlevant toutes les données confidentielles) mais où les macros sont présentes. Là on pourra te dire ce qui pourra être amélioré.

Mais à première vue, je te répondrai :

  • - selon la configuration de ton fichier, un copier/coller pourrait ralentir ou inversement le travail de la macro ;
      utiliser la fonction vlookup directement en vba pourrait certainement être bien pour alléger ton fichier, à confirmer ;
    • je n'ai pas trop compris l'idée de verrouiller l'affichage, faut que je vois ton code VBA.

A très vite

Sha'

Bonjour à tous

Une autre idée : quand on doit travailler sur de grosses bases de données, on a intérêt à les charger d'entrée dans des variables tableaux, (variables à plusieurs dimensions);

Cela peut se faire en quelques instructions en chargeant la plage, quelle que soit sa taille,dans la variable.

On fait alors toutes les manipulations et tous les calculs à travers ce type de variables.

C'est un peu plus délicat mais tellement plus rapide.

Surtout que l'on peut , à la fin afficher d'un coup tout le contenu d'une variable dans une plage de feuille de calcul.

La vitesse de calcul est impressionnante.

Bye !

merci pour vos réponses rapide

Je joins le fichier simplifié (uniquement le code concerné) et avec une fausse base de données.

Je vais essayer de mettre ma bdd dans un tableau de variable et comparer

PS : j'ai essentiellement appris le VBA par moi même, en cherchant précisant ce dont j'avais besoin donc mon code n'est peut etre pas tres bien organisé, si vous avez besoin d'explication demandez et je répondrai aussi vite que possible

41megabase-clean.xlsm (232.31 Ko)

Bonjour,

un début ici:

137megabase-clean.xlsm (224.00 Ko)

merci pour vos retours

je n'ai pas tout a fait fini les modifs mais je vois deja le resultat ! 2,5X plus rapide

Vous etes géniaux

j'ai fait les changements proposés (charger la bdd dans un tableau et faire la recherchev en vba)et pour le meme traitement de données je passe de 300s à 12s donc 25X plus rapide

et quand il n'y a aucun doublon (le programme s’exécute tout seul, pas besoin d'une validation manuelle par l'utilisateur) je passe de 300s à ... 2s, 150x plus rapide

merci et a bientot

Rechercher des sujets similaires à "optimisation temps execution"