IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Pilotage d'Excel par automation, erreur récurrente


Sujet :

MATLAB

  1. #1
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut Pilotage d'Excel par automation, erreur récurrente
    Bonjour à tous.

    Je suis en train de créer des rapports de tests automatisés effectués par un programme Matlab. J'aimerai créer ces rapports dans des classeurs Excel. Je m'en sors bien dans le pilotage de Excel, j'arrive déjà à faire pas mal de choses notamment grâce à la création de macro conseillé par Dut dans son tutoriel

    Cependant, je rencontre parfois des erreurs qui m'empêchent de peaufiner mon rapport. Je trouve parfois une solution pour contourner ces problèmes, mais je perds du temps et certaines personnalisations me sont inaccessibles.

    Voici le type d'erreur que je rencontre:

    Après avoir effectué une macro de "Fusionner et centrer", j'essaie d'utiliser la commande suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Excel.Selection.HorizontalAlignment = 'xlCenter';
    Invoke Error, Dispatch Exception:
    Source: Microsoft Office Excel
    Description: Impossible de définir la propriété HorizontalAlignment de
    la classe Range.
    Help File: C:\Program Files (x86)\Microsoft
    Office\OFFICE11\1036\xlmain11.chm
    Help Context ID: 0
    Ou bien en voulant changer la police, la couleur... d'une cellule:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Excel.Selection.Font.Underline = 0;
    Invoke Error, Dispatch Exception:
    Source: Microsoft Office Excel
    Description: Impossible de définir la propriété Underline de la classe
    Font.
    Help File: C:\Program Files (x86)\Microsoft
    Office\OFFICE11\1036\xlmain11.chm
    Help Context ID: 0
    Quelqu'un pourrait-il m'expliquer la subtilité que je n'ai pas compris lors d'assignation de valeurs à ces propriétés? C'est une erreur que je rencontre très souvent quand j'essaie de réutiliser le code générer par les macros tel quel. J'aimerai comprendre pourquoi ces erreurs surviennent et comment les éviter?

    En vous remerciant,
    Gooby
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Tu ne devrais pas utiliser d'objet Selection mais plutôt des objets Range. Tu seras sans doute plus précis au niveau des objets visé.

    C'est une des limitations de l'utilisation de l’enregistreur de macros pour dégrossir le codage du code VBA vers MATLAB. Comme me l'avait suggéré un spécialiste à l'époque de la rédaction de ces articles :

    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.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, 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)

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Merci pour le conseil, mais donc il n'y a pas de parade aux problèmes que je rencontre? Certaines propriétés sont inutilisables en l'état via Matlab automation?

    Et quid des arguments xlCenter, xlNone etc etc?

    Par exemple, j'ai du adapter ce code VBA qui va mettre des bordures externes sur les cellules sélectionnés avec une épaisseur défini et des bordures internes avec une autre épaisseur.
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Sub Bordure()
    '
    ' Bordure Macro
    ' Macro enregistrée le 29/09/2015 par R
    '
     
    '
        Range("B54:B57").Select
        Selection.Borders(xlDiagonalDown).LineStyle = xlNone
        Selection.Borders(xlDiagonalUp).LineStyle = xlNone
        With Selection.Borders(xlEdgeLeft)
            .LineStyle = xlContinuous
            .Weight = xlMedium
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeTop)
            .LineStyle = xlContinuous
            .Weight = xlMedium
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .Weight = xlMedium
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeRight)
            .LineStyle = xlContinuous
            .Weight = xlMedium
            .ColorIndex = xlAutomatic
        End With
        Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
        Range("B56").Select
    End Sub


    De cette façon sur Matlab:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    function EXCEL_PutBorders( Excel, epaisseur, intra, taille_intra )
     
    % epaisseur = epaisseur des bordures ( 3 = moyenne )
    % intra = 0 si pas de bordures désirés dans le tableau, 1 sinon
    % taille_intra = taille des bordures à l'intérieur du tableau de cellules
     
    Excel.Selection.Borders(1).LineStyle = 1;
     
    if ( nargin >= 2 )
        Excel.Selection.Borders(1).Weight = epaisseur;
    end
     
    if ( nargin >= 3 )
        if ( intra == 0 )
            Excel.Selection.Borders(1).Item(12).LineStyle = 0;
        elseif ( nargin >= 4 )
            Excel.Selection.Borders(1).Item(12).LineStyle = 1;
            Excel.Selection.Borders(1).Item(12).Weight = taille_intra;
        end
    end
     
    end
    J'ai été obliger de tâtonner pour trouver que les bordures intérieures étaient l'item 12. Impossible d'utiliser l'argument xlInsideHorizontal et impossible de déterminer que cet argument correspond "plus ou moins" à l'entier 12 sur Matlab. Est-ce que je passe à côté de quelque chose dans ma compréhension? Est-ce que j'ai loupé une doc quelque part?

    PS: j'ai utilisé Selection ici car c'est ce que j'avais déjà codé avant de poster.
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Citation Envoyé par Gooby Voir le message
    J'ai été obliger de tâtonner pour trouver que les bordures intérieures étaient l'item 12. Impossible d'utiliser l'argument xlInsideHorizontal et impossible de déterminer que cet argument correspond "plus ou moins" à l'entier 12 sur Matlab. Est-ce que je passe à côté de quelque chose dans ma compréhension? Est-ce que j'ai loupé une doc quelque part?
    Il faut impérativement s'habituer à naviguer dans la documentation VBA d'Excel : Où trouver de l'aide ? - Documentation Excel

    Pour cet exemple précis, il faut aller dans la documentation de la collection Borders, propriété Item : Borders.Item, propriété (Excel)
    Il est écrit que l'index correspond à l'énumération XlBordersIndex : XlBordersIndex, énumération (Excel)
    On constate bien que la valeur numérique de la constante xlInsideHorizontal est 12

    Tu peux aussi procéder différemment en utilisant directement l'enregistreur de macros comme je l'ai présenté ici : Les constantes et leurs valeurs - S'aider de l'enregistreur de macros
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, 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)

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Merci Dut pour ces précieuses informations.

    J'ai encore une question par rapport au tracé de graph. Je n'ai pas trouvé comment définir mes abscisses d'histogrammes en fonction d'une colonne de fichier:

    Excel.ActiveChart.SetSourceData(Excel.Range('N11:N42;K11:K42')); me trace bien mes deux séries mais je n'arrive pas à adapter la syntaxe pour définir l'axe des abscisses de ces séries. Une idée?

    EDIT: J'ai fait comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Excel.ActiveChart.NewSeries;
    Excel.ActiveChart.SeriesCollection(1).XValues = Excel.Range('C11:C42');
    Excel.ActiveChart.SeriesCollection(1).Values = Excel.Range('N11:N42');
     
    Excel.ActiveChart.NewSeries;
    Excel.ActiveChart.SeriesCollection(2).XValues = Excel.Range('C11:C42');
    Excel.ActiveChart.SeriesCollection(2).Values = Excel.Range('K11:K42');
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Mise en page d'Excel par automation
    Par h1karu dans le forum Contribuez
    Réponses: 1
    Dernier message: 15/02/2013, 04h24
  2. [AC-2003] Exportation de plusieurs tables vers UN fichier excel par automation
    Par MatAir dans le forum VBA Access
    Réponses: 2
    Dernier message: 09/06/2010, 22h43
  3. Réponses: 2
    Dernier message: 16/03/2009, 19h12
  4. pilotage d'excel par vb net
    Par ruliane dans le forum VB.NET
    Réponses: 4
    Dernier message: 03/07/2008, 08h44
  5. Enregistrement d'un fichier Excel par automation
    Par tiopan dans le forum Access
    Réponses: 2
    Dernier message: 04/12/2003, 19h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo