Contrôle d'Excel par MATLAB via Automation - Limites

Apprendre à interfacer MATLAB et Excel par la programmation

Cet article présente les bases 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 s'intéressera aux systèmes d'exploitation, aux versions d'Excel et aux différents formats de fichier. Le troisième chapitre portera sur les différences d'encodage des dates et des couleurs entre Excel et MATLAB.

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

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 :

 
Sélectionnez
>> 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 :

 
Sélectionnez
>> 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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
range.NumberFormatLocal = 'jj/mm/aaaa hh:mm:ss';

Pour récupérer une date depuis Excel, on fait l'opération inverse :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
>> 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).

 
Sélectionnez
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 :

Image non disponible

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.

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.