Contrôle d'Excel par MATLAB via Automation - Les objets et leur manipulation

Apprendre à interfacer MATLAB et Excel par la programmation

Cet article présente les objets VBA et leurs gestions dans le cadre du contrôle d'Excel par MATLAB via Automation. Il fait partie d'une série d'articles dont vous trouverez la liste complète sur cette page.

Après une brève introduction, le deuxième chapitre présente les principaux objets et collections VBA. Le troisième chapitre présente les méthodes et leur utilisation. Le quatrième chapitre présente les propriétés et les valeurs qu'elles peuvent prendre. Il présente également les valeurs particulières que sont les constantes VBA. Le cinquième chapitre présente les événements associés aux objets. Le sixième chapitre présente les collections et leur fonctionnement.

Votre avis et vos suggestions sur cet article m'intéressent !
Alors après votre lecture, n'hésitez pas : 17 commentaires Donner une note à l'article (5)

Article lu   fois.

L'auteur

Profil ProSite personnelPage personelle de Jérôme Briot (Dut)

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

Comme nous l'avons vu dans les précédents articles de cette série, la méthode de connexion via Automation nécessite de se former au langage de programmation orientée objet VBA.

En plus de la connaissance des objets et des collections VBA, il faut également connaître les mécanismes qui permettent de les gérer (méthodes, propriétés et événements).

Excel étant piloté par MATLAB, il existe parfois des différences ou des limitations de syntaxe qui seront présentées dans cet article.

Avant de poursuivre la lecture, il est opportun de présenter un glossaire succinct (extrait du cours Formation Excel-VBA débutant (page 106) de J-M Rabilloud) :

  • Objet : groupe de code et de données réagissant comme une entité. Le classeur, la feuille, la cellule ou le graphique sont par exemple des objets ;
  • Collections : une collection renvoie uniquement des objets de même type (à l'exception de la collection Sheets). Le nom d'une collection se termine généralement par la lettre 's'. Par exemple, une collection Workbooks peut contenir plusieurs objets Workbook ;
  • Méthode : les méthodes sont les fonctions ou les procédures d'un objet influant sur celui-ci ;
  • Propriété : méthode particulière renvoyant ou définissant les caractéristiques d'un objet. Les propriétés s'utilisent donc comme des variables, c'est-à-dire qu'on lit ou qu'on affecte leurs valeurs. Certaines propriétés, dites en « lecture seule » n'autorisent pas l'affectation de valeur ;
  • Événement : un événement est un signal émis par un objet généralement lors d'une interaction ou d'un changement d'état de celui-ci.

II. Les principaux objets et collections

L'objectif de ce chapitre n'est pas de faire une présentation exhaustive de l'ensemble des objets et des collections disponibles sous Excel. Nous nous intéresserons plutôt aux éléments que nous rencontrerons le plus souvent.

II-A. Application

L'objet Application est unique et est le père de tous les autres objets. Il représente l'application Excel (tout comme il existe les applications Word ou PowerPoint). Ses propriétés permettent de définir des paramètres généraux.

II-B. Workbook et Workbooks

L'objet Workbook correspond à un classeur de l'application Excel. L'objet Workbook est contenu dans la collection Workbooks qui contient elle-même l'ensemble des classeurs ouverts dans l'application.

II-C. Worksheet et Worksheets

L'objet Worksheet correspond à une feuille de calcul contenue dans un classeur désigné par l'objet Workbook. L'objet Worksheet est contenu dans la collection Worksheets qui contient elle-même l'ensemble des feuilles de calcul contenues dans un classeur.

II-D. Chart et Charts

L'objet Chart correspond à un graphique contenu dans une feuille de calcul ou à une feuille de graphique contenue dans un classeur désigné par l'objet Workbook. L'objet Chart peut être contenu dans la collection Charts qui ne contient elle-même que les feuilles de graphique contenues dans un classeur.

II-E. Sheets

La collection Sheets contient l'ensemble des feuilles contenues dans un classeur désigné par l'objet Workbook. La collection Sheets peut donc contenir des objets Worksheet et/ou Chart.

II-F. Range

L'objet Range correspond à une plage de cellules dans une feuille. C'est l'objet le plus utilisé lors de l'écriture ou de la lecture de données sous Excel à partir de MATLAB.

III. Les méthodes

Pour rappel, une méthode est une fonction permettant d'influer sur un objet.

Il est possible de faire la liste des méthodes d'un objet et bien entendu d'appliquer une méthode à un objet depuis MATLAB.

III-A. Lister les méthodes

Il existe trois fonctions sous MATLAB pour faire la liste des méthodes d'un objet : invoke, methods et methodsview.

Appliquons la fonction invoke à l'objet Application contenu dans la variable Excel :

 
Sélectionnez
>> Excel = actxserver('Excel.Application');
>> invoke(Excel)
    Calculate = void Calculate(handle)
    DDEExecute = void DDEExecute(handle, int32, string)
    DDEInitiate = int32 DDEInitiate(handle, string, string)
    DDEPoke = void DDEPoke(handle, int32, Variant, Variant)
    DDERequest = Variant DDERequest(handle, int32, string)
    DDETerminate = void DDETerminate(handle, int32)
    Evaluate = Variant Evaluate(handle, Variant)
    ExecuteExcel4Macro = Variant ExecuteExcel4Macro(handle, string)
    Intersect = handle Intersect(handle, handle, handle, Variant(Optional))
    Range = handle Range(handle, Variant, Variant(Optional))
    Run = Variant Run(handle, Variant(Optional))
    SendKeys = void SendKeys(handle, Variant, Variant(Optional))
    Union = handle Union(handle, handle, handle, Variant(Optional))
    ActivateMicrosoftApp = void ActivateMicrosoftApp(handle, XlMSApplication)
    AddCustomList = void AddCustomList(handle, Variant, Variant(Optional))
    CentimetersToPoints = double CentimetersToPoints(handle, double)
    CheckSpelling = bool CheckSpelling(handle, string, Variant(Optional))
    ConvertFormula = Variant ConvertFormula(handle, Variant, XlReferenceStyle, Variant(Optional))
    DeleteCustomList = void DeleteCustomList(handle, int32)
    DoubleClick = void DoubleClick(handle)
    GetCustomListContents = Variant GetCustomListContents(handle, int32)
    GetCustomListNum = int32 GetCustomListNum(handle, Variant)
    GetOpenFilename = Variant GetOpenFilename(handle, Variant(Optional))
    GetSaveAsFilename = Variant GetSaveAsFilename(handle, Variant(Optional))
    Goto = void Goto(handle, Variant(Optional))
    Help = void Help(handle, Variant(Optional))
    InchesToPoints = double InchesToPoints(handle, double)
    InputBox = Variant InputBox(handle, string, Variant(Optional))
    MailLogoff = void MailLogoff(handle)
    MailLogon = void MailLogon(handle, Variant(Optional))
    NextLetter = handle NextLetter(handle)
    OnKey = void OnKey(handle, string, Variant(Optional))
    OnRepeat = void OnRepeat(handle, string, string)
    OnTime = void OnTime(handle, Variant, string, Variant(Optional))
    OnUndo = void OnUndo(handle, string, string)
    Quit = void Quit(handle)
    RecordMacro = void RecordMacro(handle, Variant(Optional))
    RegisterXLL = bool RegisterXLL(handle, string)
    Repeat = void Repeat(handle)
    SaveWorkspace = void SaveWorkspace(handle, Variant(Optional))
    Undo = void Undo(handle)
    Volatile = void Volatile(handle, Variant(Optional))
    Wait = bool Wait(handle, Variant)
    GetPhonetic = string GetPhonetic(handle, Variant(Optional))
    CalculateFull = void CalculateFull(handle)
    FindFile = bool FindFile(handle)
    FileDialog = handle FileDialog(handle, MsoFileDialogType)
    CalculateFullRebuild = void CalculateFullRebuild(handle)
    CheckAbort = void CheckAbort(handle, Variant(Optional))
    DisplayXMLSourcePane = void DisplayXMLSourcePane(handle, Variant(Optional))
    CalculateUntilAsyncQueriesDone = void CalculateUntilAsyncQueriesDone(handle)
    SharePointVersion = int32 SharePointVersion(handle, string)
    MacroOptions = void MacroOptions(handle, Variant(Optional))

Faisons la même chose avec la fonction methods :

 
Sélectionnez
>> Excel = actxserver('Excel.Application');
>> methods(Excel)

Methods for class COM.Excel_Application:

ActivateMicrosoftApp            GetCustomListNum                SaveWorkspace                   
AddCustomList                   GetOpenFilename                 SendKeys                        
Calculate                       GetPhonetic                     SharePointVersion               
CalculateFull                   GetSaveAsFilename               Undo                            
CalculateFullRebuild            Goto                            Union                           
CalculateUntilAsyncQueriesDone  Help                            Volatile                        
CentimetersToPoints             InchesToPoints                  Wait                            
CheckAbort                      InputBox                        addproperty                     
CheckSpelling                   Intersect                       constructorargs                 
ConvertFormula                  MacroOptions                    delete                          
DDEExecute                      MailLogoff                      deleteproperty                  
DDEInitiate                     MailLogon                       events                          
DDEPoke                         NextLetter                      get                             
DDERequest                      OnKey                           interfaces                      
DDETerminate                    OnRepeat                        invoke                          
DeleteCustomList                OnTime                          load                            
DisplayXMLSourcePane            OnUndo                          move                            
DoubleClick                     Quit                            propedit                        
Evaluate                        Range                           release                         
ExecuteExcel4Macro              RecordMacro                     save                            
FileDialog                      RegisterXLL                     send                            
FindFile                        Repeat                          set                             
GetCustomListContents           Run

Il est possible d'obtenir plus de renseignements sur chacune des méthodes (liste d'arguments, valeurs retournées…) avec la fonction methods en utilisant l'argument '-full' comme ceci :

 
Sélectionnez
>> Excel = actxserver('Excel.Application');
>> methods(Excel,'-full')

