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

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

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();