IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Pilotage OLE d'Excel à partir de Delphi

Ce document a pour but de présenter le pilotage OLE d'Excel depuis une application Delphi.

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

Avant-propos

Ce document a pour seul but de présenter une façon simple de piloter Excel, en restant indépendant des composants de Delphi.
Le code a été écrit et testé avec Delphi 7 et Excel 2000 français.

Les commentaires au code sont minimaux, ceci n'étant pas une explication du fonctionnement d'Excel, mais simplement l'interfaçage avec Delphi et le code étant, je pense, explicite par lui-même.

L'utilisation du Variant est quasi générale. Pour rappel, le type Variant est un type de variable qui a la particularité de pouvoir ne pas être déterminé au moment de la compilation, et même de changer en cours d'exécution du programme. Son plus grand intérêt, à mon sens, est qu'il peut aussi contenir une interface vers un objet OLE et donner accès aux propriétés, procédures et fonctions de celui-ci.

I. Démarrer Excel

Avant de pouvoir piloter Excel, il est nécessaire d'ajouter ComObj à la clause Uses.

I-A. Ouvrir une nouvelle instance

 
Sélectionnez
var
    vMSExcel : variant;
                    
begin
    vMSExcel := CreateOleObject('Excel.Application');
    vMSExcel.Visible := true;
end;

La propriété Visible permet de spécifier si Excel est affiché à l'écran ou s'il reste en tâche de fond.

I-B. Se connecter à une instance existante

 
Sélectionnez
var
    vMSExcel : variant;
                    
begin
    vMSExcel := GetActiveOleObject('Excel.Application');
    vMSExcel.Visible := true;
end;

Le code suivant permet donc de lancer Excel, s’il n'est pas déjà actif ou de se connecter à l'instance existante éventuelle.

 
Sélectionnez
try
    vMSExcel := GetActiveOleObject('Excel.Application');
except
    vMSExcel := CreateOleObject('Excel.Application');
end;

II. Fermer Excel

 
Sélectionnez
var
    vMXEcel : variant;
                
begin
    vMSExcel.Quit;
    vMSExcel := unassigned;
end;

Positionner vMSExcel à unassigned permet de libérer le Variant.

III. Créer un nouveau classeur

 
Sélectionnez
var
    vXLWorkbook, vXLWorkbooks : variant;
                
begin
    vXLWorkbooks := vMSExcel.Workbooks;
    vXLWorkbook := vXLWorkbooks.Add;
end;

Excel tient à jour une liste de tous les classeurs ouverts, dans une collection appelée WorkBooks.
Ouvrir un nouveau classeur revient simplement à ajouter un nouvel élément à cette collection. La fonction Add renvoie un Variant faisant référence au nouveau classeur.

IV. Ouvrir un classeur existant

IV-A. Ouvrir un classeur simple

 
Sélectionnez
var
    vXLWorkbooks, vXLWorkbook : variant;
    aFileName : AnsiString;
                    
begin
    aFileName := 'c:\Home\Sources\Delphi\classeur1.xls';
    vXLWorkbooks := vMSExcel.Workbooks;
    vXLWorkbook := vXLWorkbooks.Open(vFileName);
end;

Ouvrir un classeur se fait sur le même principe que la création, à savoir l'ajout à la collection Workbooks d'un nouvel élément, non plus avec la fonction Add, mais la fonction Open.

IV-B. Ouvrir un classeur en lecture seule

 
Sélectionnez
var
    vXLWorkbooks, vXLWorkbook, vReadOnly, vLink : variant;
    aFileName : AnsiString;
                    
begin
    aFileName := 'c:\Home\Sources\Delphi\classeur1.xls';
    vLink := unassigned;
    vReadOnly := true;
    vXLWorkbooks := vMSExcel.Workbooks;
    vXLWorkbook := vXLWorkbooks.Open(vFileName, vLink, vReadOnly);
end;

