IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

[excel] parcours et récupération des cellules [FAQ]


Sujet :

API, COM et SDKs Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 34
    Points
    34
    Par défaut [excel] parcours et récupération des cellules
    Bonjour,
    J'ai un petit pb pour lire les valeurs dans les cellules quand ce sont des nombres et non des String, Voici un bout de mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while MaFeuille.Cells.Item[i,j].Value<>'' do 
          begin
            ShowMessage(MaFeuille.Cells.Item[i,j].Value);
          i:=i+1;
          end;
    J'ai même essayé avec ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ShowMessage(FloatToStr(MaFeuille.Cells.Item[i,j].Value));
    Mais il me met tjrs la même erreur : Could not convert variant of type (string) into type (Double)

    D'où vient l'erreur ??? Merci

  2. #2
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Un variant doit être casté et non converti.

    S'il contient un string, tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShowMessage((String)MaFeuille.Cells.Item[i,j].Value);
    S'il contient un float, tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShowMessage(FloatToStr((Double)MaFeuille.Cells.Item[i,j].Value));
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    même erreur ...

  4. #4
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    En fait, tu n'a pas besoin de cast. Je viens de tester, ShowMessage(Variant) fonctionne
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  5. #5
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    En fait voici ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    procedure TForm1.LoadClick(Sender: TObject);
    Var
      openDialog : TOpenDialog;
      vMSExcel : variant;
      vXLWorkbooks, vXLWorkbook : variant;
      aFileName : AnsiString;
      MaFeuille : variant;
      i, j : Integer;
      //MonClasseur : _workbook;
     
    begin
    // Create the open dialog object - assign to our open dialog variable
      openDialog := TOpenDialog.Create(self);
     
      // Set up the starting directory to be the current one
      openDialog.InitialDir := GetCurrentDir;
     
      // Only allow existing files to be selected
      openDialog.Options := [ofFileMustExist];
     
      // Allow only .dpr and .pas files to be selected
      openDialog.Filter :=
        'Fichier excel|*.xls|Fichier csv |*.csv';
     
      // Select pascal files as the starting filter type
      openDialog.FilterIndex := 1;
     
      // Display the open file dialog
      if openDialog.Execute then
       begin
        aFileName:= openDialog.FileName;
        vMSExcel := CreateOleObject('Excel.Application');
        vXLWorkbooks := vMSExcel.Workbooks;
        vXLWorkbook := vXLWorkbooks.Open(aFileName);
        Mafeuille := vXLWorkbook.Worksheets[1] ;
        i:=1;
        j:=1;
        while MaFeuille.Cells.Item[i,j].Value<>'' do //les colonnes
          begin
     
            while MaFeuille.Cells.Item[i,j].Value<>'' do  //les lignes
              begin
                Valeurs.Cells[j,i-1] := MaFeuille.Cells.Item[i,j].Value;
                i:=i+1;
              end;
            j:=j+1;
            i:=1;
          end;
     
     
        //On quitte Excel
        vMSExcel.Quit;
        vMSExcel := unassigned;
       end
      else ShowMessage('Vous n''avez rien sélectionné');
     
      // Free up the dialog
      openDialog.Free;
     
    end;
    Et donc lorsque les valeurs des cellules de ma feuille Excel sont des nombres, j'ai mon message d'erreur :
    Could not convert variant of type (string) into type (Double)

    Voilà, je suis désolé d'insister mais ca commence à me saouler cette erreur


    Merci quand même

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Tes nombres sont des décimaux. Peut être que ton application ne reconnaît pas ton caractère décimal "." ou ",". C'est donc peut-être un problème de configuration de tes paramètres régionaux. Pour ce faire va dans Paramètres-> Panneaux de Configuration->Paramètres régionaux->Nombre et change le symbole décimal. Je sais que j'avais eu un problème comme le tien, et je l'avais résolu comme ceci (surtout pour les applications multilingues).

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    merci mais ca n'a rien changé ....

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Est ce que tu as quelque chose dans ton tableau Valeurs.cells (à l'intérieur de ta boucle) dans ta fonction???

  9. #9
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    non, je n'ai rien , il n'est pas initialisé.
    (Pour l'info, Valeurs est un TStringGrid)

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 98
    Points : 67
    Points
    67
    Par défaut
    pourquoi ne stockes-tu pas que des strings dans ton StringGrid?

  11. #11
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Mets un point d'arrêt sur la ligne Valeurs.cells et exécute ton programme en mode pas à pas. regarde si celui-ci se rempli ou alors si ton tableau n'est pas vide.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    Mon TStringGrid est mon tableau de données, il contient des données numériques et non numériques, c'est un logiciel de statistique que je suis en trainde faire. ( j'ai essayé en rentrant des valeurs à la main, ca marche).
    J'ai essayé en mode pas a pas, il foire quand il rencontre un nombre...je ne comprends pas pourquoi.

  13. #13
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Ah ok tes valeurs sont hétérogènes... Mais tes nombres sont tous des décimaux ou tu as des entiers. si c'est le cas est ce que ca plante aussi sur des entiers...????

  14. #14
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Sinon tes nombres décimaux sont ils avec le symbole ","? Le problème serait sans doute lié à ce problème, il ne reconnaît pas tes nombres décimaux.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 51
    Points : 42
    Points
    42
    Par défaut
    je relance ce sujet puisque je suis confronté au meme probleme:
    j'ouvre un fichier excel, je voudrais le recopier dans un nouveau fichier en affectant un coefficient a certaines valeurs. Donc je dois récuperer un nombre pour faire l'opération, et là j'ai l'erreur
    Impossible de convertir le variant de type (olestr ) en type (Double)

    Peu-t etre y a t il du nouveau chez quelqu'un.
    merki

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    parfois quand la valeur est nulle ou vide et on essaie de caster en nombre reel ou entier, il y a cette erreur.

    Il faut verifier d'abord que le variant qu'on caste soit pas nul et si oui le remplacer par 0.


    ou bien avec try except si ca plante, dans except y mettre 0.

    Si c'est pas le cas, je n'ai pas d'autre idee

  17. #17
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Au cas où regarde la propriété NumberFormat peut t'aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExcelWorksheet1.Cells.Item[RowNumber,ColNumber].NumberFormat

  18. #18
    Membre actif

    Profil pro
    Personnel
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Personnel

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Points : 210
    Points
    210
    Par défaut
    Salut,
    j'ai essayé ton code, effectivement cela ne marche pas...
    Dans l'aide Excel / VB, pour les cellules, on peut lire:
    Renvoie une valeur de type Boolean indiquant si une variable a été initialisée.

    Syntaxe

    IsEmpty(expression)

    L'argument expression est une valeur de type Variant contenant une expression numérique ou une expression de chaîne. Toutefois, comme la fonction IsEmpty est utilisée pour déterminer si des variables sont initialisées, l'argument expression est le plus souvent constitué d'un seul nom de variable.

    Remarques

    La fonction IsEmpty renvoie la valeur True si la variable n'est pas initialisée ou contient une valeur de type Empty ; dans le cas contraire, elle renvoie la valeur False. La valeur False est toujours renvoyée si l'argument expression contient plusieurs variables. La fonction IsEmpty ne renvoie des informations pertinentes que pour les variables de type Variant.
    et ceci:
    Ne confondez pas Empty et Null. La valeur Null indique que la variable de type Variant ne contient intentionnellement aucune donnée valide.
    et encore:
    La valeur Empty désigne une variable de type Variant qui n'a pas été initialisée (c'est-à-dire à laquelle aucune valeur initiale n'a été affectée). Une variable de type Variant contenant la valeur Empty équivaut à 0 si elle est utilisée dans un contexte numérique et à une chaîne de longueur nulle ("") dans un contexte de chaînes.
    et aussi:
    Variant est un type de données spécial pouvant contenir des données de toutes sortes, à l'exception des données de type String de longueur fixe


    D'après cela, on modifie tes boucles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      while MaFeuille.Cells.Item[i,j].Value <> 0 do begin //les colonnes
        while MaFeuille.Cells.Item[i,j].Value <> 0 do begin //les lignes
           Valeurs.Cells[j, i-1 ] := MaFeuille.Cells.Item[i,j].Value;
               Inc(i);
        end;
        Inc(j);
        i:=1;
    end;
    il te faudra traiter le cas de string...
    @+
    Fabrice

  19. #19
    Membre actif

    Profil pro
    Personnel
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Personnel

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Points : 210
    Points
    210
    Par défaut
    Hier par manque de batterie, j'ai un peu précipité la réponse...
    Aujourd'hui, j'ai trouvé une solution pour éviter l'erreur, mais je ne sais pas pourquoi cette erreur est émise. donc une solution:
    passer par une variable intermédiaire de type String:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var
      sVal: string;
      vValue: variant;
    ...
    vValue := MaFeuille.Cells.Item[i,j].Value;
    sVal := vValue;  // transfert dans string
    while sVal <> '' do begin  //les colonnes
        vValue := MaFeuille.Cells.Item[i,j].Value;
        sVal := vValue;  // transfert dans string
        while sVal <> '' do begin //les lignes
            Valeurs.Cells[j,i-1] := sVal;
            Inc(i);
        end;
        Inc(j);
        i:=1;
    end;
    Et ça marche ... c'est un peu bizarre quand même ...
    J'avais déjà utilisé une applic avec un serveur Excel, et je n'avais pas ce genre de problème, parce que, justement, j'utilisais une String pour récupérer la valeur Variant.
    Si tu as trouvé une solution, cela m'intéresse aussi.
    @+
    Fabrice

  20. #20
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Voici le code exact:
    Attention, je l'ai adapté à mon TSringGrid qui contient une ligne fixe.
    [edit] suppression code inutile (comment)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    procedure TForm1.LoadClick(Sender: TObject);
    Var
      openDialog : TOpenDialog;
      vMSExcel : variant;
      vXLWorkbooks, vXLWorkbook : variant;
      aFileName : AnsiString;
      MaFeuille : variant;
      i, j : Integer;
      Range : AnsiString;
      vType:integer;
    begin
    // Create the open dialog object - assign to our open dialog variable
      openDialog := TOpenDialog.Create(self);
     
      // Set up the starting directory to be the current one
      openDialog.InitialDir := GetCurrentDir;
     
      // Only allow existing files to be selected
      openDialog.Options := [ofFileMustExist];
     
      // Allow only .dpr and .pas files to be selected
      openDialog.Filter :=
        'Fichier excel|*.xls|Fichier csv |*.csv';
     
      // Select pascal files as the starting filter type
      openDialog.FilterIndex := 1;
     
      // Display the open file dialog
      if openDialog.Execute then
       begin
        aFileName:= openDialog.FileName;
        vMSExcel := CreateOleObject('Excel.Application');
        vXLWorkbooks := vMSExcel.Workbooks;
        vXLWorkbook := vXLWorkbooks.Open(aFileName);
        Mafeuille := vXLWorkbook.Worksheets[1] ;
        i:=1;
        j:=1;
        vType := VarTYpe(MAFeuille.Range['E3'].Value);
        If (vType) = varNULL Then
           StringGrid1.Cells[2,2] := 'Empty';
        vType := VarTYpe(MAFeuille.Range['D3'].Value);
        If vType = varOleStr Then
           StringGrid1.Cells[1,1] := MAFeuille.Range['D3'].Value;
     
        vType := VarTYpe(MaFeuille.Cells.Item[i,j].Value);
        while vType = varOleStr do //les colonnes
          begin
            repeat
                StringGrid1.Cells[j,i] := MaFeuille.Cells.Item[i,j].Value;
                i:=i+1;
                vType := VarTYpe(MaFeuille.Cells.Item[i,j].Value);                        
            Until vType <> varOleStr;
            j:=j+1;
            i:=1;
            vType := VarTYpe(MaFeuille.Cells.Item[i,j].Value);        
          end;
     
        //On quitte Excel
        vMSExcel.Quit; 
        vMSExcel := unassigned; 
       end 
      else ShowMessage('Vous n''avez rien sélectionné'); 
     
      // Free up the dialog 
      openDialog.Free; 
     
    end;

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/12/2010, 12h16
  2. flux xml parcours et récupération des valeurs
    Par altair8080 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 10/07/2010, 14h29
  3. Réponses: 3
    Dernier message: 19/07/2007, 09h19
  4. Réponses: 5
    Dernier message: 14/02/2006, 14h32
  5. [VBA] [EXCEL 97] Formatage automatique des cellules
    Par plante20100 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/09/2005, 09h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo