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 :

Pilotage OLE Excel et VBE


Sujet :

C++Builder

  1. #1
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut Pilotage OLE Excel et VBE
    Bonsoir,

    Le partie sur Excel dans la FAQ m'ayant été d'une grande utilité recemment, je suis confronté a un petit soucis un peu plus 'exotique'.
    Est il possible de travailler de la même sur des parties du VBE sous jacent au classeur Excel, et ce afin de modifier des proriétés dans WorkSheet par exemple ou bien changer une portion de code dans l'évènement SelectionChange de ce même objet ?

    Merci d'avance ...
    @ +

  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 Sunchaser.
    Je ne comprend pas bien ta demande, mais en principe tout ce que l'on peut faire avec VBE on peut le faire avec OleExcel, c'est juste parfois un peu long a trouver.

  3. #3
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Salut,
    J'aimerai faire d'une pierre, deux coups comme on dit ...
    J'ai un certain nombre de modifications a effectuer sur un tres grand nombre de fichiers Excel (chouette ... ... j'chui motivé) sur pleins de postes différents et plutôt que de faire le tour de l'Ile de France et de modifier toutes ces petites horreurs manuellement, j'ai lu la FAQ, bricolé un petit truc avec mon Builder et ca marche a merveille.
    Un truc de fainéant comme j'aime :
    le gars n'a qu'a cliquer pour lancer l'exe, attendre 15 secondes, et son fichier en cours est modifié.
    Maintenant, on viens de me parler d'un autre souci. Et le souci, c'est que le souci est caché dans l'évènement SelectionChange d'une des feuilles du classeur. J'aimerais donc procéder de la même manière.
    Mais justement, j'ai un peu de mal a trouver ...

  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
    As tu un bout de code a croquer (mauvais jeux de mots..) avec le soucis la ou il se produit on devrais bien trouver une solution

  5. #5
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Citation Envoyé par blondelle
    As tu un bout de code
    Heu ...





    Ben ... non.
    Bon, j'illustre un peu tout de même.
    Grâce a nos chers ancêtres du forum qui ont gravés dans les cavités abyssales de la FAQ des textes essentiels comme celui du pilotage OLE Excel avec Builder, je sais que pour travailler sur une feuille Excel 'classique' je peut faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vWorksheet = vWorkbook.OlePropertyGet("Worksheets", aName);
    par exemple.
    Mais pour récuperer l'objet qui représente la feuille dans VBE, comment fais je ?
    Le projet dans le VBE est protégé. Bon, j'ai le mot de passe, fort heureusement. Comment cela se déprotège t il ?


  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
    Si j'ai bien compris ton soucis, pour selectionner une feuille il faut ecrire ceci, pour par exemple effacer la feuille complete, le nom ici "télégraphe" peut etre remplace par le numero de la feuille 1, 2 ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", "télégraphe");
    vWorksheet.OleProcedure("Select");
    Pour la protection si c'est le fichier qui est protege c'est dans "open" qu'il faut parametrer le mot de passe, sinon il faut deproteger par programme dit moi quelle protection tu a.

  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
    Pour deproteger une feuille le code, un classeur, ma fonction ouvre la boite de dialogue pour taper le mot de passe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vMSExcel.OlePropertyGet("ActiveSheet").OleProcedure("Unprotect");
    vMSExcel.OlePropertyGet("ActiveWorkbook").OleProcedure("Unprotect");
    Sinon il y a aussi ces liens dans la FAQ:
    Pour ouvrir un classeur protege par un mot de passe

  8. #8
    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
    Pour reproteger ton classeur que tu a deprotege a l'ouverture le code:
    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
     
    FileFormat = -4143; // valeur de xlNormal "sauvegarde sous format classeur excel"
                        // pour les autres format de sauvegarde faire un essai avec VBE
     
    // creation d'un mot de passe protegeant l'ouverture du fichier
    // attention si le fichier a ete sauvegarde avec un mot de passe
    // il ne peut pas etre reecrit cela provoque une exception
    Mot_passe = "jpb"; // pour la protection du fichier
     
    Password = Mot_passe; // mot de passe pour proteger le fichier
     
    WriteResPassword = Mot_passe; // confirmation du mot de passe
     
    ReadOnlyRecommended = false; // fichier en lecture seule (False True Unassigned)
     
    // creation d'une copie si le fichier existe deja
    CreateBackup = false;  //Unassigned; // creation d'une copie (False True Unassigned)
     
    // fermeture d'un fichier (ouvert au format csv) au format xls
    vFileName = "C:\\Documents and Settings\\blondelle\\Mes documents\\plan_gps\\PLAN_GPS\\télégraphe.xls";
    vXLWorkbook.OleProcedure("Saveas", vFileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup);
    //vXLWorkbook.OleProcedure("Saveas", vFileName, FileFormat, Unassigned, Unassigned, Unassigned, Unassigned);
     
    // fermeture d'excel
    vMSExcel.OleFunction("Quit");
    // liberation memoire
    vMSExcel = Unassigned;

  9. #9
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Merci beaucoup blondelle mais c'est vrai que ces points la, je les ai déja abordés précedemment pour travailler dans Excel.
    Mais j'ai besoin de travailler dans la 'partie VBA' sous Excel et donc d'acceder au VBAProject(nom-du-fichier.xls), de le dévérouiller, d'acceder a un objet de ce projet représentant la feuille dans le classeur excel, d'acceder a l'evènement Selection_Change de cet objet et de remplacer le code pour un autre ...

    Voili...merci.

  10. #10
    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
    C'est sur les macros que tu veu intervenir?

  11. #11
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    ui m'sieur ...

  12. #12
    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
    Tu peu inserer une macro dans la partie VBE et l'executer ca je sais faire, si c'est pour modifier du code existant il faut poster dans la FAQ VBA il te renseigneront "ils sont geniaux" en VBE je sais que cela est possible ont peu meme detruire une macro par code.

  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
    Pour inserer une macro contenue dans un fichier:
    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
     
    --------------------------------------------------------------------------------
     
    J'ai adapte a excel le code d'installation d'une macro a partir d'un fichier.
    le code:
     
    Code :
     
    Variant VBComp, vMSExcel, vXLWorkbook;
     
    // installation du Module
    VBComp = vXLWorkbook.OlePropertyGet("VBProject").OlePropertyGet("VBComponents");
    VBComp.OleProcedure("Import", "c:\\testrows.txt");
    // execution de la macro
        vMSExcel.OleProcedure("Run", "essai");
    // destruction de la macro
    VBComp.OleFunction("Remove", VBComp.OleFunction("Item", "Module1"));
    // a partir d'ici il n'y a plus de macro n'y Module
     L'essai a ete fait avec Excel 2003
    Ton code VBA est dans un fichier ici testrows.txt et le nom de la macro est essai

  14. #14
    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
    Avec ce code tu ecrit la macro dans un module VBE est tu l'execute, puis tu detruit la macro.
    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
     
    J'ai readapte la deuxieme version de creation d'une Macro.
    le code:
     
    Code :
     
    Variant vXLWorkbook, VBComp, vMSExcel
    int X;
        // on cree un module pour du code VB
        VBComp =  vXLWorkbook.OlePropertyGet("VBProject").OlePropertyGet("VBComponents").OleFunction("Add", 1);
     
        // on renome le module sans espaces dans le nom
        VBComp.OlePropertySet("Name", "MyModule");
        VBComp.OlePropertyGet("CodeModule");
     
        // on ecrit la macro dans le module cree
            X = VBComp.OlePropertyGet("CodeModule").OlePropertyGet("CountOfLines");
            VBComp.OlePropertyGet("CodeModule").OleProcedure("InsertLines", X + 1, "Sub laMacro()");
            VBComp.OlePropertyGet("CodeModule").OleProcedure("InsertLines", X + 2, "        Rows(\"10:11\").Select");
            VBComp.OlePropertyGet("CodeModule").OleProcedure("InsertLines", X + 3, "End Sub");
        vMSExcel.OleProcedure("Run", "laMacro");
     
        // on efface les lignes dans l'ordre inverse de la saisie
        VBComp.OlePropertyGet("CodeModule").OleFunction("DeleteLines", 3);
        VBComp.OlePropertyGet("CodeModule").OleFunction("DeleteLines", 2);
        VBComp.OlePropertyGet("CodeModule").OleFunction("DeleteLines", 1);
     
        // ici il n'y a plus aucune trace de la macro
        vXLWorkbook.OlePropertyGet("VBProject").OlePropertyGet("VBComponents").OleFunction("Remove", VBComp);
     Ce code est parfait pour de courtes Macro.
    Il a ete teste sous Excel 2003.
    j'espaire que cela va t'aider.

  15. #15
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut


    C'est tout a fait le type de choses que je cherchais ...
    Excellent, je vais travailler la dessus.
    Merci

  16. #16
    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
    Si tu utilise la macro dans un fichier ce que je pense le plus facile, tu code et tu teste directement ta macro dans Excel quand c'est au point tu fait un copier/colle dans Notepade de ta macro avec le sub NomFichier() .. End sub et tu sauvegarde en NomFichier.txt, pour le Run c'est le nom "NomFichier"que tu lance.

    La je vais arreter post si tu a un probleme, je regarderais demain.
    A+

  17. #17
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,

    Bon, je plante, je plante, je plante ... donc je fini par essayer scrupuleusement le même code que le dernier que tu as posté et je plante de même, et ce dès la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     VBComp =  vXLWorkbook.OlePropertyGet("VBProject").OlePropertyGet("VBComponents").OleFunction("Add", 1);
    Ma grande question est : ceci ne viendrais t il pas du fait que le 'VBAPRoject' est protégé par mot de passe ? Et si oui, comment fais t on pour le déproteger ?
    Question subsidiaire, histoire de pas tourner en rond pour rien :
    dans l'exemple donné, que représente vXLWorkbook ?

    Merci mille foi ... heu non, pardon, mille foies.

  18. #18
    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
    Bonsoir Sunchaser:
    Voila le code d'ouverture d'un fichier Excel avec les declarations
    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
     
    Variant vMSExcel, vXLWorkbooks, vXLWorkbook, vWorksheet;
    Variant vRange, vWorksheets;
    vMSExcel = Variant::CreateObject("Excel.Application");
    vMSExcel.OlePropertySet("Visible", true);
    Variant vFileName, vNotUsed, vSeparator, FileFormat, ReadOnlyRecommended;
    Variant CreateBackup, Password, WriteResPassword;
    Variant Mot_passe;
    // ouverture d'un fichier au format csv
    vFileName = "C:\\Documents and Settings\\blondelle\\Mes documents\\plan_gps\\PLAN_GPS\\télégraphe.csv";
    vNotUsed = Unassigned;
    vSeparator = 1;
    vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
    vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName, vNotUsed,
    vNotUsed, vSeparator);
    vXLWorkbook represente le classeur que l'on ouvre, j'ai respecte les termes de Ricky81 dans la FAQ
    Si tu essai d'ajouter du code alors que VBA est protege tu dois le deproteger avant de pouvoir travailler dessus.
    Si tu met un point d'arret avant d'ecrire ta macro tu a acces a Excel la tu deverouille ton code tu rend la main au programme ca devrai fonctionner.
    Pour deverouiller un module VBE par programme je n'ai jamais essaye mais je pense que cela doit etre possible il faut faire un poste sur la FAQ VBA pour avoir un code VBE pour verouiller/deverouiller que l'on transforme en OleExcel, apres quelques nuits d'insomnie et plusieurs crises de nerf (le seul encore en activite) on a la joie d'avoir un code qui marche.
    Sans plaisanter je vais voir de mon cote si je peu trouver quelque chose sur le verouillage du code VBE.
    Si tu a autre chose qui te tracasse dit le.
    A+

  19. #19
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Citation Envoyé par blondelle
    Si tu a autre chose qui te tracasse dit le.
    Ah, ben .... autre chose qui me tracasse : j'ai plus un rond et mon acompte ne tombera que mardi 21 ... ya personne qui peut me dépanner ?


    Trève de plaisanterie, effectivement, je crois que je vais poster du côté VBA histoire de voir ce qu'ils pensent de tout cela.

    Merci beaucoup en tout cas pour ton aide,
    @ +

  20. #20
    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
    Apres recherche j'ai trouve deux codes VBA pour verouiller/deverouiller VBE je ne les ai pas teste.
    Pour les traduire en OleExcel ca va etre coton il y a des appels Api User_32.
    J'avais oublie pour ton compte je ne peu rien faire desole.

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

Discussions similaires

  1. Pilotage OLE Excel
    Par looping dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 03/12/2007, 19h24
  2. Réponses: 12
    Dernier message: 09/01/2007, 14h28
  3. Message d'attente pendant pilotage Ole Excel
    Par yottatiger dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/09/2005, 09h14
  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