Eigene Funktionen in Excel
Implementierung von eigenen Funktionen (UDF = User Defined Functions) in Excel in VBA oder Excel-DNA.
VBA - Visual Basic for Applications
Der wahrscheinlich einfachste Weg, aber die VBA Syntax ist ein Graus. Wer will schon VBA schreiben.
VSTO - Visual Studio Tools for Office
VSTO unterstützt keine eigenen Funktionen in Excel. Es gibt einen Workaround über die Definition von Wrapper-Funktionen in VBA, die VSTO Code aufrufen.
Excel-DNA
Open-Source Projekt um in c# eigene Funktionen für Excel zu entwickeln.
Erlaubte Parameter und Datentypen
XLL erstellen - Hallo Welt
- Klassenbibliothek in Visual Studio erstellen
- Paket Excel-DNA mit dem NuGet Paket Manager installieren
- Sourcecode siehe https://excel-dna.net/
- XLL erstellen und in Excel laden --> Entwicklertools --> Add-Ins --> Hinzufügen
using ExcelDna.Integration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// Name des Namespace erscheint später in der Liste der Add-Ins
namespace ExcelTestXLL
{
public static class TestXLL
{
[ExcelFunction(Name="HalloWelt", Description = "Beschreibung der Funktion - HalloWelt", Category = "TestXLL")]
public static string HalloWelt([ExcelArgument("Eingabe der Welt")] string text)
{
return "Hallo " + text + "!";
}
}
}
Links
- http://luajalla.azurewebsites.net/excel-dna-three-stories/
- http://putridparrot.com/blog/creating-an-xll-add-in-using-excel-dna/
Eigene Ribbon-Tabs
Für ein eigens Tab wird eine Klasse hinzugefügt, welche von ExcelRibbon erbt. Die Methode GetCustomUI wird überschrieben, und muss ein gültiges XML zurückgeben, welches die Überladungen wiedergibt. Hier wird die eingebettete Resource Ribbon.xml
geladen und ausgegeben:
public override string GetCustomUI(string RibbonID) {
Debug.WriteLine("GetCustomUI: " + RibbonID);
try
{
Assembly assembly = Assembly.GetExecutingAssembly();
StreamReader customUIReader = new System.IO.StreamReader(assembly.GetManifestResourceStream("ExcelTestXLL.Ribbon.xml"));
string customUIData = customUIReader.ReadToEnd();
return customUIData;
}
catch (Exception e)
{
Debug.WriteLine(e);
return null;
}
}
public void OnButtonPressed(IRibbonControl control)
{
Debug.WriteLine("Button pressed " + control.Id);
}
Für das XML, siehe den Editor http://openxmldeveloper.org/blog/b/openxmldeveloper/archive/2006/05/26/customuieditor.aspx. Wegen Icons: http://soltechs.net/customui/imagemso01.asp
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon>
<tabs>
<tab id="customTab" label="TestTest" insertAfterMso="TabHome">
<group id="customGroup" label="Test Tools">
<button id="customButton1" label="ConBold" size="large" onAction="OnButtonPressed" imageMso="Bold" />
</group>
<group idMso="GroupEnterDataAlignment" />
</tab>
</tabs>
</ribbon>
</customUI>
Neuaufruf aller Funktionen
Die Funktionen sind grundsätzlich nicht volatil. Um die Funktionen erneut aufzurufen, drücke CTRL-*ALT*-*F9*. Für ein Steuerung durch Code, siehe http://stackoverflow.com/questions/11255548/excel-dna-refresh-all-data-source-and-formula-calculation
Microsoft.Office.Interop.Excel.Application app = (Microsoft.Office.Interop.Excel.Application)ExcelDnaUtil.Application;
app.CalculateFull();