Methods for class COM.Excel_Application:

ActivateMicrosoftApp(handle, XlMSApplication)
AddCustomList(handle, Variant, Variant(Optional))
Calculate(handle)
CalculateFull(handle)
CalculateFullRebuild(handle)
CalculateUntilAsyncQueriesDone(handle)
double CentimetersToPoints(handle, double)
CheckAbort(handle, Variant(Optional))
bool CheckSpelling(handle, string, Variant(Optional))
Variant ConvertFormula(handle, Variant, XlReferenceStyle, Variant(Optional))
DDEExecute(handle, int32, string)
int32 DDEInitiate(handle, string, string)
DDEPoke(handle, int32, Variant, Variant)
Variant DDERequest(handle, int32, string)
DDETerminate(handle, int32)
DeleteCustomList(handle, int32)
DisplayXMLSourcePane(handle, Variant(Optional))
DoubleClick(handle)
Variant Evaluate(handle, Variant)
Variant ExecuteExcel4Macro(handle, string)
handle FileDialog(handle, MsoFileDialogType)
bool FindFile(handle)
Variant GetCustomListContents(handle, int32)
int32 GetCustomListNum(handle, Variant)
Variant GetOpenFilename(handle, Variant(Optional))
string GetPhonetic(handle, Variant(Optional))
Variant GetSaveAsFilename(handle, Variant(Optional))
Goto(handle, Variant(Optional))
Help(handle, Variant(Optional))
double InchesToPoints(handle, double)
Variant InputBox(handle, string, Variant(Optional))
handle Intersect(handle, handle, handle, Variant(Optional))
MacroOptions(handle, Variant(Optional))
MailLogoff(handle)
MailLogon(handle, Variant(Optional))
handle NextLetter(handle)
OnKey(handle, string, Variant(Optional))
OnRepeat(handle, string, string)
OnTime(handle, Variant, string, Variant(Optional))
OnUndo(handle, string, string)
Quit(handle)
handle Range(handle, Variant, Variant(Optional))
RecordMacro(handle, Variant(Optional))
bool RegisterXLL(handle, string)
Repeat(handle)
Variant Run(handle, Variant(Optional))
SaveWorkspace(handle, Variant(Optional))
SendKeys(handle, Variant, Variant(Optional))
int32 SharePointVersion(handle, string)
Undo(handle)
handle Union(handle, handle, handle, Variant(Optional))
Volatile(handle, Variant(Optional))
bool Wait(handle, Variant)
addproperty(handle, string)
MATLAB array constructorargs(handle)
delete(handle, MATLAB array)
deleteproperty(handle, string)
MATLAB array events(handle, MATLAB array)
MATLAB array get(handle, MATLAB array, MATLAB array)
MATLAB array get(handle)
MATLAB array get(handle vector, MATLAB array, MATLAB array)
MATLAB array interfaces(handle)
MATLAB array invoke(handle)
MATLAB array invoke(handle, string, MATLAB array)
load(handle, string)
MATLAB array move(handle)
MATLAB array move(handle, MATLAB array)
propedit(handle)
release(handle, MATLAB array)
save(handle, string)
MATLAB array send(handle)
MATLAB array set(handle vector, MATLAB array, MATLAB array)
MATLAB array set(handle, MATLAB array, MATLAB array)
MATLAB array set(handle)

L'utilisation de la fonction methodsview permet d'obtenir le même résultat que précédemment mais sous la forme d'un tableau plus lisible comme le montre la figure suivante :

Image non disponible

Pour en savoir plus sur chacune des méthodes, vous pouvez vous rendre à la page correspondante de la documentation Excel. Par exemple, ici pour l'objet Application, il faut se rendre dans la sous-section « Référence > Application Object > Methods ».

On remarque que les dernières méthodes listées ne sont pas référencées dans la documentation d'Excel. Leurs noms ne commencent d'ailleurs pas par une majuscule. Ces méthodes sont donc propres à MATLAB. Dans le cas de l'objet Application, ces méthodes sont :

Type
retourné
Nom Argument
  addproperty (handle, string)
MATLAB array constructorargs (handle)
  delete (handle, MATLAB array)
  deleteproperty (handle, string)
MATLAB array events (handle, MATLAB array)
MATLAB array get (handle, MATLAB array, MATLAB array)
MATLAB array get (handle)
MATLAB array get (handle vector, MATLAB array, MATLAB array)
MATLAB array interfaces (handle)
MATLAB array invoke (handle)
MATLAB array invoke (handle, string, MATLAB array)
  load (handle, string)
MATLAB array move (handle)
MATLAB array move (handle, MATLAB array)
  propedit (handle)
  release (handle, MATLAB array)
  save (handle, string)
MATLAB array send (handle)
MATLAB array set (handle vector, MATLAB array, MATLAB array)
MATLAB array set (handle, MATLAB array, MATLAB array)
MATLAB array set (handle)

Vous trouverez des informations sur ces fonctions dans la documentation MATLAB.

III-B. Utiliser une méthode

Il existe trois syntaxes sous MATLAB pour appliquer une méthode à un objet.

Présentons ces trois syntaxes à l'aide de la méthode Quit de l'objet Application qui permet de quitter l'application.

On peut tout d'abord utiliser la fonction invoke que nous avons vu précédemment :

 
Sélectionnez
invoke(Excel,'Quit');

On peut également utiliser une syntaxe plus proche de MATLAB en considérant les méthodes comme des fonctions et en utilisant alors la syntaxe suivante :

 
Sélectionnez
Quit(Excel);

On peut enfin utiliser une syntaxe plus proche de la programmation orientée objet (et donc du VBA) comme ceci :

 
Sélectionnez
Excel.Quit;

Le choix de la syntaxe n'a aucune incidence sur le comportement du code. On veillera simplement à ne pas mélanger ces syntaxes dans un même code pour ne pas nuire à sa lisibilité.

III-C. Passage d'arguments à une méthode

Prenons l'exemple de la méthode InputBox de l'objet Application.

Cette méthode est proche de la fonction inputdlg sous MATLAB.

La documentation Excel de la méthode InputBox nous dit que la syntaxe VBA est la suivante :

 
Sélectionnez
expression .InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type)

Avec expression est la variable qui représente l'objet Application (la variable Excel dans notre cas).

On peut donc employer sous MATLAB l'une des trois syntaxes que nous avons vues précédemment.

 
Sélectionnez
Excel.InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type);
 
Sélectionnez
InputBox(Excel,Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type);
 
Sélectionnez
invoke(Excel,'InputBox',Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type);

Comme pour les fonctions MATLAB, les méthodes peuvent donc prendre des arguments d'entrées appelés « paramètres ».

La documentation Excel donne des informations sur les différents paramètres de cette méthode :

Name Required/Optional Data Type Description
Prompt Required String The message to be displayed in the dialog box. This can be a string, a number, a date, or a Boolean value (Microsoft Excel automatically coerces the value to a String before it is displayed).
Title Optional Variant The title for the input box. If this argument is omitted, the default title is « Input. »
Default Optional Variant Specifies a value that will appear in the text box when the dialog box is initially displayed. If this argument is omitted, the text box is left empty. This value can be a Range object.
Left Optional Variant Specifies an x position for the dialog box in relation to the upper-left corner of the screen, in points.
Top Optional Variant Specifies a y position for the dialog box in relation to the upper-left corner of the screen, in points.
HelpFile Optional Variant The name of the Help file for this input box. If the HelpFile and HelpContextID arguments are present, a Help button will appear in the dialog box.
HelpContextID Optional Variant The context ID number of the Help topic in HelpFile.
Type Optional Variant Specifies the return data type. If this argument is omitted, the dialog box returns text.

