Pb de lecture de valeur décimale avec Excel

amalcon Messages postés 12 Date d'inscription vendredi 22 octobre 2004 Statut Membre Dernière intervention 8 février 2007 - 1 sept. 2006 à 16:47
amalcon Messages postés 12 Date d'inscription vendredi 22 octobre 2004 Statut Membre Dernière intervention 8 février 2007 - 14 sept. 2006 à 18:10
Bonjour,

J'ai un problème que je trouve un peu bizzare.
Via VC++ (et des MFC), je pilote excel et j'arrive à faire quasiment tout ce que je veux (grace à plusieurs codes de ce site  ), sauf lire une valeur décimale??
En clair, quand une cellule excel contient du texte ou un entier tout va bien, mais dès qu'il s'agit d'un nombre décimal, j'ai un gros plantus.
J'ai essayé de modifier le séparateur décimal, de transformer le format de cellule (en scientifique, texte), mais rien n'y fait. J'ai voulu sauvegarder le fichier au format texte pour le lire simplement, mais le séparateur étant la tabulation, je ne peux pas m'en servir (des tabulations peuvent être présentent dans les cellules et empecher de récupérer correctement les données).
Après 2 jours de galère, je ne trouve pas de solution, ce qui est d'autant plus frustrant que cela doit pas être sorcier de récuperer ce type de donnée (c'est quand même la base d'excel ! ).
Pour info, je mets un petit bout de mon code (pas forcément optimisé, mais qui marche très bien pour le reste), ca peut toujours vous indiquer ce qui plante :



1) // Après les définitions qui vont bien
2) workbook=excel->Workbooks->Open((LPCTSTR)nom_fichier);
3) worksheet=excel->ActiveSheet;
4) VARIANT  lu=worksheet_TP->Range[_com_util::ConvertStringToBSTR(s)]->Value;
5) BSTR my_bstr = lu.bstrVal; 
6) CStringArray string.SetAt(0,_com_util::ConvertBSTRToString(my_bstr));



Dans le cas où la valeur à lire est un entier, la ligne 5 est remplacée par
"int n_int=(int)lu.dblVal;"
C'est la ligne 4 qui plante. Ca me donne la fameuse fenêtre "La mémoire ne peut pas être read".
J'ai essayé de changer Value par tout ce que j'ai pu trouver (value2, text, ...) Cela continue de planter.

Désolé pour le post un peu long, mais je ne veux rien oublier.

Si quelqu'un à la solution à mon problème, merci infiniment .

4 réponses

meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007
4 sept. 2006 à 11:49
Salut,

Bon, je n'ai pas d'Excel sous la main donc je ne peux pas faire de test.
Ceci étant, je te propose de vérifier, avant l'appel de la ligne 4, si toutes les variables sont différentes de NULL :


- worksheet_TP
-


worksheet_TP->Range[_com_util::ConvertStringToBSTR(s)]
-


worksheet_TP->Range[_com_util::ConvertStringToBSTR(s)]->Value

Ciao.
0
amalcon Messages postés 12 Date d'inscription vendredi 22 octobre 2004 Statut Membre Dernière intervention 8 février 2007
4 sept. 2006 à 13:39
Salut,


En fait, je fais une boucle sur toutes mes lignes de mon fichier excel et sur le nombre de colonne contenant des données. Ca plante au niveau de la cellule contenant une valeur décimale (ligne 28 dans le fichier excel), sachant que pour les lignes précédentes, il n'y avait pas de pb. Je ne pense donc pas que se soit un pb de variable à NULL.
Toutefois, j'ai essayé de rajouter une vérif, mais le code ne compile pas :
      if((worksheet_TP -> Range[_com_util::ConvertStringToBSTR(s)] -> Value)==NULL)
       MessageBox("Null",NULL,MB_OK);
      else
       lu = worksheet_TP -> Range[_com_util::ConvertStringToBSTR(s)] -> Value;
Ca me renvoie l'erreur :" error C2666: '==' : 9 overloads have similar conversions". C'est dommage, s'il faut dans ce cas ca renvoie NULL et du coup, je peux éviter à mon interface de planter (et pour ces valeurs, trouver une autre solution)...

Merci quand même.
0
aldoniel Messages postés 13 Date d'inscription vendredi 8 septembre 2006 Statut Membre Dernière intervention 8 février 2007
9 sept. 2006 à 00:30
Si au pire ça veut toujours pas marcher, tu peux faire exporter ton fichier excel au format CSV.
Les séparateurs c'est le ; et "

ex :
"A1";"B1"
"A2";"B2"
Quand une cellule contient ", on le note ""
Une cellule peut contenir un saut (\n) qui dans le fichier CSV est noté (\n) et pas (\r\n) comme dans du texte.

Bon, c'est un palliatif bourrin (je quitte à peine le C)
0
amalcon Messages postés 12 Date d'inscription vendredi 22 octobre 2004 Statut Membre Dernière intervention 8 février 2007
14 sept. 2006 à 18:10
Je viens donner quelques nouvelles : pas de solutions à mon problème surnaturel .

Enfin, merci à toi aldoniel pour ton idée de csv. J'ai pu grace à ca faire un code plus que bourrin, mais qui lit enfin ces p.... des données. Je pensais au début que j'aurais le même problème que pour les fichiers textes (les espaces et autres sont autorisés dans les celulles), mais finalement, j'ai pu m'en sortir. Comme je connaissais le nombre de colonne (et donc de ; ) et que la derniere colonne est un VRAI/FAUX, j'y suis enfin arrivée.
Bon, manque plus qu'a tenir compte des éventuels ; et " qui peuvent être dans les cellules et c'est bon (ca va être chiant quand même).
J'en aurai perdu du temps sur ce truc con.

Pour info, il y en a qui ont essayé de reproduire mon problème? pour savoir si c'est mes fichiers, mon appli, mon code, je ne sais quoi, qui sont pourris (ou si une force obscure jusque là inconnue c'est manifesté) ?

Enfin, merci à tous ceux qui m'ont répondu .
0
Rejoignez-nous