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

C++Builder Discussion :

Plantage Excel avec le pilotage depuis C++ Builder


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 56
    Points : 28
    Points
    28
    Par défaut Plantage Excel avec le pilotage depuis C++ Builder
    Je m'essaye à la modification de fichier xls depuis C++ Builder et j'ai donc suivis le tuto du site

    Mais je dois oublier quelque chose car j'obtiens a chaque execution une fenetre Windows qui m'annonce qu'excel a rencontrer un probleme et doit fermer.

    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
    void main()
    {
            int i;
     
            CoInitialize(0); // sans cela j'obtiens une erreur
     
            Variant vMSExcel;
     
            vMSExcel = Variant::CreateObject("Excel.Application");
     
            vMSExcel.OlePropertySet("Visible", false);
     
            Variant vFileName, vXLWorkbooks, vXLWorkbook, vWorksheet, vSheetName, vValue, vRange, vCell,vSaveChanges;
     
            vFileName = "C:\\test.xls";
            vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
            vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName);
     
            vSheetName = "Feuil1";
            vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets",vSheetName);
            cin>>txt;
     
            AnsiString aValue;
     
            vRange = "A1";
            vCell = vWorksheet.OlePropertyGet("Range", vRange);
            aValue = vCell.OlePropertyGet("Value");
     
            cout<<aValue;
     
     
     
            cin>>i;
    }
    Je suis sur une application console.

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut Jidewe:
    Je pense que ton erreur est la
    vSheetName = "Feuil1";
    vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets",vSheetName);
    Tu met juste
    vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets",1);
    Tu ne donne un nom que si c'est different de "Feuil1"...
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 56
    Points : 28
    Points
    28
    Par défaut
    non c'est pas ça

    Pourrais tu me donner un en-tête standard stp? Avec des includes necessaires, peut etre que j'en oublie certains...

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Un lien sur un Tuto.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 56
    Points : 28
    Points
    28
    Par défaut
    Oui oui déja lu ^^ Si tu regarde bien mon code c'est exactement le tuto Mais je n'arrive pas a le faire fonctionner!

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Je fais la meme chose que toi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Variant vMSExcel, vXLWorkbooks, vXLWorkbook, vWorksheet;
    Variant vWorksheets;
    vMSExcel = Variant::CreateObject("Excel.Application");
    vMSExcel.OlePropertySet("Visible", true);
    Variant vFileName, vNotUsed;
    vNotUsed = Unassigned;
    vFileName = "C:\\test_Word";
    vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
    vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName, vNotUsed,
    vNotUsed, vNotUsed);
    vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1);
    Il y a aussi la FAQ
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  7. #7
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Ton code fonctionne chez moi, mais j'utilise les composants, j'ai donc mis en commentaires ce qui ne fonctionne pas avec les composants.
    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
     
    // ne pas oublier #include <utilcls.h>
            int i;
            OleInitialize(0); // sans cela j'obtiens une erreur
            Variant vMSExcel;
            vMSExcel = Variant::CreateObject("Excel.Application");
            vMSExcel.OlePropertySet("Visible", true);
            Variant vFileName, vXLWorkbooks, vXLWorkbook, vWorksheet, vSheetName, vValue, vRange, vCell,vSaveChanges;
            vFileName = "C:\\test.xls";
            vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
            vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName);
    //        vSheetName = "Feuil1";
            vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets",1);
    //        cin>>txt;
    //        AnsiString aValue;
      Variant aValue;
            vRange = "A1";
            vCell = vWorksheet.OlePropertyGet("Range", vRange);
            aValue = vCell.OlePropertyGet("Value");
    //        cout<<aValue;
     
    //        cin>>i;
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 56
    Points : 28
    Points
    28
    Par défaut
    J'ai copier/coller ton code et j'ai toujours le même probleme. Cela pourrait donc venir d'excel!

    Je vais essayer de chercher de ce coté là! Si toi, ou d'autre personnes ont des idées...

    Merci beaucoup pour ton aide!

  9. #9
    Expert confirmé
    Avatar de netah25
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    3 233
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 233
    Points : 4 972
    Points
    4 972
    Par défaut
    est cer que ca ne planterais pas que au deuxieme essai et suivant ?

    reguarde dans ta liste de processus ctrl+alt+suppr si tu n'as pas deja une instance de excel qui reste a trainer ?

    netah25
    Netah - admin
    mon site
    Linux & Mac

  10. #10
    Membre actif Avatar de Mattetfamilly
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 182
    Points : 201
    Points
    201
    Par défaut
    J'ai le même problème...
    Est-ce qu'avec l'utilisation de CreatObject, il faudrait faire une sorte de Delete à a fin de l'utilisation de l'objet excel? genre delete?
    avant de faire un second appel à la fonction qui récupéré les données d'une fenêtre excel.

    @+
    Mattetfamilly.
    on aura tout vu...
    Mais où est-ce???...
    ------------------------------------------------------
    n'oublies pas les balises [code ][/code ]
    et le Tag

  11. #11
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut Mattetfamilly:
    Tu est en mode console aussi?
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  12. #12
    Membre actif Avatar de Mattetfamilly
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 182
    Points : 201
    Points
    201
    Par défaut
    cela m'arrive mais pas dans le cas ou je suis avec excel.

    Mais il semble que j'ai le même message.
    En fait, dans une fonction je récupéres des données d'une fiche excel dont le nom m'est donné dans les paramètres de la fonction avant de les renvoyer sous forme de StringList.
    Effectivement je ne suis pas tout à fait dans la même configuration que le début de ce post... Mais il semble que le message soit le même.
    A chaque nouvel appel de ma fonction j'ai le même type de message d'erreur...

    @+ Mattetfamilly.
    on aura tout vu...
    Mais où est-ce???...
    ------------------------------------------------------
    n'oublies pas les balises [code ][/code ]
    et le Tag

  13. #13
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Je ne suis pas sur qu'Excel peut etre utilise en mode console comme l'utilise Jidewe j'ai un doute
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  14. #14
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    Je ne sais pas si on peut utiliser le mode consol, le problème vient peut-etre de là.

    Puisque l'on est dans le sujet

    vRange = "A1"
    ;

    marche

    et

    vRange = ("A"+IntToStr(n))
    ne marche pas alors que n = 1, excel plante dessus

    est-ce que quelqu'un à une idée du pourquoi ? :s
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 63
    Points : 61
    Points
    61
    Par défaut
    Bonjour Argol_Medusa,

    Voici d'un bout de code que j'utilise, si cela peut t'aider...

    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
     
      //Ouverture de la FICHE DE CALCUL     : Naissance
      //du CLASSEUR                        : Tounoi.xls
      vSheetName = "Naissance";
      vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets",vSheetName);
     
      //Sélection de la cellule B2
       vRange ="B2";
       vCell = vWorksheet.OlePropertyGet("Range",vRange);
     
       //Conversion de la CHAINE CARACTERE NaisPous1 en nombre ENTIER
       //Affectation de cette valeur en B2
       vValCell = StrToInt(NaisPous1->Text);
       vCell.OlePropertySet("Value",vValCell);
     
      //Sélection de la cellule B3
      vRange ="B3";
      vCell = vWorksheet.OlePropertyGet("Range",vRange);
     
      //Conversion de la CHAINE CARACTERE NaisPous2 en nombre ENTIER
      //Affectation de cette valeur en B3
      vValCell = StrToInt(NaisPous2->Text);
      vCell.OlePropertySet("Value",vValCell);
     
      //Sauvegarde Fichier
       vXLWorkbook.OleProcedure("Save");
    A essayer donc...

  16. #16
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    Bonjour, merci pour la réponse

    vValCell = StrToInt(NaisPous2->Text);

    marche, mais pour les vRange ça plante lors de l'exécution de excel.

    En fait le but serait de faire une boucle for qui incrémente le nombre de la case à modifier.

    Seul problème : un vRange = "B41" va marcher alors que si l'on rentre une AnsiString (pourtant correcte ) vRange = "B" + IntToStr(41) ça ne marche pas.

    Je me demande de quoi ça peut venir.
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 63
    Points : 61
    Points
    61
    Par défaut
    Bonjour Argol_Medusa,

    Vérifie la déclaration du format de ta cellule sous EXCEL.
    Pour ce faire, va dans Format de cellule puis Nombre et enfin Catégorie
    2 possibilités s'offre à toi soit :
    tu déclares ta cellule en type NOMBRE soit en type TEXTE

    Bon courage...

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 63
    Points : 61
    Points
    61
    Par défaut
    Bonjour Argol_Medusa,
    Voici le code permettant de réaliser une boucle sur les cellules
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
    //Insere ici le début 'b4' et la fin de ta boucle 'b10'
    //Ceci n'est valable que si tu connais tes bormes de boucle
    vRange ="b4:b10";
    vCell = vWorksheet.OlePropertyGet("Range",vRange);
    vValCell = StrToInt(NaisPous2->Text);
    vCell.OlePropertySet("Value",vValCell);
    ...
    Chez moi, cela fonctionne. J'espère que cela te sera utile...
    Bon courage ...

  19. #19
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    Bonsoir, et merci pour les explications.

    En fait mon code est le suivant :

    for (int n=1; n<10 ; n++)
    {
    vRange = "D1"; // marche
    vRange = ("D"+IntToStr(n)); // ne marche pas XD
    ShowMessage (vRange);
    vCell = vWorksheet.OlePropertyGet("Range", vRange);
    aValue = vCell.OlePropertyGet("Value");
    if (aValue.Length() > 0)
    ShowMessage(aValue);
    }
    le but est de scanner les valeurs d'une colonne d'un tableau excel pour trouver une valeure ( ici quelque chose de > 0 )

    Je ne comprends pas que le D1 marche alors que l'équivalent en chaine de caractère ne fonctionne pas
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 63
    Points : 61
    Points
    61
    Par défaut
    Bonjour Argol_Medusa,
    J'ai repris ton code et modifié ...
    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
     
    //Dans mon exemple, tout la rangée A1,B1,...,F1 représente des titres
    //i commence à 2
    for(int i=2;i<=5;i++)
     {
      // i représente le déplacement en rangée ou hauteur
      // 2 représente la colonne "B"
      vCell = vWorksheet.OlePropertyGet("Cells",i,2);
      //Récupération de la valeur de la cellule en type AnsiString
      AnsiString aValue = vCell.OlePropertyGet("Value");
      //Affichage de cette valeur mode debuggage
      ShowMessage(aValue);
     
      //Boucle de test valeur supérieur à 1900
      if(aValue >1900)
      {
        ShowMessage(aValue);
      }
     }
    Essaye ce code... Bon courage...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [OL-2003] Fichier Excel avec Workbook_Open lancé depuis Outlook
    Par Trarc dans le forum VBA Outlook
    Réponses: 2
    Dernier message: 04/10/2010, 17h56
  2. [C#] atteindre le format de cellule avec le pilotage d'EXCEL
    Par cortex024 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/04/2006, 09h32
  3. Problème avec le pilotage d'Excel
    Par dedesite dans le forum C++Builder
    Réponses: 6
    Dernier message: 16/01/2006, 16h38
  4. sauver une picture en gif depuis excel avec Visual baisi
    Par cada01a dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/11/2005, 19h58
  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