On remarque que certains de ces paramètres peuvent être optionnels. Dans ce cas, si on ne souhaite pas les renseigner à l'appel de la méthode, on devra obligatoirement leur assigner la valeur de variable vide [] sous MATLAB.

La documentation spécifie également la valeur que le dernier argument Type doit prendre en fonction du type de donnée que doit renvoyer la méthode :

  • 1 pour un nombre ;
  • 2 pour une chaine de caractères.

Si l'on souhaite donc demander à l'utilisateur de nous renvoyer une valeur numérique, on utilisera par exemple la syntaxe suivante sous MATLAB :

 
Sélectionnez
X = InputBox(Excel,'Entrez un nombre','Ma boite de dialogue',[],[],[],[],[],1);

Ceci fera apparaître une boîte de dialogue comme sur la figure suivante :

Image non disponible

Une fois la valeur renseignée par l'utilisateur et la validation de celle-ci, on pourra vérifier que MATLAB a bien reçu une valeur numérique :

 
Sélectionnez
>> whos X
  Name      Size            Bytes  Class     Attributes

  X         1x1                 8  double    

De même pour une chaîne de caractères en mettant la valeur 2 pour le dernier argument :

 
Sélectionnez
>> X = InputBox(Excel,'Entrez une chaîne de caractères','Ma boîte de dialogue',[],[],[],[],[],2);
>> whos X
  Name      Size            Bytes  Class    Attributes

  X         1x3                 6  char   

IV. Les propriétés

Pour rappel, une propriété est une méthode particulière renvoyant ou définissant les caractéristiques d'un objet.

IV-A. Liste des propriétés

Il existe deux fonctions pour lister les propriétés d'un objet sous MATLAB : get (COM) et inspect.

Appliquons la fonction get (COM) à l'objet Application contenu dans la variable Excel :

 
Sélectionnez
>> Excel = actxserver('Excel.Application');
>> get(Excel)
                             Application: [1x1 Interface.000208D5_0000_0000_C000_000000000046]
                                 Creator: 'xlCreatorCode'
                                  Parent: [1x1 Interface.000208D5_0000_0000_C000_000000000046]
                              ActiveCell: []
                             ActiveChart: 'Error: Object returned error code: 0x800A03EC'
                           ActivePrinter: 'Lexmark S500 Series (USB) sur Ne02:'
                             ActiveSheet: []
                            ActiveWindow: []
                          ActiveWorkbook: []
                                  AddIns: [1x1 Interface.00020858_0000_0000_C000_000000000046]
                                   Cells: 'Error: Object returned error code: 0x800A03EC'
                                  Charts: 'Error: Object returned error code: 0x800A03EC'
                                 Columns: 'Error: Object returned error code: 0x800A03EC'
                             CommandBars: [1x1 Interface.000C0302_0000_0000_C000_000000000046]
                        DDEAppReturnCode: 0
                                   Names: 'Error: Object returned error code: 0x800A03EC'
                                    Rows: 'Error: Object returned error code: 0x800A03EC'
                               Selection: []
                                  Sheets: 'Error: Object returned error code: 0x800A03EC'
                            ThisWorkbook: 'Error: Object returned error code: 0x800A03EC'
                                 Windows: [1x1 Interface.00020892_0000_0000_C000_000000000046]
                               Workbooks: [1x1 Interface.000208DB_0000_0000_C000_000000000046]
                       WorksheetFunction: [1x1 Interface.00020845_0000_0000_C000_000000000046]
                              Worksheets: 'Error: Object returned error code: 0x800A03EC'
                   Excel4IntlMacroSheets: 'Error: Object returned error code: 0x800A03EC'
                       Excel4MacroSheets: 'Error: Object returned error code: 0x800A03EC'
                  AlertBeforeOverwriting: 1
                          AltStartupPath: ''
                        AskToUpdateLinks: 1
                        EnableAnimations: 1
                             AutoCorrect: [1x1 Interface.000208D4_0000_0000_C000_000000000046]
                                   Build: 6126
                     CalculateBeforeSave: 'Error: Object returned error code: 0x800A07FA'
                             Calculation: 'Error: Object returned error code: 0x800A07FA'
                                  Caller: 'Error: Object returned error code: 0x800A07E7'
                           CanPlaySounds: 1
                         CanRecordSounds: 1
                                 Caption: 'Microsoft Excel'
                         CellDragAndDrop: 1
                        ClipboardFormats: {2x1 cell}
                  DisplayClipboardWindow: 0
                       CommandUnderlines: 'xlCommandUnderlinesOn'
                        ConstrainNumeric: 0
                    CopyObjectsWithCells: 1
                                  Cursor: 'xlDefault'
                         CustomListCount: 4
                             CutCopyMode: 0
                           DataEntryMode: -4146
                         DefaultFilePath: 'C:\Users\Jerome\Documents'
                                 Dialogs: [1x1 Interface.00020879_0000_0000_C000_000000000046]
                           DisplayAlerts: 1
                       DisplayFormulaBar: 0
                       DisplayFullScreen: 0
                    DisplayNoteIndicator: 1
                 DisplayCommentIndicator: 'xlCommentIndicatorOnly'
                      DisplayExcel4Menus: 0
                      DisplayRecentFiles: 1
                       DisplayScrollBars: 1
                        DisplayStatusBar: 1
                      EditDirectlyInCell: 1
                      EnableAutoComplete: 1
                         EnableCancelKey: 'xlInterrupt'
                             EnableSound: 0
                          FileConverters: NaN
                            FixedDecimal: 0
                      FixedDecimalPlaces: 2
                                  Height: 18
                    IgnoreRemoteRequests: 0
                             Interactive: 1
                           International: {45x1 cell}
                               Iteration: 'Error: Object returned error code: 0x800A07FA'
                                    Left: -23999
                             LibraryPath: 'C:\Program Files (x86)\Microsoft Office\Office14\LIBRARY'
                             MailSession: NaN
                              MailSystem: 'xlMAPI'
                MathCoprocessorAvailable: 1
                               MaxChange: 'Error: Object returned error code: 0x800A07FA'
                           MaxIterations: 'Error: Object returned error code: 0x800A07FA'
                          MouseAvailable: 1
                         MoveAfterReturn: 1
                MoveAfterReturnDirection: 'xlDown'
                             RecentFiles: [1x1 Interface.00024406_0000_0000_C000_000000000046]
                                    Name: 'Microsoft Excel'
                    NetworkTemplatesPath: ''
                              ODBCErrors: [1x1 Interface.0002442D_0000_0000_C000_000000000046]
                             ODBCTimeout: 45
                                OnWindow: ''
                         OperatingSystem: 'Windows (32-bit) NT 6.01'
                        OrganizationName: ''
                                    Path: 'C:\Program Files (x86)\Microsoft Office\Office14'
                           PathSeparator: '\'
                      PreviousSelections: []
                     PivotTableSelection: 0
                    PromptForSummaryInfo: 0
                          RecordRelative: 0
                          ReferenceStyle: 'xlA1'
                     RegisteredFunctions: NaN
                                RollZoom: 0
                          ScreenUpdating: 1
                     SheetsInNewWorkbook: 1
                       ShowChartTipNames: 1
                      ShowChartTipValues: 1
                            StandardFont: 'Calibri'
                        StandardFontSize: 11
                             StartupPath: 'C:\Users\Jerome\AppData\Roaming\Microsoft\Excel\XLSTART'
                               StatusBar: 0
                           TemplatesPath: 'C:\Users\Jerome\AppData\Roaming\Microsoft\Templates\'
                            ShowToolTips: 1
                                     Top: -24000
                       DefaultSaveFormat: 'xlOpenXMLWorkbook'
                       TransitionMenuKey: '/'
                 TransitionMenuKeyAction: 1
                     TransitionNavigKeys: 0
                            UsableHeight: 438
                             UsableWidth: 820.5000
                             UserControl: 0
                                UserName: 'Jerome Briot'
                                   Value: 'Microsoft Excel'
                                     VBE: [1x177 char]
                                 Version: '14.0'
                                 Visible: 1
                                   Width: 120
                          WindowsForPens: 0
                             WindowState: 'xlMinimized'
                   DefaultSheetDirection: -5003
                          CursorMovement: 1
                       ControlCharacters: 0
                            EnableEvents: 1
                              ExtendList: 1
                             OLEDBErrors: [1x1 Interface.00024446_0000_0000_C000_000000000046]
                               COMAddIns: [1x1 Interface.000C0339_0000_0000_C000_000000000046]
                       DefaultWebOptions: [1x1 Interface.00024448_0000_0000_C000_000000000046]
                             ProductCode: '{90140000-0011-0000-0000-0000000FF1CE}'
                         UserLibraryPath: 'C:\Users\Jerome\AppData\Roaming\Microsoft\AddIns\'
                        AutoPercentEntry: 1
                        LanguageSettings: [1x1 Interface.000C0353_0000_0000_C000_000000000046]
                      CalculationVersion: 145621
                    ShowWindowsInTaskbar: 1
                          FeatureInstall: 'msoFeatureInstallNone'
                                   Ready: 1
                              FindFormat: [1x1 Interface.00024450_0000_0000_C000_000000000046]
                           ReplaceFormat: [1x1 Interface.00024450_0000_0000_C000_000000000046]
                             UsedObjects: [1x1 Interface.00024451_0000_0000_C000_000000000046]
                        CalculationState: 'xlDone'
                 CalculationInterruptKey: 'xlAnyKey'
                                 Watches: [1x1 Interface.00024456_0000_0000_C000_000000000046]
                 DisplayFunctionToolTips: 1
                      AutomationSecurity: 'msoAutomationSecurityLow'
                     DisplayPasteOptions: 1
                    DisplayInsertOptions: 1
                    GenerateGetPivotData: 0
                             AutoRecover: [1x1 Interface.0002445A_0000_0000_C000_000000000046]
                                    Hwnd: 3540698
                               Hinstance: 791347200
                    ErrorCheckingOptions: [1x1 Interface.0002445B_0000_0000_C000_000000000046]
    AutoFormatAsYouTypeReplaceHyperlinks: 1
                             NewWorkbook: [1x1 Interface.000C0936_0000_0000_C000_000000000046]
                         SpellingOptions: [1x1 Interface.00024465_0000_0000_C000_000000000046]
                                  Speech: [1x1 Interface.00024466_0000_0000_C000_000000000046]
                            MapPaperSize: 1
                       ShowStartupDialog: 0
                        DecimalSeparator: ','
                      ThousandsSeparator: ' '
                     UseSystemSeparators: 1
                                ThisCell: 'Error: Object returned error code: 0x800A03EC'
                                     RTD: [1x1 Interface.0002446E_0000_0000_C000_000000000046]
           DisplayDocumentActionTaskPane: 0
            ArbitraryXMLSupportAvailable: 1
                         MeasurementUnit: 1
                   ShowSelectionFloaties: 1
                        ShowMenuFloaties: 1
                            ShowDevTools: 0
                       EnableLivePreview: 1
         DisplayDocumentInformationPanel: 0
                      AlwaysUseClearType: 1
              WarnOnFunctionNameConflict: 1
                        FormulaBarHeight: 1
              DisplayFormulaAutoComplete: 1
                       GenerateTableRefs: 'xlGenerateTableRefStruct'
                              Assistance: [1x1 Interface.4291224C_DEFE_485B_8E69_6CF8AA85CB76]
               EnableLargeOperationAlert: 1
         LargeOperationCellThousandCount: 33554
                       DeferAsyncQueries: 0
                MultiThreadedCalculation: [1x1 Interface.000244B1_0000_0000_C000_000000000046]
                 ActiveEncryptionSession: -1
              HighQualityModeForGraphics: 0
                    FileExportConverters: [1x1 Interface.000244B4_0000_0000_C000_000000000046]
                         SmartArtLayouts: [1x1 Interface.000C03C9_0000_0000_C000_000000000046]
                     SmartArtQuickStyles: [1x1 Interface.000C03CB_0000_0000_C000_000000000046]
                          SmartArtColors: [1x1 Interface.000C03CD_0000_0000_C000_000000000046]
                                 AddIns2: [1x1 Interface.000244B5_0000_0000_C000_000000000046]
                      PrintCommunication: 1
                     UseClusterConnector: 0
                        ClusterConnector: ''
                    ProtectedViewWindows: [1x1 Interface.000244CC_0000_0000_C000_000000000046]
               ActiveProtectedViewWindow: []
                             IsSandboxed: 0
                        SaveISO8601Dates: 0
                            HinstancePtr: 791347200
                          FileValidation: 'msoFileValidationDefault'
                     FileValidationPivot: 'xlFileValidationPivotDefault'

