Modules Yoctopuce et Excel

Modules Yoctopuce et Excel

On nous a demandé récemment s'il était possible de contrôler des modules Yoctopuce depuis Microsoft Excel. La réponse est oui, mais ce n'est malheureusement pas aussi facile qu'avec les API que nous avons l'habitude de publier. Néanmoins voir Excel tracer en live le graphique d'un capteur vaut bien quelques efforts...



En temps normal, Excel peut être contrôlé avec un language de scripting interne appelé VBA, qui est une variante de VB6. Microsoft ayant littéralement tué VB6 au profit de Visual Basic .Net en arrêtant de vendre des licenses VB6, il n'y a pas d'API Yoctopuce pour VB6, et il n'y en aura probablement jamais, pareil pour VBA.

Peut-on lire les données d'un senseur Yoctopuce directement dans Excel?
Peut-on lire les données d'un senseur Yoctopuce directement dans Excel?


Néanmoins, moyennant quelques acrobaties de programmation, il est possible d'écrire du code en .NET et de l'appeler depuis VBA. Il existe plusieurs méthodes pour cela, nous avons choisi de vous présenter une méthode basée sur l'excellent Excel-DNA qui a l'avantage d'être gratuit, open-source et de marcher.

Le principe consiste à fabriquer une DLL en C# .NET qui contient tout le code de gestion des modules Yoctopuce, puis de fabriquer à partir de cette DLL un fichier de complément Excel (Add-Ins) qui, une fois chargé dans Excel, permettra d'accéder aux fonctionnalités convoitées. Voyons comme faire plus en détails. Si vous êtes du genre impatient, il y a une vidéo du résultat à la fin de l'article.

Etape 1: téléchargement
Téléchargez Excel-DNA et la libraire C# Yoctopuce décompressez tout ça où bon vous semble.

Etape 2: structure
Dans Visual C#, créez un nouveau projet de type "librairie de classe". Ajoutez à votre projet les fichiers source nécessaires au pilotage de vos modules Yoctopuce, ainsi que le fichier yapi.dll. Copiez le fichier ExcelDna.xll depuis le répertoire de Excel-DNA en le renommant avec le même nom utilisé pour votre assemblage par exemple YoctoExcel.xll. Ajoutez aussi une référence a ExcelDna.Integration. Vous pouvez renommer le stub Class1.cs en YoctoExcel.cs si vous le souhaitez.

Ajoutez un fichier texte YoctoExcel.dna qui contiendra la description de votre complément pour Excel.

<DnaLibrary Name="Yoctopuce Excel demo" RuntimeVersion="v4.0">
  <ExternalLibrary Path="YoctoExcel.dll" />
</DnaLibrary>



Ne mettez pas n'importe quoi pour l'attribut name dans le fichier YoctoExcel.dna, cet attribut vous servira plus tard. Changez la propriété "copier vers le répertoire de destination" des fichiers yapi.dll, YoctoExcel.xll et YoctoExcel.dna pour qu'ils soient toujours copiés.

A ce stade, la structure de votre projet devrait ressembler à ça:

La structure du projet C# .net
La structure du projet C# .net


Etape 3: Code .NET
Il vous reste à coder dans le fichier YoctoExcel.cs les fonctionnalités que vous souhaitez rendre disponibles dans Excel. Pour cela, vous avez besoin du code nécessaire pour les enregistrer dans Excel. Ce code est un peu cryptique, mais vous pouvez vous contenter d'un copier/coller.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using ExcelDna.Integration.Extensibility;
using ExcelDna.Integration;
using ExcelDna.Integration.CustomUI;
using System.Runtime.InteropServices;
using System.Windows.Forms;

// some cryptic stuff to register the addIn in Excel
public class AddInRoot : IExcelAddIn
 {
  public void AutoOpen()
    {  try
       { var com_addin = new AddInComRoot();
         com_addin.GetType().InvokeMember("DnaLibrary", BindingFlags.NonPublic | BindingFlags.Instance |
         BindingFlags.SetProperty, null, com_addin, new object[] { DnaLibrary.CurrentLibrary });
         ExcelComAddInHelper.LoadComAddIn(com_addin);
       }
      catch (Exception e)
       {   MessageBox.Show("Error loading COM AddIn: " + e.ToString());
       }
     }

     public void AutoClose() { }
  }


