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?
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.
<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
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.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".
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
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
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.
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.