I. Introduction▲
Lors de l'interfaçage d'Excel et MATLAB, certaines différences peuvent nuire au bon fonctionnement du code. Il est nécessaire de bien comprendre ces différences afin d'améliorer la robustesse des codes.
C'est le rôle du développeur de s'assurer de la compatibilité de son code avec les machines cibles où celui-ci sera exécuté.
II. Versions d'Excel et du système d'exploitation▲
Afin de minimiser les risques d'incompatibilité sur les machines où le code devra être exécuté, il peut être utile d'en connaître la version de Microsoft Office et du système d'exploitation.
II-A. Système d'exploitation▲
Pour connaître le nom et la version du système d'exploitation, on récupère la valeur de la propriété OperatingSystem de l'objet Application.
Par exemple avec Excel 2010 (32 bits) sous Windows 7 (64 bits), on obtient :
>> Excel.OperatingSystem
ans =
Windows (32-bit) NT 6.01
Vous trouverez une liste des équivalences entre les noms et les numéros de version ici ou encore ici.
II-B. Microsoft Office▲
Pour connaître la version de la suite Microsoft Office utilisée, on récupère la valeur de la propriété Version de l'objet Application.
Par exemple avec Excel 2010, on obtient :
>> Excel.Version
ans =
14.0
Voici un bref récapitulatif des versions de Microsoft Office :
Nom | Version |
Office XP | 10.0 |
Office 2003 | 11.0 |
Office 2007 | 12.0 |
Office 2010 | 14.0 |
II-C. Format de fichier▲
Historiquement, les fichiers Excel étaient des fichiers binaires et portaient l'extension .xls.
Depuis la version 2007 (12.0), deux autres formats de fichiers sont disponibles :
- .xlsb : format binaire ;
- .xlsx : format XML (format par défaut depuis Excel 2007).
Le format d'un classeur peut être déterminé en vérifiant la valeur de la propriété FileFormat de l'objet Workbook contenant ce classeur.
Lors de l'enregistrement d'un classeur, il est possible de définir le type d'enregistrement à l'aide de la méthode SaveAs de l'objet Workbook contenant ce classeur. Nous ne nous intéresserons ici qu'au deuxième argument FileFormat qui prend une des valeurs de l'énumération XlFileFormat et dont la constante par défaut est xlWorkbookDefault (valeur numérique 51). Si la méthode est appliquée à un nouveau classeur, la valeur par défaut correspond à celle de la version d'Excel utilisée. Si la méthode est appliquée à un classeur déjà existant, la valeur par défaut est la dernière utilisée pour enregistrer le classeur.
III. Différences entre MATLAB et Excel▲
III-A. Encodage des dates▲
Sous Excel, comme sous MATLAB, une date est stockée sous la forme d'une valeur numérique correspondant à un intervalle depuis une date que l'on appelle date pivot.
Application | Date pivot |
MATLAB | 0 janvier 0000 |
Excel pour Windows | 1 janvier 1900 |
Excel pour Mac | 2 janvier 1904 |
Note : la date du 0 janvier 0000 est purement fictive.
Il faut donc impérativement tenir compte de ces décalages lors de l'interfaçage d'Excel et de MATLAB.
Il faut tout d'abord déterminer si la date pivot est 1900 ou 1904 sous Excel. Pour ce faire, on récupère la valeur de la propriété Date1904 du classeur avec lequel on souhaite interagir. Cette propriété prend une valeur booléenne comme suit :
- 0 ou false : la date pivot utilisée est le 1er janvier 1900 ;
- 1 ou true : la date pivot utilisée est le 2 janvier 1904.
On peut donc tenir compte de ce décalage avec ce simple test :
if
Workbook.Date1904
offsetdates = datenum('01-Jan-1904 00:00:00'
);
else
offsetdates = datenum('30-Dec-1899 00:00:00'
);
end
où Workbook est la variable MATLAB contenant l'objet Workbook avec lequel on interagit.
Il faut donc ensuite ajouter ou retrancher cette date pivot selon qu'on lise ou qu'on écrive des données dans Excel.
Par exemple, pour écrire la date et l'heure courantes dans une cellule avec les dates au format 1900 sous Excel :
if
Workbook.Date1904
incr = datenum('01-Jan-1904 00:00:00'
);
else
incr = datenum('30-Dec-1899 00:00:00'
);
end
range.Value = now-incr;
On peut alors ajouter une mise en forme :
range.NumberFormatLocal = 'jj/mm/aaaa hh:mm:ss'
;
Pour récupérer une date depuis Excel, on fait l'opération inverse :
if
Workbook.Date1904
incr = datenum('01-Jan-1904 00:00:00'
);
else
incr = datenum('30-Dec-1899 00:00:00'
);
end
d = range.Value+incr;
Voici une liste de liens sur ce problème :
III-B. Encodage des couleurs▲
À partir d'un triplet de valeur RGB (dans l'intervalle [0 1]) sous MATLAB, une couleur sous VBA est définie comme ceci :
rgb_vba = 256.^(0:2)*round(255*rgb_matlab(:)) ;
Par exemple pour convertir la couleur jaune ayant pour triplet RGB [1 1 0] sous MATLAB vers la valeur VBA :
>> rgb_matlab = [1 1 0];
>> rgb_vba = 256.^(0:2)*round(255*rgb_matlab(:))
rgb_vba =
65535
Voici comme exemple une fonction qui remplit des lignes d'un classeur Excel avec les différentes palettes de couleurs disponibles sous MATLAB (voir la documentation de la fonction colormap).
function
colormap2excel
if
exist(fullfile(tempdir,'colormap.xlsx'
),'file'
)==2
delete(fullfile(tempdir,'colormap.xlsx'
));
end
Excel = actxserver('Excel.Application'
);
Excel.Visible = false;
Workbook = Excel.Workbooks.Add;
N = 64;
a{1} = autumn(N);
a{2} = bone(N);
a{3} = colorcube(N);
a{4} = cool(N);
a{5} = copper(N);
a{6} = flag(N);
a{7} = gray(N);
a{8} = hot(N);
a{9} = hsv(N);
a{10} = jet(N);
a{11} = lines(N);
a{12} = pink(N);
a{13} = prism(N);
a{14} = spring(N);
a{15} = summer(N);
a{16} = white(N);
a{17} = winter(N);
for
k = 1:numel(a)
for
n = 1:N
rgb = a{k}(n,:);
Excel.ActiveSheet.get('Cells'
, n, 2*k-1).Interior.Color = 256.^(0:2)*round(255*rgb(:));
end
end
Excel.Cells.ColumnWidth = 2.5;
Workbook.SaveAs(fullfile(tempdir,'colormap.xlsx'
));
Workbook.Close;
Excel.Quit;
delete(Excel)
Ce qui donne :
IV. Conclusion▲
Vous savez maintenant comment gérer les différences entres les versions d'Excel et des systèmes d'exploitation. Vous pouvez tenir compte des versions utilisées par l'utilisateur final dans vos codes.
Vous maîtrisez également le passage de date et de couleur entre Excel et MATLAB.
Vous pouvez maintenant poursuivre votre lecture par l'article intitulé Contrôle d'Excel par MATLAB via Automation - Écritures de données et mise en forme où vous allez voir comment mettre en pratique le contenu des six premiers articles pour l'écriture de données.