Ecco una risposta canonical sui 3 metodi principali per chiamare. NET da Excel (o VBA).
Tutte e tre le modalità funzionano in .Net 4.0.
1. XLL
Il terzo fornitore indipendente aggiuntivo di funzionalità offerta XLL Express, tuttavia la sua libera e facile da usare Excel-DNA l'autore è quihttps://stackoverflow.com/users/44264
Ecco un estratto dalla pagina di Excel-DNA: https://excel-dna.net/
Introduzione
Excel-DNA è un progetto indipendente per integrare .NET in Excel. Con Excel-DNA è possibile creare componenti aggiuntivi nativi (.xll) per Excel utilizzando C#, Visual Basic.NET o F #, fornendo funzioni definite dall'utente ad alte prestazioni (UDF), interfacce nastro personalizzate e altro. L'intero componente aggiuntivo può essere inserito in un singolo file .xll che non richiede installazione o registrazione.
Guida introduttiva
Se si utilizza una versione di Visual Studio che supporta il Gestore NuGet Package (tra cui Visual Studio 2012 Express per Windows Desktop), il modo più semplice per fare un Excel-DNA add-in è a:
Creare un nuovo progetto Libreria di classi in Visual Basic, C# o F #. Utilizzare la Gestione NuGet Pacchetti dialogo o la Console Package Manager per installare il pacchetto di Excel-DNA:
PM> Install-Package Excel-DNA
aggiungere il codice (C#, Visual Basic.NET o F #):
using ExcelDna.Integration;
public static class MyFunctions
{
[ExcelFunction(Description = "My first .NET function")]
public static string SayHello(string name)
{
return "Hello " + name;
}
}
Compile, caricare e utilizzare la funzione in Excel:
=SayHello("World!")
2. Automazione AddIns
questo articolo di Eric Carter mostra come d o, l'articolo manca di un mucchio di immagini, quindi copio/incollo l'intero articolo e ho ricreato le immagini per la conservazione.
REF: https://blogs.msdn.microsoft.com/eric_carter/2004/12/01/writing-user-defined-functions-for-excel-in-net/
Excel consente la creazione di funzioni definite dall'utente che possono essere utilizzate nelle formule di Excel. Uno sviluppatore deve creare un tipo speciale di DLL chiamato XLL. Excel consente inoltre di scrivere funzioni personalizzate in VBA che possono essere utilizzate nelle formule di Excel. Sfortunatamente, Excel non supporta o consiglia di scrivere un XLL che utilizza il codice gestito. Se sei disposto a correre il rischio che il tuo XLL non venga eseguito nelle versioni attuali o future di Excel, ci sono soluzioni disponibili che abilitano questo scenario: cerca nel web "XLL gestito".
Fortunatamente, esiste un modo più semplice per creare una funzione definita dall'utente che non richiede la creazione di una DLL XLL. Excel XP, Excel 2003 ed Excel 2007 supportano qualcosa chiamato Componente aggiuntivo di automazione. Un componente aggiuntivo di automazione può essere creato semplicemente in C# o VB.NET. Ti mostrerò un esempio in C#.
Innanzitutto, avviare Visual Studio e creare un nuovo progetto di libreria di classi C# denominato AutomationAddin per questo esempio.
Quindi, nel file Class1.cs, immettere il codice mostrato di seguito. Sostituire il GUID con il proprio GUID creato utilizzando Genate GUID nel menu Strumenti di Visual Studio.
using System;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace AutomationAddin
{
// Replace the Guid below with your own guid that
// you generate using Create GUID from the Tools menu
[Guid("A33BF1F2-483F-48F9-8A2D-4DA68C53C13B")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class MyFunctions
{
public MyFunctions()
{
}
public double MultiplyNTimes(double number1, double number2, double timesToMultiply)
{
double result = number1;
for (double i = 0; i < timesToMultiply; i++)
{
result = result * number2;
}
return result;
}
[ComRegisterFunctionAttribute]
public static void RegisterFunction(Type type)
{
Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type, "Programmable"));
RegistryKey key = Registry.ClassesRoot.OpenSubKey(GetSubKeyName(type, "InprocServer32"), true);
key.SetValue("", System.Environment.SystemDirectory + @"\mscoree.dll",RegistryValueKind.String);
}
[ComUnregisterFunctionAttribute]
public static void UnregisterFunction(Type type)
{
Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type, "Programmable"), false);
}
private static string GetSubKeyName(Type type, string subKeyName)
{
System.Text.StringBuilder s = new System.Text.StringBuilder();
s.Append(@"CLSID\{");
s.Append(type.GUID.ToString().ToUpper());
s.Append(@"}\");
s.Append(subKeyName);
return s.ToString();
}
}
}
Con questo codice scritto, mostrano le proprietà per il progetto facendo doppio clic sul nodo proprietà nell'ambito del progetto in Esplora soluzioni. Fare clic sulla scheda Build e selezionare la casella di controllo "Register for COM Interop". A questo punto hai un passaggio in più se stai lavorando su Windows Vista o superiore. Visual Studio deve essere eseguito con i privilegi di amministratore per la registrazione per l'interoperabilità COM. Salva il tuo progetto ed esci da Visual Studio. Quindi trova Visual Studio nel menu Start e fai clic con il pulsante destro su di esso e seleziona "Esegui come amministratore". Riapri il tuo progetto in Visual Studio. Quindi scegliere "Build" per compilare il componente aggiuntivo.
Ora lanciare Excel e raggiungere la finestra di server di automazione seguendo questi passaggi:
lancio Excel e fare clic sul pulsante Microsoft Office nell'angolo in alto a sinistra della finestra.
Scegliere Opzioni di Excel.
Fare clic sulla scheda Componenti aggiuntivi nella finestra di dialogo Opzioni di Excel.
Scegliere Componenti aggiuntivi Excel dalla casella combinata denominata Gestione. Quindi fare clic sul pulsante Vai.
Fare clic sul pulsante Automazione nella finestra di dialogo Componenti aggiuntivi.
È possibile trovare la classe si è creato, cercando per AutomationAddin.MyFunctions nella lista dei Automazione componenti aggiuntivi:
Ora, proviamo a utilizzare la funzione MultiplyNTimes all'interno di Excel. Per prima cosa create un semplice foglio di calcolo che abbia un numero, un secondo numero per multiplo del primo di, e un terzo numero per quante volte volete moltiplicare il primo numero per il secondo numero. Un esempio foglio di calcolo è mostrato qui:
Clicca su una cella vuota nella cartella di lavoro di seguito i numeri e fare clic sul pulsante Inserisci funzione nella barra della formula. Dalla finestra di dialogo delle formule disponibili, apri la casella "O seleziona una categoria" e seleziona "AutomationAddin.MyFunctions.
Quindi fare clic sulla funzione MultiplyNTimes come illustrato di seguito:
Quando si preme il pulsante OK, Excel apre una finestra di dialogo per aiutare Afferri argomenti della funzione dal foglio di calcolo come mostrato qui:
Infine, fare clic su OK e vedere il foglio di calcolo finale, come mostrato qui con la formula personalizzata nella cella C3.
3. Calling .Net da Excel VBA
REF: Calling a .net library method from vba
Utilizzando il codice dal progetto Automation.AddIn possiamo facilmente chiamare la funzione MultiplyNTimes da Excel VBA.
Prima di aggiungere un riferimento alla DLL da Excel, per fare ciò è necessario essere nell'Editor VB.Premere Alt + F11, quindi fare clic dal menu Strumenti e Riferimenti:
Selezionare la DLL AutomationAddIn:
Aggiungere VBA codice per chiamare la DLL .Net:
Sub Test()
Dim dotNetClass As AutomationAddIn.MyFunctions
Set dotNetClass = New AutomationAddIn.MyFunctions
Dim dbl As Double
dbl = dotNetClass.MultiplyNTimes(3, 2, 5)
End Sub
E presto!
Infine ci sono alcuni ottimi articoli di MSDN su Excel e .NET "Andrew Whitechapel" - google them
Avete installato [Visual Studio Tools per Office Runtime] (https://msdn.microsoft.com/en-us/library/ee712596.aspx)? – Tim
I TLB sono ancora lì con CLR4 (in C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319). Qual è esattamente il problema? –
Credo che questo abbia a che fare con la registrazione della DLL. Guarda. Spero che sia d'aiuto. http://www.geeksengine.com/article/register-dll.html – sam