Optimisation du temps d'écriture dans cellules

BremyHH

XLDnaute Nouveau
Bonjour,

Voila je vous explique mon problème.

L'objectif de mon programme est de récuperer des données provenant d'un source-mètre (Stockées dans la variable "mesure", qui est une chaine de caractères (chaine envoyée par l'appareil) comportant les coordonnées de chaque point (chaque valeur courant-tension est stockée sur 28 Octects (14 pour chaque parametre)).

Le petit programme que j'ai créé permet de découper cette chaine de caracteres, et d'écrire les valeurs de chaque parametre dans 2 colonnes distinctes (Colonne C les valeurs en tension et colonne D les valeurs en courant). Tout cela dans le but de comparer les valeurs fournies par mon source-mètre, avec d'autres valeurs de références et ainsi gérer un graphique comparant la courbe de référence et la courbe de points récupérée.

Mon soucis se situe au niveau du temps de découpage de la chaine de caractères. Pour découper cette chaine comportant 101 points (et donc 202 valeurs), et écrire chaque valeur dans les colonnes correspondantes
mon programme met environ 6sec (sachant que je dois comparer environ 128 courbes.. cela prends vraiment trop de temps)

Ma question est donc: Ya t il un moyen d'optimiser mon découpage, ou mon écriture dans mon tableur, afin de gagner du temps ? Ou alors, existe t il un moyen de comparer ma chaine de carractères et mes données stockées dans les colonnes A et B de mon tableur, sans avoir à découper et écrire chaque valeur de ma chaine dans les colonnes C et D de mon tableur ?

Voici la partie du programme qui réalise le découpage, et l'écriture:


'Set the volts and current values in the tables

For i = 1 To Len(mesure) Step 28

If ((Mid(mesure, i, 1) = "-") Or (Mid(mesure, i, 1) = "+")) Then
VOLT(j) = Mid(mesure, i, 13)
CURR(j) = Mid(mesure, (i + 14), 13)

Range("Sheet1!C2").Select

ActiveCell.Offset(j + 1, 0).value = VOLT(j) 'Mid(mesure, i, 13)
ActiveCell.Offset(j + 1, 1).value = CURR(j) ' Mid(mesure, i + 14, 13)
j = j + 1
End If

Next i
 

francedemo

XLDnaute Occasionnel
Re : Optimisation du temps d'écriture dans cellules

bonjour,
à priori, je répondrai "oui", il y a moyen d'aller plus vite en passant par un tableau
déjà :
tes mesure sont séparée par "-" ou par "+" ?
tu peux utiliser la fonction "split" qui va te découper les info de la cellule
ensuite, tu passes par un tableau (qui se rempli en mémoire vive) puis tu colles le tableau au bon endroit
à+
 

BremyHH

XLDnaute Nouveau
Re : Optimisation du temps d'écriture dans cellules

Tout d'abord merci pour ta réponse.

La chaine de carractères que je récupère est séparé par des ';' exemple: mesure="+5,000000E+11;+4.900000E+11; .... etc"

Je ne connaissais pas la fonction Split. Je viens de me renseigner rapidement dessus, et donc aparament, cette fonction permet de séparer une chaîne de caractère en utilisant un séparateur qui se répète dans la chaîne, donc par exemple dans mon cas le ';' et de stocker chaque partie de cette chaîne dans un tableau ?
 
Dernière édition:

francedemo

XLDnaute Occasionnel
Re : Optimisation du temps d'écriture dans cellules

oui, c'est ça
tu peux mettre par exemple:
mes = split(mesure,";")
tu récupères:
mes(0) = ...(1ère mesure)
mes(1) = ...(2ème mesure)
et ainsi de suite

donc après, tu crées un tableau
dim Tablo as Variant
...
redim tablo(0 to [A65536].End(xlUp).Row, 0 to 1)
for i= 0 to [A65536].End(xlUp).Row
tablo(i,0)=mes(0)
tablo(i,1)=mes(1)
next i
range("C2:D" & ubound(tablo))=tablo

à essayer mais ça devrait pas être loin de la vérité...
à+
 

BremyHH

XLDnaute Nouveau
Re : Optimisation du temps d'écriture dans cellules

Hmm, j'ai essayé en executant un code semblable au tiens, j'obtiens une erreur lors de la compilation "can't assign to array" au niveau de la ligne de code 'mes = split(mesure,";")'.

Normalement, c'est lié a un conflit de type .. J'ai beau esssayer avec un tableau mes(500) as variant, ou meme en modifiant ta ligne de code par mes() = split(mesure,";") comme j'ai pu le voir sur d'autres exemple sur internet, l'erreur persiste. J'ai du mal a comprendre pourquoi.

Et sinon au niveau de la répartision des valeur du tableau mes, vers le tableau tablo, la syntaxe suivant serait elle correcte ?
Afin de bien avoir les valeurs de tension dans la premiere colonne et les valeurs de courrant dans la deuxieme

volt=2*i
curr=2*i +1
tablo(i,0)=mes(volt)
tablo(i,1)=mes(curr)
 

francedemo

XLDnaute Occasionnel
Re : Optimisation du temps d'écriture dans cellules

essaye avec :
mes as Variant
puis
mes = Split(mesure; ";")
chez moi, ça passe
regarde les résultats dans la fenetre vba "variables locales"
tu peux aussi intégrer quelque part:
debug.print mes(0)
debug.print mes(1)

pour l'écriture, je ne comprends pas ce que tu veux faire avec 2*i...
je reste sur:
for i= 0 to [A65536].End(xlUp).Row
tablo(i,0)=mes(0) '===Volt
tablo(i,1)=mes(1) '===Courant
next i
range("C2:D" & ubound(tablo))=tablo '===du coup les volts seront en C et les courants en D) à adapter
 

mécano41

XLDnaute Accro
Re : Optimisation du temps d'écriture dans cellules

Bonjour,

J'ai probablement raté quelque chose mais je suppose que tes données sont dans un fichier texte qui comporte X lignes, chaque ligne comportant Y valeurs séparées par des ";". Pourquoi dans ce cas ne pas utiliser Fichier/importer en indiquant le type de séparateur. Excel se chargerait de te mettre tes données sous forme de X lignes de Y colonnes dans une feuille...mais comme je l'ai dit, je n'ai peut-être pas compris...

Cordialement
 

BremyHH

XLDnaute Nouveau
Re : Optimisation du temps d'écriture dans cellules

Ok merci. Le problème d'erreur de compilation semble résolu. Sinon, par rapport au 2*i, si je laisse le code comme il est, avec la boucle

for i= 0 to [A65536].End(xlUp).Row
tablo(i,0)=mes(0) '===Volt
tablo(i,1)=mes(1) '===Courant
next i

J'obtiens les valeurs tablo(0,0)=mes(0)=tablo(1,0)=tablo(2,0) etc...

J'ai loupé quelque chose dans le raisonement de ton programme peu etre ?
 

BremyHH

XLDnaute Nouveau
Re : Optimisation du temps d'écriture dans cellules

Bonjour,

J'ai probablement raté quelque chose mais je suppose que tes données sont dans un fichier texte qui comporte X lignes, chaque ligne comportant Y valeurs séparées par des ";". Pourquoi dans ce cas ne pas utiliser Fichier/importer en indiquant le type de séparateur. Excel se chargerait de te mettre tes données sous forme de X lignes de Y colonnes dans une feuille...mais comme je l'ai dit, je n'ai peut-être pas compris...

Cordialement

En fait, je m'étais trompé lors de la saisit de ma réponse. Le séparateur de la chaîne est "," et non un ";". Et les données qui me servent de références sont elles stockés sur mon fichier Exel, sur 2 colonnes distinctes
 

francedemo

XLDnaute Occasionnel
Re : Optimisation du temps d'écriture dans cellules

dim Tablo as Variant => déclare un tableau
...
redim tablo(0 to [A65536].End(xlUp).Row, 0 to 1) => redéclare le tableau en 2 dimensions
si tu fais "F8" pour ton prog en pas à pas, à un moment tu as "mes" qui passe à "mes()" dans la fenêtre variable locale, c'est au moment où Excel rempli ton tableau "mes" avec les valeurs de "Split" et tu devrais avoir:
mes(0) = 1ère valeur (ta valeur en volt)
mes(1) = 2ème valeur (ta valeur en courant)

ensuite dans la boucle, tu remplis le "tablo"

puis tu te positionnes sur la première cellule à remplir, tu lui donnes la dimension du range à remplir, et tu colles le tablo

sinon envoi un bout de fichier sans données confidentielles...
 

BremyHH

XLDnaute Nouveau
Re : Optimisation du temps d'écriture dans cellules

Merci pour vos informations précieux, ca marche comme il faut. Et bien plus rapidement. Mon dernier petit soucis (et oui, je sais qu'il y a en a toujours un :)) est un problème de longueur de chaîne consernant la derniere valeur.. Si ne n'impose pas une longueur de chaîne dans la définition de ma chaine 'mesure'.. ex: dim mesure as string *2828 (101*28), j'obtiens un bug de mon programme lors du "remplissage" de la chaine de charactères "mesures".

Sauf qu'en imposant un nombre de charactères tel que 2828, qui est légèrement supérieur au nombre réel de charactères envoyé par mon source-metre, j'obtiens en dernière valeur de mon tableau mes(201), une donnée composé de chiffres, et de 'blancs', générant un complit de type lorsque je compare cette 'valeur' de courant avec une autre valeur de courant de mon tableur principal
 

BremyHH

XLDnaute Nouveau
Re : Optimisation du temps d'écriture dans cellules

Dernier petit problème résolu ! L'erreur de débutant, j'ai vu dans la fenetre des variables locale qu'il n'y avait qu'un espace vide en trop a la fin de ma valeur mes(201), j'ai donc remplacé dim mesure as string *2828 par 2827, et ca résout le problème :) !

Merci encore pour votre aide précieuse, bonne fin de journée ;)
 

Discussions similaires

Statistiques des forums

Discussions
312 273
Messages
2 086 699
Membres
103 372
dernier inscrit
BibiCh