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 :
>> 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 :
>> 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 :
>> 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 :
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 :
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 :
Quit(Excel);
On peut enfin utiliser une syntaxe plus proche de la programmation orientée objet (et donc du VBA) comme ceci :
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 :
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.
Excel.InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type);
InputBox(Excel,Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type);
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 :
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 :
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 :
>> 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 :
>> 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 :
>> 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 :
>> 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 :
>> Excel = actxserver('Excel.Application'
);
>> inspect(Excel);
L'interface graphique s'ouvre alors comme le montre la figure suivante :
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 :
set(Excel, 'Visible'
, true);
Ou encore avec cette autre syntaxe :
Excel.set('Visible'
, true);
On peut utiliser la syntaxe de la programmation orientée objet comme ceci :
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 :
v = get(Excel, 'Visible'
);
Ou encore avec cette autre syntaxe :
v = Excel.get('Visible'
);
On peut également utiliser la syntaxe de la programmation orientée objet comme ceci :
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 :
Les actions effectuées dans cette vidéo sont équivalentes aux lignes de code MATLAB suivantes :
>> 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 :
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 :
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 :
Excel.Visible = true;
Ou alternativement :
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 :
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 :
>> set(Excel,'Cursor'
)
ans =
'xlIBeam'
'xlDefault'
'xlNorthwestArrow'
'xlWait'
On peut également utiliser la fonction inspect comme le montre la figure suivante :
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 :
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 :
La valeur numérique de la constante apparait alors comme le montre la capture ci-dessous :
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 :
Excel.Cursor = 2;
set(Excel,'Cursor'
,2);
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 :
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 :
Excel.Cursor = 'xlWait'
;
set(Excel,'Cursor'
,'xlWait'
);
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 :
>> 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 :
>> 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 :
>> 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 :
registerevent(Excel,{'NewWorkbook'
, @event});
Ou encore :
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 :
function
event(varargin)
% Mettre le code à exécuter ici
Le contenu du tableau de cellules varargin peut être exploité avec le code suivant :
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 :
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 :
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 :
Le nombre total de feuilles sera donné par :
>> Excel.Sheets.Count
ans =
4
Alors que le nombre de feuilles de calcul sera donné par :
>> 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 :
nfeuilles = Excel.Worksheets.Count;
for
n = 1:nfeuilles
Excel.Worksheets.Item(n).Name
end
Ce qui, appliqué à l'exemple précédent, renvoie bien :
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 :
Excel.Worksheets.Item(1).Name = 'Exemple'
;
Ce qui donne bien :
Il est alors possible d'accéder à cette feuille en particulier comme ceci :
>> 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.