Range

Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 - 22 août 2006 à 11:38
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Derniè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 !

Julien.

4 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
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

Ma méthode:

nbLignes = Cells.Find("*", Range("A1"),,,xlByrows,xlPrevious).Row

nbColonnes = Cells.Find("*",Range("A1"),,,xlByColumns,xlPrevious).Column


Il y a aussi le possibilité de tout mettre cette plage dans le presse-papier Windows en passant par le DataObject. Voir l'aide.


En espérant que ça puisse t'aider un peu.

MPi
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
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...
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
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"
<!--
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
23 août 2006 à 12:38
Oui j'ai déjà utilisé aussi merci !
0
Rejoignez-nous