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 :

Pilotage OLE d'Excel : Méthode 'Range' non supportée


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut Pilotage OLE d'Excel : Méthode 'Range' non supportée
    Bonjour à tous

    Soit un classeur Excel. Une feuille contient une zone que je veux pouvoir lire. J'ai suivi cette faq. J'ai traduit certains noms de variables pour que ce soit plus parlant pour moi.

    J'ai cette erreur :


    Code de ma procédure :
    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
    Procedure Lire_Zone_A_Imprimer;
    Var
      Lecture_Seule, Pos_Cellule, Cellule_Pointee, Val_Cellule : variant;
    
      Excel_App : variant; // Objet instance d'Excel (EXCEL.EXE)
      Lst_Classeurs : variant; // Lst des classeurs exploités par Excel (maintenant ou AVANT. Liste sauvée ds le rép. de profil utilisateur)
      Classeur_Cible : variant; // Classeur exploité
      Feuille_Pointee : variant;  // Feuille pointee
      vLink : variant; // Désigne quoi ? Pointe quoi ? "Link" serait "lien" . Pas un pointeur, mais lien vers quoi ?
    
      Nom_F : string;
      Nom_Feuille : AnsiString;
    
    begin
      Lecture_Seule := True;
      Nom_F := GetCurrentDir + '\' + 'CLASSEUR.XLS';
    
      // Instancier Excel ---------------- // Ici : j'évite une gestion d'exception avec Tst_Process_Present() : si Excel est déjà lancé, pas de Create
      if Tst_Process_Present('EXCEL.EXE') = False then
        begin
          Excel_App := CreateOleObject('Excel.Application');   // Lancer Excel
        end
      Else
        begin
          Excel_App := GetActiveOleObject('Excel.Application');    // Se connecter à l'instantce d''Excel si acif
        end;
    
      Excel_App.Visible := False;
    
      // Ouvrir le classeur -------------------------
      Lst_Classeurs := Excel_App.WorkBooks;
      Lecture_Seule := True;
      vLink := Unassigned;
      Classeur_Cible := Lst_Classeurs.Open(Nom_F, vLink, Lecture_Seule);
    
      // Sélectionner la feuille ------------------
      Nom_Feuille := 'Impression';  
      Feuille_Pointee := Classeur_Cible.WorkSheets[Nom_Feuille];  // Le bug est ici V. plus bas le message d'erreur
    
      // à partir d'ici, non encore débogué 
      // Pointer la cellule -------------------------
      Pos_Cellule := 'A4';
      Cellule_Pointee := Classeur_Cible.Worksheets.Range[Pos_Cellule];
      Val_Cellule := Classeur_Cible.Worksheet.Cellule_Pointee.Value;
    
      // Fermer le classeur
      Excel_App.Quit;
      Excel_App := UnAssigned;
    
    end;
    J'avais déjà fait qqch comme ça sous D7, et XE7 me le compile toujours. Mais l'instruction Select ne figure pas sur la faq. Je ne l'ai donc pas utilisée ds l'exemple qui plante.
    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
     
            // Ouvrir le classeur
          XL := CreateOLEObject('Excel.application');
          XL.workbooks.open(Nom_F_XLS); // Ouvrir le fichier XLS
          XL.Visible := False;
     
          XL.sheets['Nb_Sites'].select;  // Sélectionner la feuille sur laquelle on travaille
          Colonne := 2;  // Nb sites
          Ligne := 1;   // Dictionnaires
          Chn := XL.cells[Ligne, Colonne].value;
          Nb_Dictionnaires := StrToInt(Chn);
     
            // Fermer le classeur
          XL.Quit;
          XL := UnAssigned;

  2. #2
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    668
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 668
    Par défaut
    Salut,

    Feuille_Pointee := Classeur_Cible.WorkSheets[Nom_Feuille];
    Tu veux sélectionner une page d'excel par son nom:

    Remplace "WorkSheets" par "ActiveSheet" pour voir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuille_Pointee := Classeur_Cible.ActiveSheet[Nom_Feuille];
    sinon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XLApp.WorkSheets.Item['Page1'].Select;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XLApp.Workbooks[1].Worksheets[1].Name);

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut
    Bonjour.

    Aucune syntaxe ne passe.

    Je suis arrivé à sélectionner la feuille :

    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
    Procedure Lire_Zone_A_Imprimer;
    Var
      Lecture_Seule, Pos_Cellule : variant;
    
      Excel_App : variant; // Objet instance d'Excel (EXCEL.EXE)
      Lst_Classeurs : variant; // Lst des classeurs exploités par Excel (maintenant ou AVANT : ds les MRU);
      Classeur_Cible : variant; // Classeur exploité
      Feuille_Pointee : variant;  // Feuille pointee
      vLink : variant; // ?
    
      Nom_F : string;
      Nom_Feuille : AnsiString;
    
      aValue, aRange : AnsiString;
      vCell : variant;
      vWorkSheet : variant;  // Feuille pointée
    
    begin
      Lecture_Seule := True;
      Nom_F := GetCurrentDir + '\' + 'CLASSEUR.XLS';
    
      // Instancier Excel ----------------
      if Tst_Process_Present('EXCEL.EXE') = False then
        begin
          Excel_App := CreateOleObject('Excel.Application');   // Lancer Excel
        end
      Else
        begin
          Excel_App := GetActiveOleObject('Excel.Application');    // Se connecter à l'instantce d''Excel si acif
        end;
    
      Excel_App.Visible := False;
    
      // Ouvrir le classeur -------------------------
      Lst_Classeurs := Excel_App.WorkBooks;
      Lecture_Seule := True;
      vLink := Unassigned;
      Classeur_Cible := Lst_Classeurs.Open(Nom_F, vLink, Lecture_Seule);
    
      // Sélectionner la feuille ------------------
      Nom_Feuille := 'Impression';
      Feuille_Pointee := Classeur_Cible.Sheets[Nom_Feuille].select;    // Sélectionner la feuille ds le classeur
                                                                       // Feuille_Pointee devient True
    
      vWorkSheet := Feuille_Pointee;
      // Sélectionner la cellule (donc : la ligne et la colonne de la feuille) -------------------
      aRange := 'A4';  // là, je reprends textuellement le tuto de la faq
    //  vCell := Excel_App.vWorkSheet.Range[aRange];
      Excel_App.vWorkSheet.Range[aRange].Select;  // Le bug est ICI.
    Erreur retournée :


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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Excel_App.vWorkSheet.Range[aRange].Select; // Le bug est ICI.

    vWorkSheet est un nom de variable ; pas de propriété de Excel_App : erreur de copié/collé...
    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 !

  5. #5
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 510
    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 510
    Par défaut
    Bonjour,

    si c'est juste pour lire le contenu de la cellule A4 comme dans ton premier code, l'exemple de la FAQ fonctionne bien (sous D7) :

    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
    procedure TForm1.Btn_Excel2Click(Sender: TObject);
    Var
       vMSExcel :Variant ;
       vXLWorkbooks, vXLWorkbook : variant;
       vReadOnly, vLink : variant;
       aFileName : AnsiString;
       aSheetName : AnsiString;
       vWorksheet : variant;
       aRange, aValue : AnsiString;
       vCell : variant;
    Begin
       Try
           vMSExcel := GetActiveOleObject('Excel.Application');
       Except
           vMSExcel := CreateOleObject('Excel.Application');
       End;
       aFileName := GetCurrentDir + '\' + 'CLASSEUR.XLS';
       vLink := unassigned;
       vReadOnly := true;
       vXLWorkbooks := vMSExcel.Workbooks;
       vXLWorkbook := vXLWorkbooks.Open(aFileName, vLink, vReadOnly);
       aSheetName := 'Impression';
       vWorksheet := vXLWorkbook.WorkSheets[aSheetName];
       aRange := 'A4';
       vCell := vWorksheet.Range[aRange];
       aValue := vCell.Value;
       ShowMessage(Format('Contenu de la cellule A4 : %s',[aValue])) ;
       vMSExcel.Quit;
       vMSExcel := unassigned;
    End;
    A+
    Charly

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Et pour se simplifier la vie, on peut utiliser une unité annexe :
    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
    69
    70
    71
    72
    73
    74
    75
    unit ExcelByOLE;
     
    {inspiré notamment de l'unité DriveOleExcel de bernard.lampert@libertysurf.fr, trouvée sur Phidels.com}
     
    interface
     
    procedure OpenClasseur(aFileName: string);
    procedure CloseClasseur;
    procedure SelectOnglet(aSheet: string);
    function LireValeur(aCol: Char; aRow: integer): string;
    procedure EcrireValeur(aCol: Char; aRow: integer; aValue: string);
    procedure CouleurFond(aCol: Char; aRow: integer; aColorIndex: integer);
    procedure SaveClasseur;
     
    implementation
     
    uses
      Windows, Messages, SysUtils, Classes, Controls, Forms, Dialogs,
      StdCtrls,ComObj, ExtCtrls, ExtDlgs;
     
    var
      OleApplication, OleWorkBook: variant;
     
    procedure OpenClasseur(aFileName: string);
    begin
      // création du lien OLE pour la classe référencée par Excel dans la base de registre "Excel.Application"
      OleApplication := CreateOleObject('Excel.Application');
      OleApplication.Visible:=True; // pour rendre Excel visible
      OleWorkBook:=OleApplication.Workbooks.Open(aFileName);
    end;   
     
    procedure CloseClasseur;
    begin
      try
        OleApplication.Quit;
        OleApplication:=Unassigned;
      except end;
    end;
     
    procedure SelectOnglet(aSheet: string);
    begin
       OleWorkBook.Worksheets.Item[aSheet].Activate; //connexion à un onglet
    end;
     
    function LireValeur(aCol: Char; aRow: integer): string;
    var
      NumCol: integer;
    begin
      NumCol:=Ord(UpCase(aCol))-Ord('A')+1;
      Result:=OleApplication.Cells[aRow, NumCol].Value;
    end;
     
    procedure EcrireValeur(aCol: Char; aRow: integer; aValue: string);
    var
      NumCol: integer;
    begin
      NumCol:=Ord(UpCase(aCol))-Ord('A')+1;
      OleApplication.Cells[aRow, NumCol].Value:=aValue;
    end;
     
    procedure SaveClasseur;
    begin
      OleApplication.ActiveWorkBook.Save;
    end;
     
    procedure CouleurFond(aCol: Char; aRow: integer; aColorIndex: integer);
    var
      NumCol: integer;
    begin
      NumCol:=Ord(UpCase(aCol))-Ord('A')+1;
      OleApplication.Cells[aRow, NumCol].Select;
      OleApplication.ActiveCell.Interior.ColorIndex:=aColorIndex;
    end;
     
    end.
    Celle-ci, basique, sous D5, me suffisait.
    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 !

  7. #7
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 510
    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 510
    Par défaut
    Oui, cette petite unité peut être très pratique.
    Si bvsud préfère utiliser le code de la FAQ avec des indices de cellules, il suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       ...
       aValue := vMSExcel.cells[2,3].value;
       ShowMessage(Format('Contenu de la cellule [2,3] : %s',[aValue])) ;
       ...
    Charly

Discussions similaires

  1. Faire un graphique en Ole avec Excel
    Par kurul1 dans le forum C++Builder
    Réponses: 18
    Dernier message: 23/03/2007, 21h57
  2. Pilotage OLE d'Excel à partir de Delphi
    Par patrickbruneau dans le forum Delphi
    Réponses: 1
    Dernier message: 29/08/2006, 14h51
  3. Pilotage OLE d'excel : Excel ne reste pas ouvert
    Par ero-sennin dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/07/2006, 16h49
  4. Pilotage ole d'excel sous bcb6 -> AutoFilter
    Par GameOver dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/04/2005, 11h56
  5. Pb avec le pilotage OLE d'Excel
    Par psau dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/01/2005, 17h19

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