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 : récupérer le nom du fichier Excel déjà ouvert


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Excel : récupérer le nom du fichier Excel déjà ouvert
    Bonjour,

    Je souhaite récupérer le nom du fichier Excel déjà ouvert par l'utilisateur sachant que ce fichier n'a pas été ouvert par mon application.
    Avec Word, je peux le récupérer sans soucis mais avec Excel, non.

    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var EXCELApp : TExcelApplication ;
    begin
    EXCELApp := TEXCELApplication.Create(Self);
    EXCELApp.ActiveWorkbook.QueryInterface(IDataObject, IData);
    Edit1.Text := EXCELApp.ActiveWorkbook.FullName[0] ;
    Mais cela ne récupère pas le nom du fichier + son chemin.

    Avez-vous une idée comment récupérer le nom du fichier avec son chemin?

    Merci.

    Bonne journée

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 018
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 018
    Par défaut
    Pourquoi [0] ?
    Je ne sais même pas ce que ça récupère, [0] sur une WideString, c'est quoi ?

    Je n'utilise pas TExcelApplication (Early Binding) mais plus souvent la version Late Binding
    Déjà le comportement est différent entre GetActiveOleObject et CreateOleObject, respectivement cela prend un Excel déjà ouvert ou cela ouvre un nouvel Excel donc le ActiveWorkbook n'aura pas la même valeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var
      VExcelOLE: OLEVariant;
    begin
      try
        VExcelOLE := System.Win.ComObj.GetActiveOleObject('Excel.Application');
      except
         ShowMessage('Pas d''instance d''Excel');
         Exit;
      end;
     
      if not VarIsEmpty(VExcelOLE.ActiveWorkbook) then
        ShowMessage(VExcelOLE.ActiveWorkbook.FullName); // Ici c'est complet
    end;

    Avec TExcelApplication pour ouvrir un Excel existant il faut modifié ConnectKind en ckRunningInstance en Design Time
    En RunTime il faut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        EXCELApp.ConnectKind := ckRunningInstance;
        EXCELApp.Connect;

    la valeur par défaut ckRunningOrNew permet aussi d'ouvrir un Excel existant mais si il n'existe pas, cela va en ouvrir un nouveau, cela peut ne pas être intéressant
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    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
    Bonjour,

    @ ShaiLeTroll : Merci pour votre réponse

    Pourquoi [0] ?
    Je ne sais même pas ce que ça récupère, [0] sur une WideString, c'est quoi ?
    J’utilise Excel 2010 dans mon programme. En fait, j'ai créé un Add-in (Complément COM) dans Excel et j'ai besoin de récupérer le fichier ouvert avec le Path.

    Si on TExcelApplication, on doit renseigner le FullName suivi du [lcid] qui a généralement la valeur 0.

    Je viens de tester votre code avec un fichier Excel déjà ouvert, il m'affiche : 'Pas d''instance d''Excel' , il ne détecte pas Excel s' il est lancé, pourtant le fichier Excel est déjà ouvert.

    Avec Word, je récupère le nom du fichier de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WordApp := TWordApplication.Create(Self);
    Edit1.Text := WordApp.ActiveDocument.FullName;
    Merci

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 018
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 018
    Par défaut
    En tout cas avec un Excel Office 365 version 16 (sur deux postes differents, l'un en 32 et l'autre en 64), le code fourni fonctionne, ne serait-ce pas votre Add-In qui pose problème ?


    N'ayant pas TExcelApplication, je ne sais pas à quoi correspond [lcid], peut-être la langue pour les noms des dossiers systèmes
    En tout cas, FullName n'a pas de spécificité selon la documention Microsoft

    Quel est le code de déclaration de FullName et son code ?


    Faudrait regarder l'exception déclenché par le GetActiveOleObject
    le code d'erreur peut aider à comprendre le problème.


    Si vous developpez un Add-In, je ne m'y suis jamais intéressé mais celui-ci ne reçoit pas une instance de l'Excel appelant ?
    Et dans ce cas particulier, une différence entre les objets cOM 32 ou 64Bits ?

    IDTExtensibility2 et OnConnection devrait permettre de récupérer directement l'application à l'origine de l'appel du Plugin
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    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
    En tout cas avec un Excel Office 365 version 16 (sur deux postes differents, l'un en 32 et l'autre en 64), le code fourni fonctionne, ne serait-ce pas votre Add-In qui pose problème ?
    Je viens de tester sur Office 2016 Plus installé sur un poste 32 bits, ça ne fonctionne pas. Peut-être bien les version de MS Office qui posent ce souci.

    N'ayant pas TExcelApplication, je ne sais pas à quoi correspond [lcid], peut-être la langue pour les noms des dossiers systèmes
    En tout cas, FullName n'a pas de spécificité selon la documention Microsoft

    Quel est le code de déclaration de FullName et son code ?
    Si on passe par un OLEVariant, on est pas obligé de renseigner après le FullName (FullName[...]), mais, si on passe par un TExcelApplication, là, il faut le renseigner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function TExcelWorkbook.Get_FullName(lcid: Integer): WideString;
    begin
      Result := DefaultInterface.FullName[lcid];
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property FullName[lcid: Integer]: WideString read Get_FullName;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property FullName[lcid: Integer]: WideString readonly dispid 289;

  6. #6
    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
    @Shai : je viens juste de tester ton code dans un nouveau projet (sans le Add-in) et cela fonctionne. Même mon code déjà cité fonctionne aussi.

    Donc, le souci vient de mon projet du Add-in de Excel. Je vais le relire et voir qu'est-ce qui fait pour que cela ne fonctionne pas.

    Merci.

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 018
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 018
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Si vous developpez un Add-In, je ne m'y suis jamais intéressé mais celui-ci ne reçoit pas une instance de l'Excel appelant ?
    Et dans ce cas particulier, une différence entre les objets cOM 32 ou 64Bits ?

    IDTExtensibility2 et OnConnection devrait permettre de récupérer directement l'application à l'origine de l'appel du Plugin
    Avez-vous pris en compte cette remarque dans ma précédente intervention, d'utiliser l'instance fournie, utiliser un Supports() pour transformer l'interface neutre en interface Excel
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    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
    Avez-vous pris en compte cette remarque dans ma précédente intervention, d'utiliser l'instance fournie, utiliser un Supports() pour transformer l'interface neutre en interface Excel
    L'instance, je l'ai utilisée (ckRunningInstance), cela ne produit rien: ça ne se connecte pas au fichier (classeur) Excel déjà ouvert, mais si j'ajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExcelApp.Workbooks.Add(...)
    Cela récupère le nom du classeur que je viens d'ajouter.

    Par contre IDTExtensibility2 , non pas encore, j'ai lu l'article à propos de , il héberge les notifications des événements qui se produisent au niveau des compléments. Je trouve des difficultés à l'intégrer dans mon programme.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. récupérer le nom du fichier excel
    Par jf29840 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/06/2011, 17h42
  2. Comment récupérer le nom du fichier sans l'extension ?
    Par altahir007 dans le forum Langage
    Réponses: 16
    Dernier message: 13/11/2009, 13h20
  3. Récupérer le nom du fichier Excel ouvert
    Par malabarbe dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/06/2009, 12h52
  4. Récupérer le nom du fichier spool correspondant à un job
    Par chtiot dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 23/02/2004, 20h28
  5. Réponses: 2
    Dernier message: 29/01/2004, 11h05

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