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 :

Creation d'une macro dans un fichier Excel depuis Delphi


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut Creation d'une macro dans un fichier Excel depuis Delphi
    Bonjour,

    Je crée depuis Delphi (2007), un fichier Excel (Excel2007) avec les résultats de mon application : multiples pages, tableaux, graphiques.

    Je souhaiterais créer sur une des pages un bouton qui me permette de modifier 2 séries de données sur un graph (ces séries me permettent de définir un gabarit dans lequel doit se trouver mes résultats)

    Pour la création du bouton, c'est bon avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MaShape:=MaFeuille.Shapes.AddOLEObject('Forms.CommandButton.1', EmptyParam, EmptyParam,
                                     EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                     10,10, 110,40);
    Avec Par contre, je n'ai pas trouver le moyen de modifier le 'caption' du bouton

    Pour ce qui est de la macro, j'ai trouve l'exemple suivant (ne serait-ce que pour tester) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Module := ExcelApplication.VBE.ActiveVBProject.VBComponents.Add(1);
      Module.CodeModule.InsertLines(1,'Public sub test()');
      Module.CodeModule.InsertLines(2,'ShowMsg("Bonjour")');
      Module.CodeModule.InsertLines(3,'End Sub');
    avec : seulement a ce moment la, j'ai l'erreur suivante :
    'Programmatic access to visual Basic Project is not trusted'

    en cherchant sur le forum, j'ai trouve qu'il fallait activer sous Visual Basic la référence :
    Microsoft Visual Basic for Applications Extensibility x.xx

    J'ai bien cette référence mais je ne peux l'activer que manuellement et pour un fichier a la fois.

    Est-ce qu'il existe un moyen d'activer cette référence a chaque fichier que je crée ? ou existe il un manière détournée de creer un macro dynamiquement et de la lier au bouton crée ?

    Par avance, merci de vos réponses.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    Regarde du coté des parametres du centre de sécurité d'Excel dans le menu option. (désolé j'ai pas la version francaise)
    Excel Options > Trust Center > Trust Center Settings... > Check Trust access to the VBA project object model

    vérifie aussi la base de registre pour la clé HKCU\Software\Microsoft\Office\" + oExcel.Application.Version + @"\Excel\Security

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    Merci pour l'info ,

    Avec la modification dans le trust center je n'ai plus le problème avec la référence

    Maintenant, j'ai l'erreur suivante qui apparait 'subscript out of range'

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    en fait je n'ai plus le problème avec la référence
    mais il n’écris rien dans module1 quand je vais voir sous visual basic

    quelqu'un a-t'il une solution ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    Tu arrive a exécuter la macro ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExcelApplication.Run('test');
    Il faut donner un nom aussi a ton module après le add

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Module.Name := 'MonModule1';
    Sinon si ton module existe déja
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    VBProj := ExcelApplication.VBE.ActiveVBProject;
    Module := VBProj.VBComponents('Module1');

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    en écrivant le code comme je le mettais plus haut, il n'ecrivait rien dans le module mais en mettant la macro dans un Memo et en le passant comme suit, ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      Module := ExcelApplication.VBE.ActiveVBProject.VBComponents.Add(1);
      Module.name:='MonModule';
      for I :=0 to Form1.Memo1.Lines.Count-1 do
        begin
              Module.CodeModule.InsertLines(I+1,Form1.Memo1.Lines.Strings[I]);
        end;
      ExcelApplication.Run('MaMacro');
    avec dans le Memo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub MaMacro()
    '
    'MaMacro Macro
    '
    ShowMsg("Bonjour")
    '
    End Sub
    Saurais-tu comment attacher ma macro MaMacro au click de mon bouton et comment changer le nom de ce bouton ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    Si ton Bouton s'appelle MaMacro alors son evenement click doit se nommer MaMacro_Click()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MaShape:=MaFeuille.Shapes.AddOLEObject('Forms.CommandButton.1', EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, 10,10, 110,40);
     
    MaShape.Name := 'MaMacro'
    MaShape.Object.Caption := 'Cliquer ici'
    et ta macro devra etre comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub MaMacro_Click()
    '
    'MaMacro Macro
    '
    ShowMsg("Bonjour")
    '
    End Sub

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    dans,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaShape.Object.Caption := 'Cliquer ici'
    Il ne connait pas 'Object'. Quand je fais, 'MaShape.' le menu déroulant qui s'affiche ne propose pas 'Object'

    J'avais trouve une autre façon de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaShape.TextFrame.Characters.Text := 'Cliquer ici';
    mais il veut des paramètres a 'Characters' : Start et length :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaShape.TextFrame.Characters(Start:=1, length:=11).Text := 'Cliquer ici';
    et en les tournant dans tous les sens je n'arrive pas a le faire fonctionner : par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaShape.TextFrame.Characters(1,11).Text := 'Cliquer ici';
    Ca veut bien compiler mais a l’exécution il marque 'Member not found'

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    Tu peux créer et controller ton bouton dans une macro VBA et tu fait l'appel a partir de Delphi

    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
    Sub CreerBoutonEtCode() 
         ' Declarer les variables
        Dim i As Long, Hght As Long 
        Dim Name As String, NName As String 
         ' Definir les propriétés du button
        i = 0 
        Hght = 305.25 
         ' Definir le nom du bouton
        NName = "cmdAction" & i 
         ' Tester si le bouton existe alors incrementer son nom
        For Each OLEObject In ActiveSheet.OLEObjects 
            If Left(OLEObject.Name, 9) = "cmdAction" Then 
                Name = Right(OLEObject.Name, Len(OLEObject.Name) - 9) 
                If Name >= i Then 
                    i = Name + 1 
                End If 
                NName = "cmdAction" & i 
                Hght = Hght + 27 
            End If 
        Next 
         ' Ajouter button
        Dim myCmdObj As OLEObject, N% 
        Set myCmdObj = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _ 
        Link:=False, DisplayAsIcon:=False, Left:=52.5, Top:=Hght, _ 
        Width:=202.5, Height:=26.25) 
         ' Definir le nom du bouton
        myCmdObj.Name = NName 
         ' Define le text du buttons
        myCmdObj.Object.Caption = "Cliquer ici" 
         ' Inserer le code du clique pour le bouton
        With ThisWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule 
            N = .CountOfLines 
            .InsertLines N + 1, "Private Sub " & NName & "_Click()" 
            .InsertLines N + 2, vbNewLine 
            .InsertLines N + 3, vbTab & "MsgBox(" & """" & "Bouton ok!" & """" & " & vbCrLf &" & _ 
            """" & "Mettre le code ici!" & """" & " & vbCrLf & " & """" & "This is " & """" & _ 
            "& " & """" & NName & """" & ")" 
            .InsertLines N + 4, vbNewLine 
            .InsertLines N + 5, "End Sub" 
        End With 
    End Sub

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    Effectivement, pourquoi pas le créer par une macro

    Merci de m'avoir répondu.

    Je marque le sujet comme résolu, mais si quelqu'un sait comment le faire depuis delphi sans passer par une macro (modifier le nom du bouton créé depuis delphi et lui affecter une macro), je suis preneur : juste pour avoir la solution.

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    Essai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaShape.TextFrame.Characters(emptyparam,emptyparam).Caption := 'Cliquer ici';

  12. #12
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    J'ai toujours l'erreur : 'Member not found'

    Dans ta macro précédente qui fonctionne bien, comment je peux lui dire de lancer une macro 'MaMacro()' que j'aurais défini préalablement au lieu de définir une macro complète
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .InsertLines N + 3, vbTab & "MaMacro()"
    ne fonctionne pas

  13. #13
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    Dans le code VBA, fait l'appel a ta macro avec Call ou bien juste le nom de la macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     .InsertLines N + 3, vbTab & "Call MaMacro()"
    ou bien directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .InsertLines N + 3, vbTab & "MaMacro()"

  14. #14
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     .InsertLines N + 3, vbTab & "Call MaMacro()"
    fonctionne.

    merci.

  15. #15
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    Je comprends pas pourquoi tu as l'erreur, quand tu écris dans l'éditeur de Delphi cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaShape.TextFrame.Characters(emptyparam,emptyparam).
    L'éditeur te propose une liste de propriétés, non? entre autre Caption dans cette liste ou non?

  16. #16
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    il me propose bien caption, je peux compiler mais a l’exécution il m'indique toujours 'member not found'

  17. #17
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    Peut etre il faut faire un cast, je ne suis pas sur mais a tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (MaShape as button).caption:='Cliquer ici';

  18. #18
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    Cette fois-ci j'ai l'erreur : 'Interface not supported'

  19. #19
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    Ca devrait marcher de cette facon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var MaShape : variant;
    ...
    ...
    MaShape := Excel.Application.Worksheets[1].Shapes.AddShape(1, 0, 0, 450, 200);
    MaShape.textframe.characters.text:='Cliquer Ici';
    ...
    ...
    Ou bien d'une autre maniere
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var MaShape : variant;
    ...
    ...
    MaShape := Excel.Application.Worksheets[1].ActiveSheet.Buttons.Add(159, 48, 132, 33);
    MaShape.name:='MonBouton';
    MaShape.OnAction = 'MaMacro';
     
    Excel.Application.Worksheets[1].ActiveSheet.Shapes('MonBouton').Characters.Text = 'Cliquer Ici';
    ...
    ...

  20. #20
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Points : 24
    Points
    24
    Par défaut
    la première solution ne fonctionne pas

    pour la 2eme la commande 'add' de 'buttons' n'est pas disponible

    Tant pis ce n'est pas grave ça marche déjà très bien par ta macro

    Merci

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/08/2017, 16h55
  2. [XL-2013] Import d'une macro dans un fichier excel
    Par mr_hodor dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/08/2014, 10h24
  3. Réponses: 4
    Dernier message: 16/07/2013, 12h48
  4. Réponses: 1
    Dernier message: 11/02/2011, 14h14
  5. Réponses: 1
    Dernier message: 08/10/2008, 15h30

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