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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
| 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;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
procedure CreateExcelWithMacro;
procedure AjouterUserFormDansExcel;
procedure InsererMacroDansFeuille;
end;
var
Form11: TForm11;
implementation
{$R *.dfm}
var
ExcelApp, Workbook : OleVariant;
procedure TForm11.InsererMacroDansFeuille;
var
// ExcelApp, Workbook,
VBComponent: OleVariant;
MacroCode: string;
begin
// Lancer Excel
// ExcelApp := CreateOleObject('Excel.Application');
// ExcelApp.Visible := True;
// Créer un nouveau classeur
// Workbook := ExcelApp.Workbooks.Add;
// Accéder au module de code de la première feuille ("Feuil1")
VBComponent := Workbook.VBProject.VBComponents.Item('Feuil1'); // ou "Sheet1" selon Excel
{ // Code à insérer ('ThisWorkbook');
MacroCode :=
'Private Sub Workbook_Open()' + #13#10 +
' MsgBox "Ce classeur vient dêtre ouvert."' + #13#10 +
'End Sub'; }
// Code à insérer ('Feuil1')
MacroCode :=
'Private Sub Worksheet_SelectionChange(ByVal Target As Range)' + #13#10 +
' MsgBox "Tu as sélectionné " & Target.Address' + #13#10 +
'End Sub';
// Écrire dans le module
VBComponent.CodeModule.AddFromString(MacroCode);
end;
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
{1 Module standard :
Contient des fonctions et procédures générales (Sub, Function)
Cest ce quon utilise pour ajouter une macro "classique"
Exemple : Sub HelloWorld()
2 Module de classe :
Contient du code orienté objet (Class)
Tu peux créer des objets, définir des propriétés, méthodes, etc.
3 UserForm :
Crée une interface utilisateur (formulaire avec boutons, zones de texte...)
Tu peux ensuite modifier son design et son code via VBA ou Delphi
100 Module document :
Lié aux objets comme Feuil1 ou ThisWorkbook
Ne peut pas être ajouté dynamiquement
Tu peux y accéder, mais pas le créer depuis Add(...)
voir procedure InsererMacroDansFeuille}
// 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');
// Libérer Excel si nécessaire
// ExcelApp.Quit;
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;
procedure TForm11.AjouterUserFormDansExcel;
var
VBComp, Btn, CodeModule: OleVariant;
Ligne: Integer;
begin
if VarIsNull(ExcelApp) = false then
begin
// Lancer Excel
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.Visible := True;
// Créer un nouveau classeur
Workbook := ExcelApp.Workbooks.Add;
end;
// Ajouter un UserForm
VBComp := Workbook.VBProject.VBComponents.Add(3); // UserForm
VBComp.Name := 'MonFormulaire';
VBComp.Designer.Caption := 'Formulaire depuis Delphi';
// Ajouter un bouton au UserForm
Btn := VBComp.Designer.Controls.Add('Forms.CommandButton.1');
Btn.Name := 'btnBonjour';
Btn.Caption := 'Dire Bonjour';
Btn.Left := 20;
Btn.Top := 20;
Btn.Width := 100;
// Ajouter du code VBA derrière le bouton
CodeModule := VBComp.CodeModule;
Ligne := CodeModule.CountOfLines + 1;
CodeModule.InsertLines(Ligne,
'Private Sub btnBonjour_Click()' + sLineBreak +
' MsgBox "Salut ! Ce formulaire a été généré avec Delphi."' + sLineBreak +
'End Sub');
// Ajouter une macro dans un module standard pour afficher le formulaire
var ModStandard := Workbook.VBProject.VBComponents.Add(1); // Module standard
ModStandard.CodeModule.AddFromString(
'Sub AfficherFormulaire()' + sLineBreak +
' MonFormulaire.Show' + sLineBreak +
'End Sub');
// Exécuter la macro pour montrer le UserForm
ExcelApp.Run('AfficherFormulaire');
end;
procedure TForm11.Button3Click(Sender: TObject);
begin
AjouterUserFormDansExcel;
end;
procedure TForm11.Button4Click(Sender: TObject);
begin
InsererMacroDansFeuille;
end;
end. |
Partager