Ouvrir un classeur en lecture seule se fait en passant le 3e paramètre de la fonction Open avec une valeur true.
La fonction Open possède une série de paramètres dont la liste exhaustive se trouve dans l'aide de VBA pour Excel.
À noter que les paramètres facultatifs doivent être passés comme des Variants Unassigned, et non des nil, comme on pourrait le penser au premier abord.

IV-C. Ouvrir un fichier csv

 
Sélectionnez
var
    aFileName : AnsiString;
    vXLWorkbooks, vXLWorkbook, vUnused, vSeparator : variant;
                    
begin
    aFileName := 'c:\Home\Sources\Delphi\Excel\text.csv';
    vUnused := unassigned;
    vSeparator := 4;
    vXLWorkbooks := vMSExcel.Workbooks;
    vXLWorkbook := vXLWorkbooks.Open(aFileName, vUnused, vUnused, vSeparator);
end;

vSeparator spécifie le caractère utilisé comme séparateur de champs dans le fichier texte à importer.
Pour connaître les différentes valeurs possibles, voir la documentation de VBA d'Excel.

V. Enregistrer un classeur

V-A. Enregistrer le classeur sous le même nom

Une fois le classeur ouvert, pour l'enregistrer, il suffit de faire :

 
Sélectionnez
var
    vXLWorkbook : variant;
                    
begin
    vXLWorkbook.Save;
end;

V-B. Enregistrer le classeur sous un autre nom

Une fois le classeur ouvert, pour l'enregistrer en changeant de nom, il suffit de faire :

 
Sélectionnez
var
    aFileName : AnsiString;
    vXLWorkbook : variant;
                    
begin
    aFileName := 'c:\Home\Sources\Delphi\Excel\SaveAs.xls';
    vXLWorkbook.SaveAs(aFileName);
end;

VI. Fermer un classeur

 
Sélectionnez
var
    vSaveChanges : variant;
    aFileName : AnsiString;
                    
begin
    vSaveChanges := true;
    aFileName := 'c:\Home\Sources\Delphi\Excel\SaveAs.xls';
    vXLWorkbook.Close(vSaveChanges, aFileName);
end;

Le 1er paramètre de la fonction Close permet de spécifier si les modifications sont enregistrées :

  • true : les modifications sont enregistrées ;
  • false : les modifications ne sont PAS enregistrées ;
  • Unassigned : demande à l'utilisateur.

Le 2e paramètre de la fonction Close permet de spécifier le nom sous lequel le classeur sera enregistré.

Ces deux paramètres sont facultatifs.

VII. Accéder à une feuille de calcul

 
Sélectionnez
var
    aSheetName : AnsiString;
    vWorksheet : variant;
                
begin
    aSheetName := 'Feuil2';
    vWorksheet := vXLWorkbook.WorkSheets[aSheetName];
end;

VIII. Accéder à une cellule

 
Sélectionnez
var
    aRange : AnsiString;
    vCell : variant;
                
begin
    aRange := 'D3';
    vCell := vWorksheet.Range[aRange];
end;

IX. Lire la valeur d'une cellule

 
Sélectionnez
var
    aValue, aRange : AnsiString;
    vCell : variant;
                
begin
    aRange := 'D3';
    vCell := vWorksheet.Range[aRange];
    aValue := vCell.Value;
end;

X. Modifier la valeur d'une cellule

 
Sélectionnez
var
    aRange, aValue : AnsiString;
    vCell : variant;
                
begin
    aRange := 'D3';
    vCell := vWorksheet.Range[aRange];
    aValue := 'nouveau';
    vCell.Value := aValue;
end;

Mettre à jour une plage de cellules peut se faire de la même façon , simplement en spécifiant une sélection à la place d'une cellule seule

 
Sélectionnez
vRange := 'D3';

devient alors

 
Sélectionnez
vRange := 'C3:E5';

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Ce document est issu de https://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.