Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 2009
-
22 août 2006 à 11:38
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 2009
-
23 août 2006 à 12:38
Bonjour,
Je suis en train d'importer un projet excel sous VB2005 et j'ai un petit problème, je dois lire toutes mes cellules de mon classeurs de 33 feuilles. J'utilise donc une boucle lisant toutes les cellules du UsedRange de chacune. Mais il se fait que l'accès par cette méthode est incroyablement lente (de l'ordre de 3 minutes pour une feuille de 100*100 cellules environ et donc de 99 minutes pour lire mon classeur).
Connaissez-vous une autre méthode pour lire les cellules ? Style déplacement massif de mémoire des propriétés 'Formula' vers un tableau de string ?
Merci pour vos idées, elles sont toutes le bienvenues !
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 22 août 2006 à 15:03
Salut,
Pourrais-tu expliquer un peu plus ce que tu cherches à faire avec ces données ?
(Je n'y connais rien en VB2005)
En passant, UsedRange n'est pas une bonne méthode pour déterminer la plage utilisée.
Si tu as une feuille de 100*100 cellules et que tu mets la cellule
A65536 en jaune puis ensuite sans couleur ou "Undo", Excel se
souviendra de cette cellule comme faisant partie du UsedRange. Donc la
lecture sera ralentie de beaucoup. Beaucoup de personnes sélectionnent
une ligne ou une colonne complètement et mettent une couleur de fond ou
de police... mauvaise habitude... Ça fait des fichiers beaucoup trop
gros pour rien.
Il est préférable d'utiliser la fonction Find pour déterminer le nombre de colonnes et de lignes vraiment utilisées
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 22 août 2006 à 18:11
Oui je connais très bien le problème de usedrange, mais mes fichiers sont 'propres'. Lorsque tu fais l'erreur d'écrire trop loin, tu supprime les lignes/colonnes concernées, puis tu enregistre, et le UsedRange est convenable (regarder la taille du curseur des barres de défilement pour en être sûr).
Sinon entre temps, je viens de trouver une méthode :
Avant je faisais ma boucle avec :
Worksheets.UsedRange.Cells(x, y).Formula
Sans même me rendre compte que
Worksheets.UsedRange.Formula renvoie lui un array d'objet contenant toutes mes formules, je n'ai plus qu'à faire un simple conversion pour me retrouver avec mon tableau de strings...
Sinon pour t'expliquer ce que je fais avec mes données est assez simple :
Mon père est électro-acoustitien et fait des études assez poussées sur la disposition optimale de bafles dans divers milieux (notemment dans les églises). Pour faire ses calculs, il a créé un énorme classeur excel qui reprend un peu tout. Il a également fait une macro faisant varier des paramètres, puis il calcul, récupère un 'Quota de qualité' selon les paramètres, puis continue, jusqu'à trouver le meilleur quota...
Le problème est qu'excel est incroyablement lent pour les calculs, je me suis donc proposé pour simuler le calcul d'excel sous vb2005. J'interprète donc toutes les formules de son classeur. Pour le moment les tests sont assez bon, j'arrive à 70 fois plus vite qu'excel dans les conditions optimums et 9 fois plus vite dans les pires conditions...
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 23 août 2006 à 10:55
Salut,
Pour faire gagner du temps d'exécution, avant le traitement des données :
xlApp.ScreenUpdating = False ' *** pense à le remettre à True à la fin du traitement
Cela sert à figer le défilement de la fenêtre, les sélections de feuilles et cellules et l'écriture. Bref, le rafraîchissement ne se fait pas.
Le fait de le repasser à True à la fin, tes données s'afficheront. Tu auras gagnés de quelques milisecondes à quelques secondes, selon la taille du traitement & du fichier !
@++
<hr size="2" width="100%" />
--Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--