Accélération écriture dans tableur

Bonjour,

je profite du confinement pour essayer d'améliorer les performances d'un logiciel de planification d'activités.

Dans mon application, j'enregistre les données de planification dans une feuille sous forme codée dans une chaine de caractères qui peut contenir jusqu'à 5 activités différentes sur une journée pour un employé.

Pour générer la table permettant la création de TDC, je décode toutes ces informations et les enregistre dans une feuille du tableur

Le décodage avec le code "SPLIT (Chaine,"|")" est très rapide, par contre l'écriture des info décodées dans la table est lente même lorsque la mise à jour d'écran et la détection d'évènements et le calcul auto sont désactivés.

Existe-t-il une commande permettant d'écrire en un seul bloc dans un tableau une variable matricielle type nArt(500,6), 500 lignes max, 6 info par ligne sans passer par une boucle?

Merci par avance pour votre aide.

Cdt

JMV

bonjour,

tu peux utiliser ceci

range("A1").resize(500,6)=nart

écrire le contenu de la matrice nart à partir de la cellule A1 sur 500 lignes et 6 colonnes.

nart doit être dimensionné ainsi

dim nart(1 to 500, 1 to 6)

ou avec

option base 1

Bonjour,

Plus génériquement (quelles que soient les 2 dimensions du tableau) :

Range("CelluleCible").Resize(UBound(nArt) + 1 - LBound(nArt), UBound(nArt, 2) + 1 - LBound(nArt)) = nArt

Merci pour vos réponses rapides.

Je vais essayer et vous tiens au courant.

cdt,

JMV

J'ai fait un essai rapide. la formule avec Ubound et Lbound fonctionne à merveille.

Pour créer la table de 4700 lignes il faut moins d'une minute alors qu’auparavant, des boucles "do while - Loop" imbriquées, il fallait plus de 10 minutes.

Dans ma version précédente, j'avais dimensionné arbitrairement la variable nART à (500,9) au maximum. Lors de l'écriture dans la table, je détectais le premier enregistrement nART(x,0) vide et je passais à la colonne suivante après avoir redimensionné nART.

Avec l'écriture en bloc, j'ai un petit souci: Je connais le nombre d'info à inscrire par ligne, il est constant, en fait c'est 10.

Par contre, je connais seulement le nombre maximum de lignes à traiter pour chaque colonne, mais chaque ligne peut comporter plusieurs info de planning, maximum 5. Donc une ligne codée peut entrainer la création de 1 à 5 lignes. J'ai dimensionné arbitrairement à 500 maximum, sachant qu'au maximum j'ai 221 jours à traiter.

Est-ce qu'il est possible de redimensionner dynamiquement la variable lorsqu'elle est remplie d'info pour ajuster sa taille en fonction du besoin et éviter l''ajout de ligne vides?

Merci pour votre aide,

Cdt,

JM

Bonjour,

si tu as n lignes et 10 colonnes dans ta matrice(500,9) avec n<500

range("A1").resize(n,10)=nart

Bonjour,

qu'on ait une vision globale sans à avoir à poser x questions

eric

Re,

Si tu cherches la dernière ligne d'un tableau qui a plusieurs colonnes de longueurs différentes :

Dim nArt()
drL = Worksheets(1).Cells.Find("*", , , , xlByRows, xlPrevious).Row
Redim nArt(0 to drL-1,0 to 9)
'ou
Redim nArt(1 to drL,1 to 10)

Merci pour vos réponses.

Mon fichier fait environ 4Mo, c'est une application professionnelle. Je ne peux pas le joindre.

En fait, pour supprimer les enregistrements vides de nART500,9) il faudrait pouvoir redimensionner cette variable ) une fois qu'elle a été remplie sans effacer les info des lignes non vides. Je ne pense pas que ce soit possible.

J'ai trouvé une solution très simple.

Les blocs de 500 lignes sont rajoutés dans une table.

J'ai mis un Compteur donnant le nombre de lignes de la table contenant des informations. Ce compteur est mis ajour après chaque ajout de nART(500,9)

Pour l'enregistrement de chaque bloc, je positionne le curseur sur la première ligne vide, Compteur+1, et copie le prochain bloc de 500 à partir de cette cellule.

Pour le dernier bloc, j'ai rajouté la ligne :

Range("A6:A65000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

cette ligne supprime toutes les lignes vides de la table provenant du dernier bloc de données enregistrées.

Le résultat est impressionnant, il faut 13 secondes pour créer une table de 4852 lignes avec 10 cellules par ligne.

Je vais passer le sujet à clos.

Merci pour votre aide,

Cordialement

JMV

Tout le monde est capable de faire un fichier de travail qui respecte la structure de l'original, avec 10 lignes de données bidons.

eric

Rechercher des sujets similaires à "acceleration ecriture tableur"