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 :

Placer un bouton clickable dans une cellule Excel


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 10
    Par défaut Placer un bouton clickable dans une cellule Excel
    Bonjour,
    Je voudrais placer un bouton dans une cellule Excel.
    J'ai vu que l'instruction Shapes.AddOLEObject permettait de créer un bouton mais je ne maitrise pas les paramètres pour placer celui-ci dans une cellule.
    Merci pour votre aide précieuse.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    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 086
    Par défaut
    Avez-vous un code plus complet sur votre tentative ?

    https://learn.microsoft.com/fr-fr/of...s.addoleobject

    Avec cet exemple VB

    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set myDocument = Worksheets(1) 
    myDocument.Shapes.AddOLEObject Left:=100, Top:=100, _ 
     Width:=100, Height:=200, _ 
     ClassType:="Forms.CommandButton.1"

    Une recherche rapide on trouve immédiatement ceci

    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);
    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é
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Par défaut
    salut teste ça il faut ajuster ExcelSheet.Buttons.Add et mettre le nom d'une bonne macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm6.Button21Click(Sender: TObject);
    var ExcelSheet, ExcelApplication : variant;
    begin
      ExcelApplication := CreateOLEObject('Excel.Application');
      ExcelApplication.Visible := True;
     
      ExcelSheet := ExcelApplication.ActiveSheet;
      ExcelSheet.Buttons.Add(10, 10, 80, 30).Select;
      ExcelSheet.Selection.OnAction := 'Macro1';
    end;

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    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 086
    Par défaut
    Merci à papyvore,

    @hescallier, en combinant la réponse de papyvore et la mienne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MaShape:=MaFeuille.Shapes.AddOLEObject('Forms.CommandButton.1', EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, EmptyParam,
      10,10, 110,40);
    MaShape.Select; 
    MaShape.OnAction := 'Macro1';

    Et si tu veux cibler aligner sur une cellule, alors attention c'est empirique, non testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    C3 :=MaFeuille.Cells[3, 3]; // ou MaFeuille.Range['C3']
     
    MaShape:=MaFeuille.Shapes.AddOLEObject('Forms.CommandButton.1', EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, EmptyParam,
      C3.Left, C3.Top, C3.Width, C3.Height);
    MaShape.Select; 
    MaShape.OnAction := 'Macro1';
    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é
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Par défaut
    je viens de tester pour placer dans une cellule ça fonctionne chez moi

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
     
    // créer une instance ole excel
    procedure CreateExcelOLE(NomFic: string);
    var
      ExcelFileName: String; // chemin + nom du fichier
      ExcelApplication: Variant; // objet excel application
      ExcelWorkbook: Variant; // objet classeur
      ExcelWorksheet: Variant; // objet feuil
     
    begin
      // chemin + nom du fichier ici utilsez l'extension .xlsx
      ExcelFileName := System.SysUtils.GetCurrentDir + '\' + NomFic;
     
      ExcelApplication := Null;
      ExcelWorkbook := Null;
      ExcelWorksheet := Null;
      Hyper := false;
      try
        // create Excel OLE
        ExcelApplication := CreateOleObject('Excel.Application');
        ExcelApplication.DisplayAlerts := false;
      except
        ExcelApplication := Null;
        // add error/exception handling code as desired
      end;
     
      if not FileExists(ExcelFileName) then
      begin
        If VarIsNull(ExcelApplication) = false then
        begin
          try
            ExcelApplication.Visible := false; // True;
            // définissez sur False si vous ne souhaitez pas voir l'activité en arrière-plan
            ExcelApplication.DisplayAlerts := false;
            // garantit que les boîtes de dialogue de messages n'interrompent pas le flux de votre processus d'automatisation.
            // Il peut être utile de définir la valeur True pendant les tests et le débogage.
     
            // Open Excel Workbook
            try
              ExcelWorkbook := ExcelApplication.WorkBooks.Add(-4167);
              // reference
              // https://docs.microsoft.com/en-us/office/vba/api/excel.workbooks.add
              // https://docs.microsoft.com/en-us/office/vba/api/excel.xlsheettype
            except
              ExcelWorkbook := Null;
              // ajouter le code de gestion des erreurs/exceptions comme vous le souhaitez
            end;
     
            If VarIsNull(ExcelWorkbook) = false then
            begin
              // connectez-vous à la feuille de calcul Excel à l'aide du handle ExcelApplication ou ExcelWorkbook
              try
                // Ajoutez une nouvelle feuille de calcul. La nouvelle feuille de calcul devient le premier onglet (en partant de la gauche).
                // ExcelWorkbook.WorkSheets.add(Null, Null, 1, -4167);
                // connectez-vous à la feuille de calcul Excel à l'aide du handle ExcelApplication ou ExcelWorkbook
                // ExcelWorksheet := ExcelWorkbook.WorkSheets[1];
                // [ExcelWorkbook.Worksheets.Count];
     
                // reference
                // https://docs.microsoft.com/en-us/office/vba/api/Excel.Worksheets.Item
              except
                ExcelWorksheet := Null;
                // ajouter le code de gestion des erreurs/exceptions comme vous le souhaitez
              end;
            end;
          finally
     
          end;
     
        end;
      end
      else
      begin
        try
          ExcelApplication := GetActiveOleObject('Excel.Application');
        except
          ExcelApplication := CreateOleObject('Excel.Application');
        end;
        ExcelApplication.Visible := True;
        ExcelWorkbook := ExcelApplication.WorkBooks;
        ExcelWorkbook := ExcelWorkbook.Open(ExcelFileName);
     
        If ExcelApplication.WorkBooks.Count >= 1 Then
          Classeur := ExcelApplication.WorkBooks[1];
        // ExcelApplication.DisplayAlerts := false;
      end;
    end;
     
    procedure TForm6.Button21Click(Sender: TObject);
    var ExcelSheet, ExcelApplication : variant;
    CellRange: variant;
      CellLeft, CellTop, CellWidth, CellHeight: Double;
    begin
      CreateExcelOLE('Teste.xlsx');
     
      ExcelSheet := ExcelApplication.ActiveSheet;
     
      cellRange := ExcelSheet.Range['G2', 'H2'];
      CellLeft := CellRange.Left;
      CellTop := CellRange.Top;
      CellWidth := CellRange.Width;
      CellHeight := CellRange.Height;
     
      ExcelSheet.Buttons.Add(CellLeft, CellTop, CellWidth, CellHeight).Select;
      ExcelSheet.Selection.OnAction := 'Macro1';
    end;

  6. #6
    Invité
    Invité(e)
    Par défaut
    OnAction n'est pas disponible dans les objets crées par AddOLEObject ces derniers, étant des ActiveX, ont leurs propre liste d'événements malheureusement pas moyen pour les définir par programmation à part utiliser un module de classe coté VBA et meme avec ca les evenements peuvent se détacher si le classeur entre en mode création pour recompiler le code ou pour ajouter un nouveau objet.

    Les contrôles ActiveX sont désactivés par défaut dans Office 365 et Office 2024

    https://support.microsoft.com/en-us/...c-eca072525d64
    Dernière modification par Invité ; 08/04/2025 à 16h58.

  7. #7
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 10
    Par défaut Bouton dans cellule Excel
    Citation Envoyé par hescallier Voir le message
    Bonjour,
    Je voudrais placer un bouton dans une cellule Excel.
    J'ai vu que l'instruction Shapes.AddOLEObject permettait de créer un bouton mais je ne maitrise pas les paramètres pour placer celui-ci dans une cellule.
    Merci pour votre aide précieuse.
    Merci pour vos réponses qui m'ont permis d'avancer.
    Le code suivant insère un bouton dans la cellule 'C2'.
    uneCellule := vWorksheet.Range['C2'];
    vWorksheet.Buttons.Add(uneCellule.Left, uneCellule.Top, uneCellule.Width, uneCellule.Height).Select;
    Il me reste à affecter le bon texte (Caption) !

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Par défaut
    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
    procedure TForm6.Button21Click(Sender: TObject);
    var ExcelSheet : variant;  // , ExcelApplication
        CellRange: variant;
      CellLeft, CellTop, CellWidth, CellHeight: Double;
      Btn: Variant;
    begin
    //  CreateExcelOLE('Teste.xlsx');
    {  AddButton('Feuil1', 'B11', 'B11', 'Mano', 'Macro5');   }
      ExcelSheet := ExcelApplication.ActiveSheet;
     
      cellRange := ExcelSheet.Range['K4', 'K4'];
      CellLeft := CellRange.Left;
      CellTop := CellRange.Top;
      CellWidth := CellRange.Width;
      CellHeight := CellRange.Height;
     
      Btn := ExcelSheet.Buttons.Add(CellLeft, CellTop, CellWidth, CellHeight);
      Btn.OnAction := 'Macro1';
      Btn.Caption := 'HoHo';
      // 1 = déplace et redimensionne avec les cellules
      // 2 = déplace mais ne redimensionne pas
      // 3 = ne bouge pas
      Btn.Placement := 1;
     
     
    end;
    ne met pas select derrière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExcelSheet.Buttons.Add(CellLeft, CellTop, CellWidth, CellHeight);
    sinon tous les boutons sont sélectionnés et prennent le même caption et macro moi j'avais choisi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExcelSheet.Range['K4', 'K4'];
    si tu veux un plus gros bouton sur plusieurs cellules par ex
    si tu veux utiliser voici la procédure que j'utilise tu l'adapte à ton besoin
    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
    procedure AddButton(NomFeuil, Cell1, Cell2, Caption, NomMacro: string);
    // Ex  AddButton('Feuil1', 'B11', 'B11', 'Titre', 'Macro1');
    var ExcelSheet : variant;  // , ExcelApplication
        CellRange: variant;
      CellLeft, CellTop, CellWidth, CellHeight: Double;
      Btn: Variant;
    begin
      ExcelWorksheet := ExcelWorkbook.Worksheets.Item[NomFeuil];
      ExcelWorksheet.Select;
     
      cellRange := ExcelWorksheet.Range[Cell1, Cell2];
      CellLeft := CellRange.Left;
      CellTop := CellRange.Top;
      CellWidth := CellRange.Width;
      CellHeight := CellRange.Height;
     
    {  ExcelWorksheet.Buttons.Add(CellLeft, CellTop, CellWidth, CellHeight);
      //ExcelSheet.Buttons.select;   //selectionne tous les buttons pas utile
     
      ExcelWorksheet.Buttons.OnAction := NomMacro;
     
      ExcelWorksheet.select.Buttons;
      ExcelWorksheet.Buttons.Caption := Caption; //met le même caption à tous les buttons !!!!   }
     
      Btn := ExcelWorksheet.Buttons.Add(CellLeft, CellTop, CellWidth, CellHeight);
      Btn.OnAction := NomMacro;
      Btn.Caption := Caption;
      // 1 = déplace et redimensionne avec les cellules
      // 2 = déplace mais ne redimensionne pas
      // 3 = ne bouge pas
      Btn.Placement := 1;
    end;

  9. #9
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 10
    Par défaut Macro associée à un bouton dans Excel
    Avec votre aide précieuse pour le pilotage d’Excel par Delphi j’ai réussi à placer un bouton dans une cellule et à modifier le texte (caption) et sa couleur.
    Je voudrai maintenant lui associer une action c’est-à-dire :
    - Créer une macro,
    - Lier cette macro au bouton.
    J’ai bien lu plusieurs articles sur le sujet mais ne comprends pas tout !
    Merci pour votre aide.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Par défaut
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    unit Unit11;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ComObj, Vcl.StdCtrls;
     
    type
      TForm11 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        procedure CreateExcelWithMacro;
      end;
     
    var
      Form11: TForm11;
     
    implementation
     
    {$R *.dfm}
    var
      ExcelApp, Workbook : OleVariant;
     
    procedure TForm11.CreateExcelWithMacro;
    var
      Module: OleVariant;
      VBAcode: string;
    begin
      // Lancer Excel
      ExcelApp := CreateOleObject('Excel.Application');
      ExcelApp.Visible := True; // Optionnel
     
      // Créer un nouveau classeur
      Workbook := ExcelApp.Workbooks.Add;
     
      // Ajouter un module VBA
      Module := Workbook.VBProject.VBComponents.Add(1); // 1 = Module standard
     
      // Définir le code VBA de la macro
      VBAcode :=
        'Sub HelloWorld()' + #13#10 +
        '    MsgBox "Bonjour depuis Delphi!"' + #13#10 +
        'End Sub';
     
      // Insérer le code dans le module
      Module.CodeModule.AddFromString(VBAcode);
     
      // Sauvegarder le fichier avec macros (.xlsm)
      Workbook.SaveAs('C:\Temp\DelphiMacro.xlsm', 52); // 52 = xlOpenXMLWorkbookMacroEnabled
     
      // Optionnel : exécuter la macro
      // ExcelApp.Run('HelloWorld');
     
    end;
     
    procedure TForm11.Button1Click(Sender: TObject);
    begin
      CreateExcelWithMacro;
    end;
     
    procedure TForm11.Button2Click(Sender: TObject);
    var ExcelSheet  : variant;
        CellRange: variant;
      CellLeft, CellTop, CellWidth, CellHeight: Double;
      Btn: Variant;
    begin
     
      ExcelSheet := ExcelApp.ActiveSheet;
     
      cellRange := ExcelSheet.Range['K4', 'K4'];
      CellLeft := CellRange.Left;
      CellTop := CellRange.Top;
      CellWidth := CellRange.Width;
      CellHeight := CellRange.Height;
     
      Btn := ExcelSheet.Buttons.Add(CellLeft, CellTop, CellWidth, CellHeight);
      Btn.OnAction := 'HelloWorld';
      Btn.Caption := 'Execute Macro';
      // 1 = déplace et redimensionne avec les cellules
      // 2 = déplace mais ne redimensionne pas
      // 3 = ne bouge pas
      Btn.Placement := 1;
     
     
    end;
     
    end.
    voilà un exemple qui fonctionne mais préalablement il faut activer l'accès au VBA programmé dans Excel ,tu ouvre excel et tu vas dans les options fichier et tu coche la case
    "Accorder l’accès approuvé au modèle objet de projet VBA"
    sinon tu auras une erreur et la macro ne sera pas enregistré

Discussions similaires

  1. Placer plusieurs lignes dans une cellule Excel
    Par hescallier dans le forum Delphi
    Réponses: 4
    Dernier message: 18/02/2025, 13h59
  2. Réponses: 1
    Dernier message: 25/03/2013, 08h39
  3. Remplacer un texte dans une cellule Excel à partir d'un point donné
    Par tonyC dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/04/2006, 19h05
  4. [VBA-PP]fonction qui écrit un chiffre dans une cellule excel
    Par alpking dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 26/04/2006, 19h34
  5. Réponses: 4
    Dernier message: 15/04/2005, 15h25

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