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.
Version imprimable
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:
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:
1
2
3 MaShape:=MaFeuille.Shapes.AddOLEObject('Forms.CommandButton.1', EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, 10,10, 110,40);
salut teste ça il faut ajuster ExcelSheet.Buttons.Add et mettre le nom d'une bonne macro
Code:
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:
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:
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';
je viens de tester pour placer dans une cellule ça fonctionne chez moi
Code:
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
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èreCode:
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 choisiCode:ExcelSheet.Buttons.Add(CellLeft, CellTop, CellWidth, CellHeight);
si tu veux un plus gros bouton sur plusieurs cellules par exCode:ExcelSheet.Range['K4', 'K4'];
si tu veux utiliser voici la procédure que j'utilise tu l'adapte à ton besoinCode:
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 caseCode:
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éCitation:
"Accorder l’accès approuvé au modèle objet de projet VBA"