Par défaut, MATLAB ne liste pas les propriétés par ordre alphabétique. Il est possible d'utiliser la fonction orderfields conjointement à get (COM) pour remédier à ce problème :

 
Sélectionnez
>> Excel = actxserver('Excel.Application');
>> P = get(Excel);
>> orderfields(P)

ans = 

                              ActiveCell: []
                             ActiveChart: 'Error: Object returned error code: 0x800A03EC'
                 ActiveEncryptionSession: -1
                           ActivePrinter: 'Lexmark S500 Series (USB) sur Ne02:'
               ActiveProtectedViewWindow: []
                             ActiveSheet: []
                            ActiveWindow: []
                          ActiveWorkbook: []
                                  AddIns: [1x1 Interface.00020858_0000_0000_C000_000000000046]
                                 AddIns2: [1x1 Interface.000244B5_0000_0000_C000_000000000046]
                  AlertBeforeOverwriting: 1
                          AltStartupPath: ''
                      AlwaysUseClearType: 1
                             Application: [1x1 Interface.000208D5_0000_0000_C000_000000000046]
            ArbitraryXMLSupportAvailable: 1
                        AskToUpdateLinks: 1
                              Assistance: [1x1 Interface.4291224C_DEFE_485B_8E69_6CF8AA85CB76]
                             AutoCorrect: [1x1 Interface.000208D4_0000_0000_C000_000000000046]
    AutoFormatAsYouTypeReplaceHyperlinks: 1
                        AutoPercentEntry: 1
                             AutoRecover: [1x1 Interface.0002445A_0000_0000_C000_000000000046]
                      AutomationSecurity: 'msoAutomationSecurityLow'
                                   Build: 6126
                               COMAddIns: [1x1 Interface.000C0339_0000_0000_C000_000000000046]
                     CalculateBeforeSave: 'Error: Object returned error code: 0x800A07FA'
                             Calculation: 'Error: Object returned error code: 0x800A07FA'
                 CalculationInterruptKey: 'xlAnyKey'
                        CalculationState: 'xlDone'
                      CalculationVersion: 145621
                                  Caller: 'Error: Object returned error code: 0x800A07E7'
                           CanPlaySounds: 1
                         CanRecordSounds: 1
                                 Caption: 'Microsoft Excel'
                         CellDragAndDrop: 1
                                   Cells: 'Error: Object returned error code: 0x800A03EC'
                                  Charts: 'Error: Object returned error code: 0x800A03EC'
                        ClipboardFormats: {2x1 cell}
                        ClusterConnector: ''
                                 Columns: 'Error: Object returned error code: 0x800A03EC'
                             CommandBars: [1x1 Interface.000C0302_0000_0000_C000_000000000046]
                       CommandUnderlines: 'xlCommandUnderlinesOn'
                        ConstrainNumeric: 0
                       ControlCharacters: 0
                    CopyObjectsWithCells: 1
                                 Creator: 'xlCreatorCode'
                                  Cursor: 'xlDefault'
                          CursorMovement: 1
                         CustomListCount: 4
                             CutCopyMode: 0
                        DDEAppReturnCode: 0
                           DataEntryMode: -4146
                        DecimalSeparator: ','
                         DefaultFilePath: 'C:\Users\Jerome\Documents'
                       DefaultSaveFormat: 'xlOpenXMLWorkbook'
                   DefaultSheetDirection: -5003
                       DefaultWebOptions: [1x1 Interface.00024448_0000_0000_C000_000000000046]
                       DeferAsyncQueries: 0
                                 Dialogs: [1x1 Interface.00020879_0000_0000_C000_000000000046]
                           DisplayAlerts: 1
                  DisplayClipboardWindow: 0
                 DisplayCommentIndicator: 'xlCommentIndicatorOnly'
           DisplayDocumentActionTaskPane: 0
         DisplayDocumentInformationPanel: 0
                      DisplayExcel4Menus: 0
              DisplayFormulaAutoComplete: 1
                       DisplayFormulaBar: 0
                       DisplayFullScreen: 0
                 DisplayFunctionToolTips: 1
                    DisplayInsertOptions: 1
                    DisplayNoteIndicator: 1
                     DisplayPasteOptions: 1
                      DisplayRecentFiles: 1
                       DisplayScrollBars: 1
                        DisplayStatusBar: 1
                      EditDirectlyInCell: 1
                        EnableAnimations: 1
                      EnableAutoComplete: 1
                         EnableCancelKey: 'xlInterrupt'
                            EnableEvents: 1
               EnableLargeOperationAlert: 1
                       EnableLivePreview: 1
                             EnableSound: 0
                    ErrorCheckingOptions: [1x1 Interface.0002445B_0000_0000_C000_000000000046]
                   Excel4IntlMacroSheets: 'Error: Object returned error code: 0x800A03EC'
                       Excel4MacroSheets: 'Error: Object returned error code: 0x800A03EC'
                              ExtendList: 1
                          FeatureInstall: 'msoFeatureInstallNone'
                          FileConverters: NaN
                    FileExportConverters: [1x1 Interface.000244B4_0000_0000_C000_000000000046]
                          FileValidation: 'msoFileValidationDefault'
                     FileValidationPivot: 'xlFileValidationPivotDefault'
                              FindFormat: [1x1 Interface.00024450_0000_0000_C000_000000000046]
                            FixedDecimal: 0
                      FixedDecimalPlaces: 2
                        FormulaBarHeight: 1
                    GenerateGetPivotData: 0
                       GenerateTableRefs: 'xlGenerateTableRefStruct'
                                  Height: 18
              HighQualityModeForGraphics: 0
                               Hinstance: 791347200
                            HinstancePtr: 791347200
                                    Hwnd: 3540698
                    IgnoreRemoteRequests: 0
                             Interactive: 1
                           International: {45x1 cell}
                             IsSandboxed: 0
                               Iteration: 'Error: Object returned error code: 0x800A07FA'
                        LanguageSettings: [1x1 Interface.000C0353_0000_0000_C000_000000000046]
         LargeOperationCellThousandCount: 33554
                                    Left: -23999
                             LibraryPath: 'C:\Program Files (x86)\Microsoft Office\Office14\LIBRARY'
                             MailSession: NaN
                              MailSystem: 'xlMAPI'
                            MapPaperSize: 1
                MathCoprocessorAvailable: 1
                               MaxChange: 'Error: Object returned error code: 0x800A07FA'
                           MaxIterations: 'Error: Object returned error code: 0x800A07FA'
                         MeasurementUnit: 1
                          MouseAvailable: 1
                         MoveAfterReturn: 1
                MoveAfterReturnDirection: 'xlDown'
                MultiThreadedCalculation: [1x1 Interface.000244B1_0000_0000_C000_000000000046]
                                    Name: 'Microsoft Excel'
                                   Names: 'Error: Object returned error code: 0x800A03EC'
                    NetworkTemplatesPath: ''
                             NewWorkbook: [1x1 Interface.000C0936_0000_0000_C000_000000000046]
                              ODBCErrors: [1x1 Interface.0002442D_0000_0000_C000_000000000046]
                             ODBCTimeout: 45
                             OLEDBErrors: [1x1 Interface.00024446_0000_0000_C000_000000000046]
                                OnWindow: ''
                         OperatingSystem: 'Windows (32-bit) NT 6.01'
                        OrganizationName: ''
                                  Parent: [1x1 Interface.000208D5_0000_0000_C000_000000000046]
                                    Path: 'C:\Program Files (x86)\Microsoft Office\Office14'
                           PathSeparator: '\'
                     PivotTableSelection: 0
                      PreviousSelections: []
                      PrintCommunication: 1
                             ProductCode: '{90140000-0011-0000-0000-0000000FF1CE}'
                    PromptForSummaryInfo: 0
                    ProtectedViewWindows: [1x1 Interface.000244CC_0000_0000_C000_000000000046]
                                     RTD: [1x1 Interface.0002446E_0000_0000_C000_000000000046]
                                   Ready: 1
                             RecentFiles: [1x1 Interface.00024406_0000_0000_C000_000000000046]
                          RecordRelative: 0
                          ReferenceStyle: 'xlA1'
                     RegisteredFunctions: NaN
                           ReplaceFormat: [1x1 Interface.00024450_0000_0000_C000_000000000046]
                                RollZoom: 0
                                    Rows: 'Error: Object returned error code: 0x800A03EC'
                        SaveISO8601Dates: 0
                          ScreenUpdating: 1
                               Selection: []
                                  Sheets: 'Error: Object returned error code: 0x800A03EC'
                     SheetsInNewWorkbook: 1
                       ShowChartTipNames: 1
                      ShowChartTipValues: 1
                            ShowDevTools: 0
                        ShowMenuFloaties: 1
                   ShowSelectionFloaties: 1
                       ShowStartupDialog: 0
                            ShowToolTips: 1
                    ShowWindowsInTaskbar: 1
                          SmartArtColors: [1x1 Interface.000C03CD_0000_0000_C000_000000000046]
                         SmartArtLayouts: [1x1 Interface.000C03C9_0000_0000_C000_000000000046]
                     SmartArtQuickStyles: [1x1 Interface.000C03CB_0000_0000_C000_000000000046]
                                  Speech: [1x1 Interface.00024466_0000_0000_C000_000000000046]
                         SpellingOptions: [1x1 Interface.00024465_0000_0000_C000_000000000046]
                            StandardFont: 'Calibri'
                        StandardFontSize: 11
                             StartupPath: 'C:\Users\Jerome\AppData\Roaming\Microsoft\Excel\XLSTART'
                               StatusBar: 0
                           TemplatesPath: 'C:\Users\Jerome\AppData\Roaming\Microsoft\Templates\'
                                ThisCell: 'Error: Object returned error code: 0x800A03EC'
                            ThisWorkbook: 'Error: Object returned error code: 0x800A03EC'
                      ThousandsSeparator: ' '
                                     Top: -24000
                       TransitionMenuKey: '/'
                 TransitionMenuKeyAction: 1
                     TransitionNavigKeys: 0
                            UsableHeight: 438
                             UsableWidth: 820.5000
                     UseClusterConnector: 0
                     UseSystemSeparators: 1
                             UsedObjects: [1x1 Interface.00024451_0000_0000_C000_000000000046]
                             UserControl: 0
                         UserLibraryPath: 'C:\Users\Jerome\AppData\Roaming\Microsoft\AddIns\'
                                UserName: 'Jerome Briot'
                                     VBE: [1x177 char]
                                   Value: 'Microsoft Excel'
                                 Version: '14.0'
                                 Visible: 1
              WarnOnFunctionNameConflict: 1
                                 Watches: [1x1 Interface.00024456_0000_0000_C000_000000000046]
                                   Width: 120
                             WindowState: 'xlMinimized'
                                 Windows: [1x1 Interface.00020892_0000_0000_C000_000000000046]
                          WindowsForPens: 0
                               Workbooks: [1x1 Interface.000208DB_0000_0000_C000_000000000046]
                       WorksheetFunction: [1x1 Interface.00020845_0000_0000_C000_000000000046]
                              Worksheets: 'Error: Object returned error code: 0x800A03EC'

