Lecture cellules Excel [Résolu]

YB28 39 Messages postés lundi 23 avril 2012Date d'inscription 29 juillet 2012 Dernière intervention - 8 juin 2012 à 14:29 - Dernière réponse : YB28 39 Messages postés lundi 23 avril 2012Date d'inscription 29 juillet 2012 Dernière intervention
- 8 juin 2012 à 16:40
Bonjour,
Je souhaite effectuer un programme sous delphi7 permettant de récupérer des données de plusieurs cellules d'un tableur excel et de les ajouter dans un mémo. Cependant j'obtien un message d'erreur EVariantInvalidOpError lorsque j'effectue ce code:

procedure TForm1.bt_executerClick(Sender: TObject);
var i,j     : integer;
begin
{ouverture d'Excel}
  ExcelApplication1.Visible[0]:=true; // pour rendre Excel visible

{Ouverture du fichier}
ExcelApplication1.Workbooks.Open(Edit1.Text,EmptyParam, True, EmptyParam, EmptyParam, EmptyParam,
                       EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                       EmptyParam, EmptyParam, EmptyParam, EmptyParam, 0);

{Lire la valeur d'une cellule}
  for i:=strtoint(Edit5.text) to strtoint(Edit6.text) do
  begin
    for j:=1 to 25 do
    begin
      Memo1.Text:=Memo1.Text+ExcelApplication1.Cells.Item[i,j];// probleme ici sans doute..
    end;
  end;
end;

Je ne comprend pas ...
Merci ;)
YB
Afficher la suite 

7 réponses

Répondre au sujet
cs_walidlam 111 Messages postés lundi 30 mai 2011Date d'inscription 29 avril 2013 Dernière intervention - 8 juin 2012 à 16:04
+3
Utile
salut!!
normalement le code sera comme suit:
var i,j     : integer;
 ExcelApplication1:variant;
 workbooks:variant;
begin
{ouverture d'Excel}
 // ExcelApplication1.Visible[0]:=true; // pour rendre Excel visible

{Ouverture du fichier}

 ExcelApplication1:= CreateOleObject('Excel.Application');
 //ExcelApplication1.visible:=true;
 ExcelApplication1.Workbooks.Open(edit1.Text);

{Lire la valeur d'une cellule}
  for i:=strtoint(Edit5.text) to strtoint(Edit6.text) do
  begin
    for j:=1 to 25 do
    begin
    if ExcelApplication1.Cells[i,j].Formula <> ''then
//pour eleminer les cellules vides
      Memo1.Text:=Memo1.Text+'-'+ExcelApplication1.Cells[i,j].Formula ;// probleme ici sans doute..

    end;
 // end;
      end;
end;

@+
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_walidlam
YB28 39 Messages postés lundi 23 avril 2012Date d'inscription 29 juillet 2012 Dernière intervention - 8 juin 2012 à 15:30
0
Utile
J'ai testé ca aussi :
procedure TForm1.bt_executerClick(Sender: TObject);
var i,j     : integer;
Cellule:ansistring;
begin
{ouverture d'Excel}
  OleApplication := CreateOleObject('Excel.Application');// création du lien OLE pour la classe référencé par Excel dans la base de registre "Excel.Application"
  OleApplication.visible:=True;

{Ouverture du fichier}
OleWorkBook:=OleApplication.Workbooks.open(Edit1.Text);

{Lire la valeur d'une cellule}
  for i:=strtoint(Edit5.text) to strtoint(Edit6.text) do
  begin
    for j:=0 to 4 do
    begin
       Cellule:=char(aColonne[j])+inttostr(i);
       Memo1.Text:=Memo1.Text+OleApplication.Range[Cellule].value;
    end;
  end;
end;


Cependant ne fonctionne pas non plus sauf si je retire le "for j:=0 to 4"
Commenter la réponse de YB28
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 8 juin 2012 à 15:35
0
Utile
Bonjour,

il faut aussi déclarer la feuille de travail, comme ceci :

MaFeuille :_Worksheet;
MaFeuille:=MonClasseur.Worksheets['NomDeMaFeuille'] as _worksheet;

// et on lit la cellule choisie :
ShowMessage(MaFeuille.Cells.Item[2,1].Value);



cantador
Commenter la réponse de cs_cantador
korgis 411 Messages postés samedi 17 mai 2003Date d'inscription 16 mars 2018 Dernière intervention - 8 juin 2012 à 16:03
0
Utile
Salut,

moi je ferais comme ça :

uses ComObj;

var
  ExcelApplication1: OleVariant;

procedure TForm1.bt_executerClick(Sender: TObject);
var
  i,j: Integer;
  Value: Variant;  // pas obligé, c'était pour le test
  MyWorkbook: OleVariant;
  MyWorksheet: OleVariant;
begin
  {ouverture d'Excel}
  ExcelApplication1 := CreateOleObject('Excel.Application');
  ExcelApplication1.Visible := True; // pour rendre Excel visible

  {Ouverture du fichier}
  MyWorkbook := ExcelApplication1.Workbooks.Open(Edit1.Text);

  MyWorksheet := MyWorkbook.Worksheets[1];
  {Lire la valeur d'une cellule}
  for i := StrToInt(Edit5.Text) to StrToInt(Edit6.Text) do
  begin
    for j := 1 to 25 do
    begin
      Value := MyWorksheet.Cells[i, j].Value;
      Memo1.Lines.Add(string(Value));
    end;
  end;
  ExcelApplication1.Quit;
  ExcelApplication1 := Unassigned;
end;


Ce code fonctionne, je l'ai testé.
Bien sûr Excel peut être assigné et libéré ailleurs.
Je passe par une variable de type Variant, ce n'est pas indispensable, c'était juste pour tester viteuf avec une feuille excel remplie de valeurs pas forcément compatibles string.
Commenter la réponse de korgis
korgis 411 Messages postés samedi 17 mai 2003Date d'inscription 16 mars 2018 Dernière intervention - 8 juin 2012 à 16:07
0
Utile
Bien sûr, la ligne :

MyWorksheet := MyWorkbook.Worksheets[1];


peut être remplacée par :

MyWorksheet := MyWorkbook.Worksheets[NomDeMaFeuille];
Commenter la réponse de korgis
YB28 39 Messages postés lundi 23 avril 2012Date d'inscription 29 juillet 2012 Dernière intervention - 8 juin 2012 à 16:34
0
Utile
Merci de ta réponse cantador. Mais
Memo1.Text:=Memo1.Text+MaFeuille.Cells.Item[2,1].Value;
ne fonctionne pas .. Je n'arrive pas à afficher de texte dans le memo ainsi. et lorsque je fait
ShowMessage(MaFeuille.Cells.Item[2,1].Value); 
rien ne s'affiche non plus...

YB
Commenter la réponse de YB28
YB28 39 Messages postés lundi 23 avril 2012Date d'inscription 29 juillet 2012 Dernière intervention - 8 juin 2012 à 16:40
0
Utile
Merci beaucoup à tous ;)
Ca fonctionne maintenant!! ;)
Commenter la réponse de YB28

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.