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.
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.
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
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;
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
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;
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.
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) !
ne met pas select derrière
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;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.Buttons.Add(CellLeft, CellTop, CellWidth, CellHeight);si tu veux un plus gros bouton sur plusieurs cellules par ex
Code : Sélectionner tout - Visualiser dans une fenêtre à part ExcelSheet.Range['K4', 'K4'];
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;
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.
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
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.sinon tu auras une erreur et la macro ne sera pas enregistré"Accorder l’accès approuvé au modèle objet de projet VBA"
Partager