On peut obtenir la même chose sous la forme plus lisible d'une interface graphique avec la fonction inspect.

La ligne de commande est la suivante :

 
Sélectionnez
>> Excel = actxserver('Excel.Application');
>> inspect(Excel);

L'interface graphique s'ouvre alors comme le montre la figure suivante :

Image non disponible

Pour en savoir plus sur chacune des propriétés, vous pouvez vous rendre à la page correspondante de la documentation Excel. Par exemple, ici pour l'objet Application, il faut se rendre dans la sous-section « Référence > Application Object > Properties ».

IV-B. Récupérer et affecter des valeurs

L'affectation et la récupération de valeurs peuvent s'effectuer soit en utilisant respectivement les fonctions set (COM) et get (COM) soit en utilisant les règles de syntaxe de la programmation orientée objet.

Par exemple, pour modifier la visibilité de la fenêtre d'Excel, on peut soit utiliser la fonction set (COM) comme ceci :

 
Sélectionnez
set(Excel, 'Visible', true);

Ou encore avec cette autre syntaxe :

 
Sélectionnez
Excel.set('Visible', true);

On peut utiliser la syntaxe de la programmation orientée objet comme ceci :

 
Sélectionnez
Excel.Visible = true;

On notera que la fonction set (COM) permet de modifier plusieurs propriétés d'un même objet en un seul appel :
set(<objet>, <propriété 1>, <valeur 1>, <propriété 2>, <valeur 2>);
ou encore :
<objet>.set(<propriété 1>, <valeur 1>, <propriété 2>, <valeur 2>);

