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 :

[Excel] L'appel a été rejeté par l'appelé.


Sujet :

Delphi

  1. #1
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut [Excel] L'appel a été rejeté par l'appelé.
    Salut à tous,

    Voilà, je développe un outil de transfert de courbes Chart vers Excel, tout fonctionne bien sauf lorsque l'un des classeur Excel ouvert a été modifié par l'utilisateur et non enregistré. J'ai alors cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L'appel a été rejeté par l'appelé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Var
        XLApp, XLLWorkbooks: variant;
    Begin
      Try
        XLAPP := GetActiveOleObject('Excel.Application');
      Except
        XLAPP := CreateOleObject('Excel.Application');
      End;
     
        XLWorkbooks := XLAPP.Workbooks; //=>plantage ici
    Mon problème étant que toutes mes fonctions suivantes utilisent XLWorkBooks...
    Donc je vois pas comment m'en sortir sans mettre un message d'erreur à l'utilisateur "enregistrer tous vos classeurs excel ouvert"...Et alors là j'imagine déjà tous les gars du bureau venir dans le mien pour se plaindre...

    Donc si quelqu'un a une idée, je le remercie par avence.

    A+.
    For crying out loud !

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Points : 357
    Points
    357
    Par défaut
    Moi je fais toujours un CreateOleObject, comme ça justement pas d'interférence avec les classeurs de l'utilisateurs...

  3. #3
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Merci pour ta réponse,

    Effectivement, j'ai plus de problème si je fais un CreateOleObject à chaque fois,
    sauf que j'ai deux fois le même classeur d'ouvert dont le mien en lecture seul. (Et si l'utilisateur a déjà utilisé l'autre, j'en ai même deux différents...).

    L'idéale,en fait ce serait de pouvoir enregistrer le classeur selectionner par l'utilisateur avant de l'ouvrir...Mais mon problème c'est que je parcours mon XLAPP.Workbooks pour savoir si il est ouvert.

    J'ai l'impression de tourner en rond,

    A+.
    For crying out loud !

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    t'as essayé quelque chose avec

    XLAPP.ActiveWorkbook?

    tu peux peut-être forcer la sauvegarde...
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  5. #5
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Merci, effectivement ActiveWorkBook passe, et il est possible d'enregistrer le classeur ouvert avant toute action.
    Le soucis c'est que ce n'est pas forcémment le classeur actif qui a été modifié (et ce n'est pas forcémment lui non plus qui doit me servir de récepteur de données).

    En fait, pour m'en sortir, il me faudrait une autre méthode que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     XLWorkBook:= XLApplications.Workbooks.Open(FileName)
    pour ouvrir mon fichier (une méthode qui ne passerait pas par Workbooks).

    J'ai voulu essayer de parcourrir tous mes classseurs pour activer celui que je souhaite, mais pareil, on doit passer par workbooks.

    A+.
    For crying out loud !

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    dans ce cas, il ne reste pas beaucoup de choix...
    faudra que tu passe par l'objet windows...
    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
     
           //== Examine toutes les fenêtres Excel pour enregistrer
           //== et/ou fermer le classeur désiré.
           for i:=1 to XLAPP.windows.Count do
           begin
              //== Le caption correspond au texte affiché dans la barre de titre
              //== en haut de la fenêtre lorsqu'elle n'est pas agrandie
              if XLAPP.Windows.Item[i].caption='monfichier.xls' then
              begin
                  //== Active le classeur trouvé ==
                  XLAPP.Windows.Item[i].Activate;
                  //== sauvegarde le classeur ou le ferme...
                  //XLAPP.ActiveWorkbook.Save ;
                  //XLAPP.Windows.Item[i].Close(..)
              end;
           end;
    quelque chose du genre...
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  7. #7
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Merci beaucoup pour ton aide, c'est une excelente idée...
    Mais il reste un pb dans mon code (désolé, je maitrise pas du tout les OleObject... ), mon windows.count vaut toujours 0 dans mon code, quelque soit le nombre de fenêtre ouvertes:

    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
    Procedure(...);
    Begin
     
      Try
        XLAPP := GetActiveOleObject('Excel.Application');
      Except
        XLAPP := CreateOleObject('Excel.Application');
      End;
     
     If Savedialog1.execute then
      Begin
        FileName:=Savedialog1.filename;
          If Trim(FileName) ='' then Begin
            Ouvert:=false;
            Exit;
          End;
     
        ShowMessage(IntToStr(XLAPP.windows.Count)); // => affiche 0
        For I:=0 to XLAPP.windows.Count-1 do
          ShowMessage(XLAPP.Windows.Item(i).caption);
     
    ....
    Encore merci pour tout...

    A+.
    For crying out loud !

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    si windows.count vaut toujours 0... alors j'ai l'impression que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      Try
        XLAPP := GetActiveOleObject('Excel.Application');
      Except
        XLAPP := CreateOleObject('Excel.Application'); //<== c'est ce code qui s'execute
      End;
    tu peux me le confirmer svp...
    et dans ce cas... je vois pas comment?!?
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    et attention...

    les indices pour Windows.Item[] sont de 1 à Windows.Count

    et non de 0 à windows.Count-1
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  10. #10
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Apparemment c'est plutôt l'inverse...
    Je doit avoir un problème dans la gestion de mes OleObject, puisque je passe toujours par GetActiveOleObject('Excel.Application'), sans jamais déclenché une exception.

    Et dans ma barre des tâches j'ai plein de Excel lancé dès que je lance mon application, donc on dirais que certaine connexion ne sont pas fermée, et qu'il en récupère une ancienne...

    Il va falloir que je nettoie un peu (beaucoup) mon appli. Juste une petite question:
    Cela libère bien la connexion, n'est-ce pas?

    A+.
    For crying out loud !

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    XLApp := unassigned;

    Non pas vraimment...
    c'est plutot ceci...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try
      //fait des choses avec excel...
    finally
      XLApp.Disconnect;
    end;
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  12. #12
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    XLApp := unassigned;

    Non pas vraimment...
    c'est plutot ceci...

    try //fait des choses avec excel...
    finally XLApp.Disconnect;
    end;
    Forcémment il devait y avoir un paquet de connection qui se ballade...
    Je vais modifier ça et tester.

    Merci pour ton aide et pour ta patience...

    A+.
    For crying out loud !

  13. #13
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Je viens de tester et tout fonctionne à la perfection maintenant.
    Je te remercie encore pour ton aide.

    A+.
    For crying out loud !

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

Discussions similaires

  1. [Débutant] L'appel a été rejeté par l'appelé ?
    Par xingjing910 dans le forum VB.NET
    Réponses: 7
    Dernier message: 11/07/2012, 16h22
  2. [MySQL] Comment appeler du code PHP par requête
    Par mickdu90 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 19/04/2006, 10h55
  3. Appeler le navigateur (browser) par défaut
    Par Kantizbak dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 09/09/2005, 15h45
  4. [VB.NET] Appeler un évènement serveur par JS...
    Par Rami dans le forum ASP.NET
    Réponses: 5
    Dernier message: 17/05/2004, 17h27

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