Lecture cellules Excel [Résolu]

Signaler
Messages postés
39
Date d'inscription
lundi 23 avril 2012
Statut
Membre
Dernière intervention
29 juillet 2012
-
Messages postés
39
Date d'inscription
lundi 23 avril 2012
Statut
Membre
Dernière intervention
29 juillet 2012
-
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

7 réponses

Messages postés
111
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
29 avril 2013
1
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;

@+
Messages postés
39
Date d'inscription
lundi 23 avril 2012
Statut
Membre
Dernière intervention
29 juillet 2012
1
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"
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
12
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
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15
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.
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15
Bien sûr, la ligne :

MyWorksheet := MyWorkbook.Worksheets[1];


peut être remplacée par :

MyWorksheet := MyWorkbook.Worksheets[NomDeMaFeuille];
Messages postés
39
Date d'inscription
lundi 23 avril 2012
Statut
Membre
Dernière intervention
29 juillet 2012
1
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
Messages postés
39
Date d'inscription
lundi 23 avril 2012
Statut
Membre
Dernière intervention
29 juillet 2012
1
Merci beaucoup à tous ;)
Ca fonctionne maintenant!! ;)