Dans le même esprit, pour récupérer la valeur de la propriété Visible de l'objet Application contenu dans la variable Excel, on peut utiliser la fonction get (COM) comme ceci :

 
Sélectionnez
v = get(Excel, 'Visible');

Ou encore avec cette autre syntaxe :

 
Sélectionnez
v = Excel.get('Visible');

On peut également utiliser la syntaxe de la programmation orientée objet comme ceci :

 
Sélectionnez
v = Excel.Visible

Pour finir, il est également possible de modifier la valeur d'une propriété de manière interactive en utilisant la fonction inspect comme le montre la vidéo suivante dans laquelle la barre de formule et la barre de statut sont modifiées :


Cliquez pour visualiser la vidéo



Les actions effectuées dans cette vidéo sont équivalentes aux lignes de code MATLAB suivantes :

 
Sélectionnez
>> set(Excel,'DisplayFormulaBar',true)
>> set(Excel,'DisplayFormulaBar',false)
>> set(Excel,'DisplayStatusBar',false)
>> set(Excel,'DisplayStatusBar',true)

IV-C. Types des valeurs

Il existe quatre types de valeurs possibles pour l'affectation d'une propriété d'un objet :

  • chaîne de caractères ;
  • valeur numérique ;
  • valeur booléenne ;
  • constante.

Les commandes étant passées depuis MATLAB, la syntaxe est donc la même que sous MATLAB.

Les chaînes de caractères sont passées entre guillemets simples comme ceci :

 
Sélectionnez
Excel.ActiveSheet.Range('E5').Name = 'aaaaa';

Pour les valeurs numériques, le séparateur décimal est le point et les valeurs avec exposant telles que 1E3 sont autorisées.

Par exemple :

 
Sélectionnez
Excel.ActiveSheet.Range('A:A').ColumnWidth = 5.2;

Pour les valeurs booléennes, il est possible d'utiliser les valeurs booléennes true ou false, ou les valeurs numériques correspondantes 1 ou 0.

Par exemple :

 
Sélectionnez
Excel.Visible = true;

Ou alternativement :

 
Sélectionnez
Excel.Visible = 1;

Les constantes sont des valeurs enregistrées et connues de VBA. Ce sont des énumérations qui peuvent s'exprimer soit sous forme littérale, soit sous forme de valeur numérique.

Par exemple :

 
Sélectionnez
Excel.ActiveSheet.Range('C5').BorderAround(-4115,-4138,-4105);

Les valeurs -4115, -4138 et -4105 sont des constantes connues par VBA. Elles permettent ici (sous Excel 2010) d'obtenir une bordure en tirets (-4115), d'épaisseur moyenne (-4138) et de couleur noire (-4105) sur la cellule C5.

IV-D. Les constantes et leurs valeurs

Trouver le nom des constantes VBA et leurs valeurs numériques peut être assez fastidieux.

IV-D-1. Identifier les valeurs des constantes

Comme nous l'avons vu dans le chapitre précédent, une constante peut-être soit définie par une valeur littérale, soit par une valeur numérique.

Prenons l'exemple de la propriété Cursor de l'objet Application. La valeur de cette propriété détermine la forme du pointeur de la souris dans Excel.

La documentation Excel spécifie que la valeur de cette propriété doit appartenir à l'énumération XlMousePointer. La documentation de cette énumération nous donne les quatre constantes suivantes :

Name Value Description
xlDefault -4143 The default pointer.
xlIBeam 3 The I-beam pointer.
xlNorthwestArrow 1 The northwest-arrow pointer.
xlWait 2 The hourglass pointer.

Si nous souhaitons utiliser le curseur en forme de sablier indiquant un travail en cours, nous devrions pouvoir employer soit la valeur littérale xlWait, soit la valeur numérique 2.

Il est également possible de se servir de la fonction set (COM) pour lister les éléments de l'énumération comme ceci :

 
Sélectionnez
>> set(Excel,'Cursor')

ans = 

    'xlIBeam'
    'xlDefault'
    'xlNorthwestArrow'
    'xlWait'

On peut également utiliser la fonction inspect comme le montre la figure suivante :

Image non disponible

IV-D-2. S'aider de l'enregistreur de macros

Il existe un moyen très simple d'identifier le nom et la valeur numérique d'une constante en s'aidant de l'enregistreur de macros. L'utilisation de cet outil est expliquée dans le tutoriel Généralités au chapitre Exploiter l'enregistrement de macros Excel.

Déterminons par exemple le nom et la valeur de la constante qui permet de centrer le contenu d'une cellule en procédant comme ceci :

  • exécuter l'enregistreur de macros ;
  • se placer dans une cellule ;
  • centrer son contenu à l'aide du bouton approprié dans la barre d'outil ;
  • arrêter l'enregistreur de macros ;
  • ouvrir l'éditeur de macros.

Le code VBA suivant devrait apparaitre :

 
Sélectionnez
Sub Macro1()
'
' Macro1 Macro
'

'
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
End Sub

Le nom de la constante qui nous intéresse ici est donc « xlCenter ».

Pour trouver la valeur numérique correspondante, il suffit de placer le pointeur de la souris sur « xlCenter », puis de faire un clic droit pour faire apparaitre un menu contextuel et y choisir « Info express » comme ceci :

Image non disponible

La valeur numérique de la constante apparait alors comme le montre la capture ci-dessous :

Image non disponible

La constante qui permet de centrer le contenu d'une cellule a donc pour nom « xlCenter » et pour valeur numérique -4108.

IV-D-3. Utiliser les constantes

L'utilisation de la forme numérique d'une constante sous MATLAB est simple et similaire à VBA.

En reprenant l'exemple du chapitre précédent, les codes suivants transforment l'apparence du curseur de l'application en sablier :

 
Sélectionnez
Excel.Cursor = 2;
 
Sélectionnez
set(Excel,'Cursor',2);
 
Sélectionnez
Excel.set('Cursor',2);

Ces codes fonctionnent parfaitement mais ils sont néanmoins peu lisibles. En effet, à la lecture du code, rien ne relie la valeur 2 à la forme du curseur.

Une solution simple consiste à définir une variable MATLAB avec le même nom que la constante et à utiliser cette variable plutôt que la valeur numérique correspondante dans le code MATLAB :

 
Sélectionnez
xlWait = 2;
set(Excel,'Cursor',xlWait);

La lisibilité du code est améliorée.

Bien que l'utilisation des valeurs numériques soit simple, on préférerait pouvoir employer directement la valeur littérale de la constante. Ceci est tout à fait possible mais il faut impérativement mettre cette valeur entre guillemets simples comme pour une chaîne de caractères sous MATLAB.

Les trois codes présentés précédemment deviennent donc :

 
Sélectionnez
Excel.Cursor = 'xlWait';
 
Sélectionnez
set(Excel,'Cursor','xlWait');
 
Sélectionnez
Excel.set('Cursor','xlWait');

L'utilisation de la valeur littérale d'une constante ne fonctionne pas toujours. Si vous rencontrez ce problème, vous pourrez toujours utiliser la valeur numérique.

V. Les événements

Pour rappel, un événement est un signal émis par un objet généralement lors d'une interaction ou d'un changement d'état de celui-ci.

V-A. Liste des événements

La liste des événements attachés à un objet peut être obtenue à l'aide de la fonction events (COM).

