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

Delphi Discussion :

Question sur le pilotage d'excel à partir de Delphi


Sujet :

Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2012
    Messages : 97
    Points : 59
    Points
    59
    Par défaut Question sur le pilotage d'excel à partir de Delphi
    Bonsoir à tous !

    j'essaye depuis quelques jours de comprendre comment manipuler les fichiers excel
    depuis une application Delphi, là j'arrive à la recherche, et je trouve des exemples que j'essaye
    d’exécuter:
    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
    Var MonClasseur : _workbook; 
        MaFeuille :_Worksheet; 
        rMaPlage : ExcelRange; 
        Adresse : wideString; 
    begin 
      ExcelApplication1.Connect; 
      MonClasseur:=ExcelApplication1.Workbooks.Open('c:\tutoriel\tuto.xls',False,False, 
            EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, 
            EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,0); 
      ExcelApplication1.Visible[0]:=true; 
      MaFeuille:=MonClasseur.Worksheets[1] as _worksheet; 
      rMaPlage:=MaFeuille.Cells.Find('toto',EmptyParam,xlValues,xlPart, 
                   xlByRows,xlNext,EmptyParam,EmptyParam); 
      if not (rMaPlage = nil) then 
      begin 
        Adresse:=rMaPlage.Address[true,true,xlR1C1,false,false]; 
        showmessage(adresse); 
        repeat 
          rMaPlage:=MaFeuille.Cells.FindNext(rMaPlage); 
          showmessage(adresse); 
        Until (rMaPlage = nil) or (Adresse=rMaPlage.Address[true,true,xlR1C1,false,false]) 
      end; 
    end;
    ce que je n'arrive pas à comprendre c'est : "_worksheet", "_workbook"
    d’après la syntaxe ce sont des types de données, mais le compilateur ne les reconnait pas.
    j'aimerai avoir des Clarification sur ce point.

    Merci.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    AMHA vous avez repris le code d'un endroit quelconque mais pas en entier (peut être un fichier de déclaration manquant).
    _workheet et _workbook sont certainement déclarés comme Variant quelque part. Les unités ComObj et Variants seront peut être aussi nécessaire dans la liste des uses
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2012
    Messages : 97
    Points : 59
    Points
    59
    Par défaut
    Merci SergioMaster,
    voilà d'ou j'ai eu ce code:
    https://delphi.developpez.com/faq/?p...che-dans-Excel
    comme ça vous allez mieux comprendre

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,
    sans utiliser TExcelApplication, comme dans la FAQ, tu peux faire :

    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
    Uses ComObj ;
    ...
    procedure TForm1.Btn_ExcelClick(Sender: TObject);
    Const
      xlValues = -4163 ;
      xlPart = 2 ;
      xlByRows = 1 ;
      xlNext = 1 ;
      xlR1C1 = -4150 ;
      xlA1   = 1 ;
    var
      vMSExcel : variant;
      vXLWorkbooks, vXLWorkbook : variant;
      aFileName : AnsiString;
      vSaveChanges : variant;
      aSheetName : AnsiString;
      vWorksheet : variant;
      aRange : Variant ;
      vCell : variant;
      Adresse : WideString ;
     
    begin
      // Ouverture d'Excel
      try
        vMSExcel := GetActiveOleObject('Excel.Application');
      except
        vMSExcel := CreateOleObject('Excel.Application') ;
      end;
     
      // Ouverture du classeur
      aFileName := ExtractFilePath(Application.ExeName)+ 'Classeur1.xls' ;
      vXLWorkbooks := vMSExcel.Workbooks ;
      vXLWorkbook := vXLWorkbooks.Open(aFileName) ;
      // Ouverture de la feuille du classeur
      aSheetName := 'Feuil1';
      vWorksheet := vXLWorkbook.WorkSheets[aSheetName];
     
      aRange := vWorksheet.Cells.Find('toto',EmptyParam,xlValues,xlPart,
                  xlByRows,xlNext,EmptyParam,EmptyParam);
     
      Adresse:=aRange.Address[true,true,xlA1,false,false];
      Showmessage(adresse);
      vMSExcel.Visible := true ;
      ShowMessage('Fermeture d''Excel');
     
      vXLWorkbook.Save ;  // Sauvegarde des modifications
      vSaveChanges := False;  // Unassigned : demande à l'utilisateur
      vXLWorkbook.Close(vSaveChanges, aFileName);
     
      //  Fermeture d'Excel
      vMSExcel.Quit ;
      vMSExcel := unassigned ;
     
    end;
    A+

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2012
    Messages : 97
    Points : 59
    Points
    59
    Par défaut
    Merci pr ta réponse Charly910
    l'intégralité du code est bien compilée,
    en revanche, la fonction EXTRACTFILEPATH n'a pas bien fonctionné:
    "Fichier excel introuvable";

    donc j'ai effectué quelques modifications (concernant l'ouverture du classeur);
    en se basant sur des exemples précédents dans la F.A.Q:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      vMSExcel.Visible  := False;
      vXLWorkbooks := vMSExcel.vXLWorkbooks;
      afilename := 'C:\Users\Youcef\Desktop\classeur1.xlsx';
      vXLWorkbooks := vMSExcel.Workbooks ;
      vXLWorkbook := vXLWorkbooks.Open(aFileName);
    tout est bien compilé, mais quand j’exécute le programme (clic sur le bouton),
    j'obtiens l'erreur:
    "Méthode 'vXLWorkbooks' non supportée par l'objet Automation"

    Qu'est ce qu'il faut rectifier ?

  6. #6
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,
    ExtractFilePath est dans l'unité SysUtils (au moins à partir de D7)

    A+
    Charly

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 857
    Points : 11 291
    Points
    11 291
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      vXLWorkbooks := vMSExcel.vXLWorkbooks;
    est en fait la ligne erronée
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour youce90,

    pourquoi ne reprends tu pas mon code en changeant seulement la ligne d'affectation de aFilename par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    afilename := 'C:\Users\Youcef\Desktop\classeur1.xlsx';
    :

    Cela devrait fonctionner ? (mais je n'ai pas testé avec un Xlsx, seulement avec un xls)

    A+
    Charly

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2012
    Messages : 97
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      vXLWorkbooks := vMSExcel.vXLWorkbooks;
    est en fait la ligne erronée
    Bien remarqué tourlourou
    oui ! ça fonctionne après modification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      vXLWorkbooks := vMSExcel.Workbooks;
    Merci !

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2012
    Messages : 97
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    Bonjour youce90,

    pourquoi ne reprends tu pas mon code en changeant seulement la ligne d'affectation de aFilename par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    afilename := 'C:\Users\Youcef\Desktop\classeur1.xlsx';
    :

    Cela devrait fonctionner ? (mais je n'ai pas testé avec un Xlsx, seulement avec un xls)

    A+
    Charly
    Effectivement ! ça fonctionne aussi pour les XLSX...
    Merci infiniment Charly910

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2012
    Messages : 97
    Points : 59
    Points
    59
    Par défaut
    Merci pour vos réponses messieurs !

    j'aimerai profiter encore de votre savoir, et passer au niveau suivant de la recherche:

    comment peut-on gérer plusieurs occurrences de la même valeur recherchée (dans une même feuille Excel) ?
    c'est à dire: continuer à rechercher au lieu de s’arrêter après la 1 ère occurrence.
    est ce que c'est faisable toujours avec la fonction FIND ?

    Merci.

  12. #12
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,

    avec mon code, tu peux faire ceci pour trouver les 'toto' suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      aRange := vWorksheet.Cells.Find('toto',EmptyParam,xlValues,xlPart,
                  xlByRows,xlNext,EmptyParam,EmptyParam);
     
      Adresse:=aRange.Address[true,true,xlA1,false,false];
    //  Showmessage(adresse);
      Adresse1 := Adresse ;
        Repeat
          showmessage(adresse);
          aRange:=vWorksheet.Cells.FindNext(aRange);
          Adresse:=aRange.Address[true,true,xlA1,false,false];
        Until (Adresse=Adresse1) ;
    A+
    Charly

Discussions similaires

  1. Pilotage OLE d'Excel à partir de Delphi
    Par patrickbruneau dans le forum Delphi
    Réponses: 1
    Dernier message: 29/08/2006, 14h51
  2. 3 questions sur l’importation de fichier Excel
    Par helenafr dans le forum Access
    Réponses: 5
    Dernier message: 05/04/2006, 07h38
  3. Question sur Visual C++ et excel
    Par Super seb dans le forum MFC
    Réponses: 3
    Dernier message: 07/09/2005, 17h02
  4. [VB.NET] Question sur le pilotage d'Excel
    Par alfprod dans le forum Windows Forms
    Réponses: 4
    Dernier message: 20/10/2004, 15h15
  5. pilotage d'excel à partir de VC++
    Par oliv dans le forum MFC
    Réponses: 3
    Dernier message: 05/02/2004, 18h31

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