Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Contrôle d'Excel par MATLAB via Automation


Sujet :

MATLAB

  1. #1
    Rédacteur/Modérateur

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

    Contrôle d'Excel par MATLAB via Automation est constitué des articles suivants :

    1. Généralités ;
    2. Connexion ;
    3. Les objets et leur manipulation ;
    4. Gestion des feuilles ;
    5. Les plages de cellules ;
    6. Limites ;
    7. Écriture de données et mise en forme ;
    8. Lecture de données.

    Grâce à ces articles contenant de nombreux exemples, vous apprendrez à interfacer efficacement Excel et MATLAB sous Windows.

    Ces articles sont principalement destinés aux développeurs MATLAB quel que soit leur niveau.

    En plus de l'apprentissage des techniques d'interfaçage, ils peuvent également initier le développeur MATLAB à l'environnement VBA (Excel, Word, PowerPoint…).

    Les développeurs VBA pourront également y trouver des informations utiles afin de se familiariser avec MATLAB.
    Lien : http://briot-jerome.developpez.com/matlab/tutoriels/excel-automation/sommaire/

    N'hésitez pas à donner vos avis et à apporter des commentaires sur cet article à la suite de ce message

    Vous pouvez également noter cet article en utilisant l'outil de notation de cette discussion dans la barre de menu en haut à droite





    Retrouver les meilleurs cours et tutoriels pour apprendre Microsoft Office Excel
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et Arduino)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  2. #2
    Modérateur

    Salut Dut,
    merci pour ce riche article!
    Je me permet de partager 2 liens, qui sont annexes au sujet présenté. Ils pointent vers le site undocumentedmatlab.com, par Yair Altman :
    Comment modifier actxserver pour utiliser une instance excel déjà démarrée, qui pourra alléger vos traitements de nombreuses fiches excels
    Utiliser un équivalent de xlswrite sous linux ou mac, sans passer par le format csv (par exemple).
    Florent

  3. #3
    Membre éprouvé
    Merci pour cet article intéressant, très instructif et bien construit.

    Bonne continuation

  4. #4
    Expert confirmé

    Le tuto est vraiment bien fait, bien construit et bien détaillé, bravo.
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  5. #5
    Modérateur

    lu en diagonale, mais super article !
    faut que je m'y plonge un de ces 4 pour améliorer la solution bâtarde que j'avais apporté à un problème rencontré lors de la migration en 64 bits
    d'ailleurs à l'époque j'avais difficilement trouvé de l'aide sur les objet COM sur le net ! (et je ne connaissait pas l'option « Référence du développeur » dans Excel)

    bref, top!

  6. #6
    Rédacteur/Modérateur

    Citation Envoyé par Dut Voir le message
    Il faut mettre le chemin absolu et non pas relatif vers le fichier xlsx.

    Donc par ../../../ mais D:\...\...\...\



    J'ai ajouté cette remarque dans le tutoriel : Connexion - Ouvrir un fichier existant
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et Arduino)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Membre régulier
    Article très clair et vraiment très bien détaillé avec lequel il a été aisé de me faire la main sur le sujet et qui m'a été d'un grand secours.

    Un grand bravo et encore merci !

    Edit : petite coquille au Chapitre IV - Comparaison avec xlswrite de l'Ecriture des Données et Mise en Forme :

    Ce code présente troisdeux inconvénients que nous allons développer dans les chapitres suivants.

  8. #8
    Rédacteur/Modérateur

    Un 8ème article vient compléter la série : Gestion des feuilles
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et Arduino)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  9. #9
    Rédacteur/Modérateur

    Citation Envoyé par Adjen Voir le message
    Edit : petite coquille au Chapitre IV - Comparaison avec xlswrite de l'Ecriture des Données et Mise en Forme :
    C'est corrigé

    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et Arduino)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  10. #10
    Nouveau Candidat au Club
    mise en forme conditionnelle
    Tout d'abord un grand merci pour ce tutoriel qui est vraiment très bien réalisé!

    Peut être qu'une question n'a pas sa place ici, mais je désire en poser une à propos de la mise en forme conditionnelle. Je cherche à utiliser une échelle de couleur. En suivant votre modèle j'arrive à :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    colsc = range.FormatConditions.Add(xlColorScale);%où la cst VB xlColorScale=3

    ou encore :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    colsc = range.FormatConditions.AddColorScale(ColorScaleType);  %où la cst VB ColorScaleType=2 pour une échelle à 2 couleurs


    maintenant je voudrais inverser cette échelle qui va du rouge pour les faibles valeurs au jaune pour les grandes valeurs pour un soucis de représentativité

    j'ai tenté d'utiliser quelque chose comme :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    colsc.ColorScaleCriteria(1).FormatColor.Color = 65535;
    colsc.ColorScaleCriteria(2).FormatColor.Color = 255;


    en m'appuyant sur les codes VB mais sans résultat. J'ai le message d'erreur suivant :
    No appropriate method, property, or field FormatColor for class
    Interface.00024494_0000_0000_C000_000000000046.
    Le message parle par lui même. FormatColor n'est pas le champs approprié sous MATLAB. Quel champs ou simplement quelle formulation serait donc approprié(e)?
    Merci par avance pour vos lumières! ^^

  11. #11
    Futur Membre du Club
    Merci pour ce tutoriel, que je lis d'ailleurs pour la seconde fois.

    Je me permets juste de signaler un infime détail, il manque une simple quote ' section III-B-2 dans le code suivant juste après Feuil3 sur la première ligne.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    >> sheet = Excel.Worksheets.Item('Feuil3);
    >> sheet.Name = 'Mesures';


    Sinon super boulot!

  12. #12
    Rédacteur/Modérateur

    Citation Envoyé par Basto92 Voir le message
    Je me permets juste de signaler un infime détail, il manque une simple quote ' section III-B-2
    C'est corrigé
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et Arduino)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  13. #13
    Futur Membre du Club
    J'ajouterais également que pour la section III-A que l'explication de semble pas parfaitement claire, voir même peut-être fausse. En tous cas, je pense que cela pourrait être amélioré...
    Car, selon moi c'est deux commandes ne permettent pas d'activer une plage de cellule, comme c'est indiqué.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    range = Excel.ActiveSheet.Range('B3').get('Resize',3,2);

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    range = get(Excel.ActiveSheet.Range('B3'),'Resize',3,2);

    D'après mes tests, il vaudrait mieux compléter le code et écrire quelque chose comme ce qui suit pour activé une plage de cellules.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    range = Excel.ActiveSheet.Range('B3').get('Resize',3,2);
    range.Address
    Excel.ActiveSheet.Range(range.Address).Select

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    range = get(Excel.ActiveSheet.Range('B3'),'Resize',3,2);
    range.Address
    Excel.ActiveSheet.Range(range.Address).Select


    Je ne suis pas spécialiste du VBA Excel et je découvre, alors je peux me tromper, si quelqu'un peut me confirmer ou m'infirmer en expliquant.


    1ère ajout:

    J'ajoute même que pour la section d'après cette ligne de code ne semble elle aussi pas fonctionner.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Excel.ActiveSheet.Cells

    Mais le code suivant si.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    range=Excel.ActiveSheet.Cells
    range.Address
    Excel.ActiveSheet.Range(range.Address).Select


    Désolé pour le double poste, j'ai rechargé la page et cela semble avoir dysfonctionné et créé deux messages.



    2ème ajout:

    Pour simplifier les codes de je propose et clarifier ceux de l'auteur, il faut juste ajouter ".Select" à ceux de l'auteur pour bien sélectionner un plage de cellules.

  14. #14
    Rédacteur/Modérateur

    Voici un argument contre le .Select :

    Citation Envoyé par Pierre Fauconnier
    En VBA pour Excel, on n'aime pas trop le SELECT, car il ralentit l'exécution du code, puisque la méthode SELECT "singe" la sélection d'une cellule par l'utilisateur. Il est de loin préférable de s'en passer chaque fois que l'on peut, et de travailler avec un objet de type Range.
    C'est pour cela que .Select n'apparait quasiment jamais dans cette série de tutoriels
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et Arduino)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  15. #15
    Futur Membre du Club
    Ah très bien, j'ai sans doute manqué cette remarque, si elle présente dans le tutoriel. Néanmoins comme souvent il y des images qui montrent la sélection par exemple en résultat afin de checker l'avancement en parallèle du tutoriel sur sa propre machine, et cela porte donc un peu à confusion.

    Je ne vais pas tout relever sur ce forum, mais j'ai noter d'autres lignes de codes proposées qui malheureusement ne fonctionnement pas lorsque je les exécute.
    Peut-être un problème de versions des logiciels, ou bien des évolutions du VBA... Notament souvent il faut ajouter le mot clé Workbook, par exemple pour les premières commandes du dernier chapitre.

    Exemple de mon code:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Excel = actxserver('Excel.Application');
    Excel.Visible = true;
    xlspath = '...';
    xlsfile = 'data.xlsx';
    Workbook=Excel.Workbooks.Open(fullfile(xlspath,xlsfile));
    
    num = Workbook.ActiveSheet.Range('B2').Value;
    str = Workbook.ActiveSheet.Range('C2').Value;
    bool = Workbook.ActiveSheet.Range('D2').Value;
    
    Workbook.Close(false);
    Excel.Quit;
    delete(Excel)
    clear Excel


    Bref, quoi qu'il en soit ce tuto' est très bien réalisé, en j'en remercie tout les contributeurs.

  16. #16
    Rédacteur/Modérateur

    Merci pour tes remarques. Je vais essayer de reprendre cette série de tuto pour éviter ces problèmes de compréhension.

    N'hésite pas à m'envoyer tes relevés d'erreur par MP si tu trouves cela plus simple.
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et Arduino)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  17. #17
    Candidat au Club
    Bonjour,

    Merci pour votre article, il est très bien fait.

    Cordialement

    Souad

  18. #18
    Nouveau Candidat au Club
    Merci beaucoup de ce tuto clair et complet, il m'a bien aidé !

    M.

###raw>template_hook.ano_emploi###