[ComVisible(true)]
public class AddInComRoot : ExcelDna.Integration.CustomUI.ExcelComAddIn
  {  // : IDTExtensibility2, ie COM "AddIn".ExcelDNA finds this by magic.
     MyAddinObject _helper;

    public AddInComRoot() {}

    public override void OnConnection(object Application,
    ext_ConnectMode ConnectMode, object AddInInst, ref Array custom)
      {  _helper = new MyAddinObject();

         AddInInst.GetType().InvokeMember("Object",
                BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty,
                null,AddInInst,new object[] { _helper });
       }
     public override void OnDisconnection(ext_DisconnectMode RemoveMode, ref Array custom) {}
     public override void OnAddInsUpdate(ref Array custom) {}
     public override void OnStartupComplete(ref Array custom) {}
     public override void OnBeginShutdown(ref Array custom) {}
    }



Ajoutez à la suite le code des modules Yoctopuce, ici une gestion basique de la fonction "temperature".

[ComVisible(true)]
public class MyAddinObject
  {   // This becomes the VBA addin.Object
      string lasterrmsg = "";
      YTemperature tsensor;
      bool initdone = false;

      // init the Yoctopuce APi and search for a temperature sensor
      public bool Init()
      {
        if (initdone) return true;
        if (YAPI.RegisterHub("usb",ref lasterrmsg) == YAPI.SUCCESS)
         {
            tsensor = YTemperature.FirstTemperature();
            if (tsensor == null)
            {
              lasterrmsg = "No temperature sensor found";
              return false;
            }
            initdone = true;
            return true;
         }
         return false;
      }

      return the last encountered error message
      public string getLastError()
      {
        return lasterrmsg;
      }

      // return the found temperature sensor  name
      public string getSensorName()
      {
        if (tsensor == null) return "invalid temp sensor";
        return tsensor.describe();
      }

      // return the value reported by the sensor
      public string getTemperature()
      {
        if (tsensor == null) return "invalid temp sensor";
          return Convert.ToString(tsensor.get_currentValue());
      }
   }



Compilez, la partie .NET est prête et le répertoire de destination devrait ressembler à ça:

les fichiers du complément pour Excel
les fichiers du complément pour Excel



Etape 4: import du complément dans Excel
Ouvrez Excel, faites en sorte que les macros soient autorisées, activez la partie "développeur" et ajoutez votre complément: grâce aux boutons "Compléments" puis "Parcourir", choisissez le fichier YoctoExcel.xll.

ajoutez votre complément à Excel
ajoutez votre complément à Excel




Etape 5: Code VBA
Vous y êtes presque, il vous faut encore ajouter le code VBA qui trouve votre complément parmi tous ceux disponibles et accède à son contenu. Notez que la recherche est basée sur le nom spécifié dans le fichier YoctoExcel.dna.

Dim YoctoAddin As Object

Sub init()
    Dim cai As COMAddIn
    For Each cai In Application.COMAddIns
        ' Could check cai.Connect to see if it is loaded.
        Debug.Print cai.Description, cai.GUID
        If InStr(cai.Description, "Yoctopuce Excel demo") Then
            Set YoctoAddin = cai.Object
            If YoctoAddin Is Nothing Then
              Debug.Print "ObjNothing"
            Else
              If YoctoAddin.init() Then
                Debug.Print "init sucessfull"
              Else
               MsgBox (YoctoAddin.getLastError())
              End If
            End If
        End If
    Next
End Sub



Vous êtes maintenant en possession de l'objet de tous vos désirs: l'objet YoctoAddin correspond à la classe MyAddinObject que vous avez définie dans YoctoExcel.cs. Vous pouvez accéder toutes ses méthodes pour coder tout ce que vous voulez. Vous trouverez ici un exemple concret, codé en Visual C# 2010 express qui fonctionne avec Excel 2010 qui trace un graphe de température en live, vous pouvez même le voir en action sur cette vidéo.

  




Si vous souhaitez en savoir plus, allez donc faire un tour sur le site de Excel-DNA vous y trouverez quantité d'info passionnantes, par exemple, comment compacter votre complément en un seul fichier, plus facile à distribuer. Amusez-vous bien.

Commenter un commentaire Retour au blog



1 - martinm (Yocto-Team)Vendredi 27 décembre 2013 7H54

Un client vient de nous informer de l'existence d'une macro écrite par Joacim Andersson de Brixoft Software. Cette macro permet de faire des appels système sous Excel, ce qui rend l'utilisation de notre API en ligne de commande assez facile depuis Excel. Voici un exemple d'utilisation avec un Yocto-Light.

http://www.yoctopuce.com/FR/downloads/yoctolightDemoExcel.zip

Yoctopuce, get your stuff connected.