Il est toujours possible d'utiliser soit la syntaxe à la manière des fonctions MATLAB comme ceci :

 
Sélectionnez
>> Excel = actxserver('Excel.Application');
>> events(Excel)
    NewWorkbook = void NewWorkbook(handle Wb)
    SheetSelectionChange = void SheetSelectionChange(handle Sh, handle Target)
    SheetBeforeDoubleClick = void SheetBeforeDoubleClick(handle Sh, handle Target, bool Cancel)
    SheetBeforeRightClick = void SheetBeforeRightClick(handle Sh, handle Target, bool Cancel)
    SheetActivate = void SheetActivate(handle Sh)
    SheetDeactivate = void SheetDeactivate(handle Sh)
    SheetCalculate = void SheetCalculate(handle Sh)
    SheetChange = void SheetChange(handle Sh, handle Target)
    WorkbookOpen = void WorkbookOpen(handle Wb)
    WorkbookActivate = void WorkbookActivate(handle Wb)
    WorkbookDeactivate = void WorkbookDeactivate(handle Wb)
    WorkbookBeforeClose = void WorkbookBeforeClose(handle Wb, bool Cancel)
    WorkbookBeforeSave = void WorkbookBeforeSave(handle Wb, bool SaveAsUI, bool Cancel)
    WorkbookBeforePrint = void WorkbookBeforePrint(handle Wb, bool Cancel)
    WorkbookNewSheet = void WorkbookNewSheet(handle Wb, handle Sh)
    WorkbookAddinInstall = void WorkbookAddinInstall(handle Wb)
    WorkbookAddinUninstall = void WorkbookAddinUninstall(handle Wb)
    WindowResize = void WindowResize(handle Wb, handle Wn)
    WindowActivate = void WindowActivate(handle Wb, handle Wn)
    WindowDeactivate = void WindowDeactivate(handle Wb, handle Wn)
    SheetFollowHyperlink = void SheetFollowHyperlink(handle Sh, handle Target)
    SheetPivotTableUpdate = void SheetPivotTableUpdate(handle Sh, handle Target)
    WorkbookPivotTableCloseConnection = void WorkbookPivotTableCloseConnection(handle Wb, handle Target)
    WorkbookPivotTableOpenConnection = void WorkbookPivotTableOpenConnection(handle Wb, handle Target)
    WorkbookSync = void WorkbookSync(handle Wb, Variant SyncEventType)
    WorkbookBeforeXmlImport = void WorkbookBeforeXmlImport(handle Wb, handle Map, string Url, bool IsRefresh, bool Cancel)
    WorkbookAfterXmlImport = void WorkbookAfterXmlImport(handle Wb, handle Map, bool IsRefresh, Variant Result)
    WorkbookBeforeXmlExport = void WorkbookBeforeXmlExport(handle Wb, handle Map, string Url, bool Cancel)
    WorkbookAfterXmlExport = void WorkbookAfterXmlExport(handle Wb, handle Map, string Url, Variant Result)
    WorkbookRowsetComplete = void WorkbookRowsetComplete(handle Wb, string Description, string Sheet, bool Success)
    AfterCalculate = void AfterCalculate()
    SheetPivotTableAfterValueChange = void SheetPivotTableAfterValueChange(handle Sh, handle TargetPivotTable, handle TargetRange)
    SheetPivotTableBeforeAllocateChanges = void SheetPivotTableBeforeAllocateChanges(handle Sh, handle TargetPivotTable, int32 ValueChangeStart, int32 ValueChangeEnd, bool Cancel)
    SheetPivotTableBeforeCommitChanges = void SheetPivotTableBeforeCommitChanges(handle Sh, handle TargetPivotTable, int32 ValueChangeStart, int32 ValueChangeEnd, bool Cancel)
    SheetPivotTableBeforeDiscardChanges = void SheetPivotTableBeforeDiscardChanges(handle Sh, handle TargetPivotTable, int32 ValueChangeStart, int32 ValueChangeEnd)
    ProtectedViewWindowOpen = void ProtectedViewWindowOpen(handle Pvw)
    ProtectedViewWindowBeforeEdit = void ProtectedViewWindowBeforeEdit(handle Pvw, bool Cancel)
    ProtectedViewWindowBeforeClose = void ProtectedViewWindowBeforeClose(handle Pvw, Variant Reason, bool Cancel)
    ProtectedViewWindowResize = void ProtectedViewWindowResize(handle Pvw)
    ProtectedViewWindowActivate = void ProtectedViewWindowActivate(handle Pvw)
    ProtectedViewWindowDeactivate = void ProtectedViewWindowDeactivate(handle Pvw)
    WorkbookAfterSave = void WorkbookAfterSave(handle Wb, bool Success)
    WorkbookNewChart = void WorkbookNewChart(handle Wb, handle Ch)

On peut également toujours utiliser la syntaxe de la programmation orientée objet comme ceci :

 
Sélectionnez
>> Excel = actxserver('Excel.Application');
>> Excel.events
    NewWorkbook = void NewWorkbook(handle Wb)
    SheetSelectionChange = void SheetSelectionChange(handle Sh, handle Target)
    SheetBeforeDoubleClick = void SheetBeforeDoubleClick(handle Sh, handle Target, bool Cancel)
    SheetBeforeRightClick = void SheetBeforeRightClick(handle Sh, handle Target, bool Cancel)
    SheetActivate = void SheetActivate(handle Sh)
    SheetDeactivate = void SheetDeactivate(handle Sh)
    SheetCalculate = void SheetCalculate(handle Sh)
    SheetChange = void SheetChange(handle Sh, handle Target)
    WorkbookOpen = void WorkbookOpen(handle Wb)
    WorkbookActivate = void WorkbookActivate(handle Wb)
    WorkbookDeactivate = void WorkbookDeactivate(handle Wb)
    WorkbookBeforeClose = void WorkbookBeforeClose(handle Wb, bool Cancel)
    WorkbookBeforeSave = void WorkbookBeforeSave(handle Wb, bool SaveAsUI, bool Cancel)
    WorkbookBeforePrint = void WorkbookBeforePrint(handle Wb, bool Cancel)
    WorkbookNewSheet = void WorkbookNewSheet(handle Wb, handle Sh)
    WorkbookAddinInstall = void WorkbookAddinInstall(handle Wb)
    WorkbookAddinUninstall = void WorkbookAddinUninstall(handle Wb)
    WindowResize = void WindowResize(handle Wb, handle Wn)
    WindowActivate = void WindowActivate(handle Wb, handle Wn)
    WindowDeactivate = void WindowDeactivate(handle Wb, handle Wn)
    SheetFollowHyperlink = void SheetFollowHyperlink(handle Sh, handle Target)
    SheetPivotTableUpdate = void SheetPivotTableUpdate(handle Sh, handle Target)
    WorkbookPivotTableCloseConnection = void WorkbookPivotTableCloseConnection(handle Wb, handle Target)
    WorkbookPivotTableOpenConnection = void WorkbookPivotTableOpenConnection(handle Wb, handle Target)
    WorkbookSync = void WorkbookSync(handle Wb, Variant SyncEventType)
    WorkbookBeforeXmlImport = void WorkbookBeforeXmlImport(handle Wb, handle Map, string Url, bool IsRefresh, bool Cancel)
    WorkbookAfterXmlImport = void WorkbookAfterXmlImport(handle Wb, handle Map, bool IsRefresh, Variant Result)
    WorkbookBeforeXmlExport = void WorkbookBeforeXmlExport(handle Wb, handle Map, string Url, bool Cancel)
    WorkbookAfterXmlExport = void WorkbookAfterXmlExport(handle Wb, handle Map, string Url, Variant Result)
    WorkbookRowsetComplete = void WorkbookRowsetComplete(handle Wb, string Description, string Sheet, bool Success)
    AfterCalculate = void AfterCalculate()
    SheetPivotTableAfterValueChange = void SheetPivotTableAfterValueChange(handle Sh, handle TargetPivotTable, handle TargetRange)
    SheetPivotTableBeforeAllocateChanges = void SheetPivotTableBeforeAllocateChanges(handle Sh, handle TargetPivotTable, int32 ValueChangeStart, int32 ValueChangeEnd, bool Cancel)
    SheetPivotTableBeforeCommitChanges = void SheetPivotTableBeforeCommitChanges(handle Sh, handle TargetPivotTable, int32 ValueChangeStart, int32 ValueChangeEnd, bool Cancel)
    SheetPivotTableBeforeDiscardChanges = void SheetPivotTableBeforeDiscardChanges(handle Sh, handle TargetPivotTable, int32 ValueChangeStart, int32 ValueChangeEnd)
    ProtectedViewWindowOpen = void ProtectedViewWindowOpen(handle Pvw)
    ProtectedViewWindowBeforeEdit = void ProtectedViewWindowBeforeEdit(handle Pvw, bool Cancel)
    ProtectedViewWindowBeforeClose = void ProtectedViewWindowBeforeClose(handle Pvw, Variant Reason, bool Cancel)
    ProtectedViewWindowResize = void ProtectedViewWindowResize(handle Pvw)
    ProtectedViewWindowActivate = void ProtectedViewWindowActivate(handle Pvw)
    ProtectedViewWindowDeactivate = void ProtectedViewWindowDeactivate(handle Pvw)
    WorkbookAfterSave = void WorkbookAfterSave(handle Wb, bool Success)
    WorkbookNewChart = void WorkbookNewChart(handle Wb, handle Ch)

Encore une fois, la liste des événements n'apparaît pas par ordre alphabétique. Pour résoudre ce problème, il suffit d'utiliser la fonction orderfields comme ceci :

 
Sélectionnez
>> Excel = actxserver('Excel.Application');
>> E = events(Excel);
>> orderfields(E)

ans = 

                          AfterCalculate: 'void AfterCalculate()'
                             NewWorkbook: 'void NewWorkbook(handle Wb)'
             ProtectedViewWindowActivate: 'void ProtectedViewWindowActivate(handle Pvw)'
          ProtectedViewWindowBeforeClose: 'void ProtectedViewWindowBeforeClose(handle Pvw, Variant Reason, bool Cancel)'
           ProtectedViewWindowBeforeEdit: 'void ProtectedViewWindowBeforeEdit(handle Pvw, bool Cancel)'
           ProtectedViewWindowDeactivate: 'void ProtectedViewWindowDeactivate(handle Pvw)'
                 ProtectedViewWindowOpen: 'void ProtectedViewWindowOpen(handle Pvw)'
               ProtectedViewWindowResize: 'void ProtectedViewWindowResize(handle Pvw)'
                           SheetActivate: 'void SheetActivate(handle Sh)'
                  SheetBeforeDoubleClick: 'void SheetBeforeDoubleClick(handle Sh, handle Target, bool Cancel)'
                   SheetBeforeRightClick: 'void SheetBeforeRightClick(handle Sh, handle Target, bool Cancel)'
                          SheetCalculate: 'void SheetCalculate(handle Sh)'
                             SheetChange: 'void SheetChange(handle Sh, handle Target)'
                         SheetDeactivate: 'void SheetDeactivate(handle Sh)'
                    SheetFollowHyperlink: 'void SheetFollowHyperlink(handle Sh, handle Target)'
         SheetPivotTableAfterValueChange: [1x92 char]
    SheetPivotTableBeforeAllocateChanges: [1x136 char]
      SheetPivotTableBeforeCommitChanges: [1x134 char]
     SheetPivotTableBeforeDiscardChanges: [1x122 char]
                   SheetPivotTableUpdate: 'void SheetPivotTableUpdate(handle Sh, handle Target)'
                    SheetSelectionChange: 'void SheetSelectionChange(handle Sh, handle Target)'
                          WindowActivate: 'void WindowActivate(handle Wb, handle Wn)'
                        WindowDeactivate: 'void WindowDeactivate(handle Wb, handle Wn)'
                            WindowResize: 'void WindowResize(handle Wb, handle Wn)'
                        WorkbookActivate: 'void WorkbookActivate(handle Wb)'
                    WorkbookAddinInstall: 'void WorkbookAddinInstall(handle Wb)'
                  WorkbookAddinUninstall: 'void WorkbookAddinUninstall(handle Wb)'
                       WorkbookAfterSave: 'void WorkbookAfterSave(handle Wb, bool Success)'
                  WorkbookAfterXmlExport: 'void WorkbookAfterXmlExport(handle Wb, handle Map, string Url, Variant Result)'
                  WorkbookAfterXmlImport: 'void WorkbookAfterXmlImport(handle Wb, handle Map, bool IsRefresh, Variant Result)'
                     WorkbookBeforeClose: 'void WorkbookBeforeClose(handle Wb, bool Cancel)'
                     WorkbookBeforePrint: 'void WorkbookBeforePrint(handle Wb, bool Cancel)'
                      WorkbookBeforeSave: 'void WorkbookBeforeSave(handle Wb, bool SaveAsUI, bool Cancel)'
                 WorkbookBeforeXmlExport: 'void WorkbookBeforeXmlExport(handle Wb, handle Map, string Url, bool Cancel)'
                 WorkbookBeforeXmlImport: [1x92 char]
                      WorkbookDeactivate: 'void WorkbookDeactivate(handle Wb)'
                        WorkbookNewChart: 'void WorkbookNewChart(handle Wb, handle Ch)'
                        WorkbookNewSheet: 'void WorkbookNewSheet(handle Wb, handle Sh)'
                            WorkbookOpen: 'void WorkbookOpen(handle Wb)'
       WorkbookPivotTableCloseConnection: 'void WorkbookPivotTableCloseConnection(handle Wb, handle Target)'
        WorkbookPivotTableOpenConnection: 'void WorkbookPivotTableOpenConnection(handle Wb, handle Target)'
                  WorkbookRowsetComplete: [1x86 char]
                            WorkbookSync: 'void WorkbookSync(handle Wb, Variant SyncEventType)'

V-B. Gestion des événements

Sous MATLAB, la gestion des événements Excel passe par la fonction registerevent.

Prenons un exemple précis afin d'étudier la syntaxe de ces événements sous MATLAB.

Nous allons utiliser l'événement NewWorkbook de l'objet Application. Cet événement se déclenche dès qu'un nouveau classeur est créé.

La syntaxe à utiliser est la suivante :

 
Sélectionnez
registerevent(Excel,{'NewWorkbook', @event});

Ou encore :

 
Sélectionnez
Excel.registerevent({'NewWorkbook', @event});

Les trois paramètres sont :

  • Excel : variable identifiant l'objet qui émet le signal ;
  • 'NewWorkbook' : nom de l'événement à gérer ;
  • @event : fonction MATLAB à exécuter lorsque l'événement survient.

Le code MATLAB de la fonction @event doit impérativement être le suivant :

 
Sélectionnez
function event(varargin)

% Mettre le code à exécuter ici

Le contenu du tableau de cellules varargin peut être exploité avec le code suivant :

 
Sélectionnez
function event(varargin)

fprintf('Object name:\n');
disp(varargin{1});

fprintf('Event ID: %d\n',varargin{2});

fprintf('Event Argument List:\n');
for n = 3:nargin-2
    disp(varargin{n});    
end

fprintf('Event structure:\n');
disp(varargin{end-1});

fprintf('Event Name: %s\n',varargin{end});

Revenons à l'événement NewWorkbook de l'objet Application et demandons simplement à MATLAB d'afficher le message « Nouveau classeur » lors de la création d'un nouveau classeur. Pour ce faire, nous utiliserons le code suivant :

 
Sélectionnez
function Excel = testevents

Excel = actxserver('Excel.Application');
Excel.Visible = 1;

registerevent(Excel,{'NewWorkbook', @event});

function event(varargin)

disp('Nouveau classeur')

La vidéo suivante montre le résultat de la capture de cet événement par MATLAB :


Cliquez pour visualiser la vidéo



La mention « Nouveau classeur » apparaît bien dans le Command Window de MATLAB lorsqu'un nouveau classeur est créé sous Excel.

VI. Les collections

Pour rappel, une collection renvoie uniquement des objets de même type (à l'exception de la collection Sheets).

Par exemple, la collection Worksheets regroupe toutes les feuilles de calcul alors que la collection Sheets regroupe à la fois les feuilles de calcul et les feuilles de graphique.

VI-A. Nombre d'éléments d'une collection

Pour connaître le nombre d'éléments contenus dans une collection, on utilise la propriété Count.

Prenons l'exemple d'un classeur contenant 3 feuilles de calcul et 1 feuille de graphique :

Image non disponible

Le nombre total de feuilles sera donné par :

 
Sélectionnez
>> Excel.Sheets.Count

ans =

     4

Alors que le nombre de feuilles de calcul sera donné par :

 
Sélectionnez
>> Excel.Worksheets.Count

ans =

     3

VI-B. Accéder aux éléments

Pour accéder à chaque élément d'une collection, on itère sur le nombre d'éléments contenus dans la propriété Item.

Par exemple, pour accéder successivement à toutes les feuilles  de calcul :

 
Sélectionnez
nfeuilles = Excel.Worksheets.Count;
for n = 1:nfeuilles
   Excel.Worksheets.Item(n).Name
end

Ce qui, appliqué à l'exemple précédent, renvoie bien :

 
Sélectionnez
ans =

Feuil1


ans =

Feuil2


ans =

Feuil3

On peut aussi utiliser le nom de l'objet si sa propriété Name est renseignée.

Par exemple, pour nommer la première feuille Exemple :

 
Sélectionnez
Excel.Worksheets.Item(1).Name = 'Exemple';

Ce qui donne bien :

Image non disponible

Il est alors possible d'accéder à cette feuille en particulier comme ceci :

 
Sélectionnez
>> Excel.Worksheets.Item('Exemple')
 
ans =
 
    Interface.000208D8_0000_0000_C000_000000000046

VII. Conclusion

Vous avez maintenant une vision d'ensemble des objets et des collections VBA et de leurs utilisations. Vous pouvez interagir avec les objets à l'aide de leurs méthodes. Vous savez comment modifier leurs propriétés. Et vous savez même comment capter des signaux en provenance de ces objets.

Vous pouvez maintenant poursuivre votre lecture par l'article intitulé Contrôle d'Excel par MATLAB via Automation - Gestion des feuilles qui présente la gestion des feuilles d'un classeur Excel.

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

  

Copyright © 2013-2014 Jerome Briot. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.