VBA to VB.Net XLL add-ins with Excel-Dna 
Patrick O'Beirne Mail3 at sysmod.com 
Web: http://www.sysmod.com 
Blog: http://sysmod.wordpress.com 
LinkedIn: http://www.linkedin.com/in/patrickobeirne  
When the time comes to expand your skill set beyond VBA, the Microsoft path is to 
DotNet, either VB.Net or C#. This describes the easy route to VB using either or both 
of two open source libraries, Excel-Dna and NetOffice. Once in DotNet, you can then 
acquire C# skills for which there is more demand in the marketplace. 
Excel-DNA (Excel Dot Net Assembly) 
http://excel-dna.net/ 
Quote from the home page of this project by Govert van Drimmelen: 
Excel-Dna is an independent project to integrate .NET into Excel. The primary target 
is the Excel user who currently writes VBA code for functions and macros, and would 
like to start using .NET. Also, C/C++ based .xll add-in developers who want to use 
the .NET framework to develop their add-ins. 
The Excel-Dna Runtime is free for all use, and distributed under a permissive open-
source license that also allows commercial use. 
Excel-Dna is developed using .NET, and users have to install the freely available 
.NET Framework runtime. The integration is by an Excel Add-In (.xll) that exposes 
.NET code to Excel. The user code can be in text-based (.dna) script files (C#, Visual 
Basic or F#), or compiled .NET libraries (.dll). Excel versions ’97 through 2010 can 
be targeted with a single add-in.  
The latest Excel-Dna version is available on the CodePlex site. 
http://ExcelDna.codeplex.com also has links to tutorials 
http://exceldna.codeplex.com/wikipage?title=Reference  is a quick reference 
http://groups.google.com/group/exceldna  the discussion list for primary support 
All applications use the ExcelDna.xll addin. The stages of learning described below 
successively add files: 
1) Using only a text file (.dna) which includes the source code text. 
2) Add an external DLL which you create from VB.net source code and compile using 
either the vbc.exe compiler or an IDE (Integrated Development Environment).  
3) Ease the transition from the VBA Excel object model to VB.Net objects using either 
the MS Primary Interop Assemblies (PIA) or third party libraries such as NetOffice. 
4) An add-in using the Excel Ribbon 
If you do not already have a favourite text file editor, I recommend Notepad++ 
http://notepad-plus-plus.org/ 
Pdf text searchable - search text inside PDF file in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Learn how to search text in PDF document and obtain text content and location information
how to select text in pdf; find and replace text in pdf file
Pdf text searchable - VB.NET PDF Text Search Library: search text inside PDF file in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Learn How to Search Text in PDF Document and Obtain Text Content and Location Information in VB.NET application
how to make a pdf file text searchable; how to select text on pdf
Example: Create a user-defined function in Visual Basic 
Stage 1: using only a .DNA text file 
Getting Started with Excel-Dna – extracted from the  web page: 
http://ExcelDna.codeplex.com/wikipage?title=Getting%20Started 
Do this first: 
Install the Microsoft .NET Framework Version 4.0 Redistributable Package. 
Install the most recent release of ExcelDna, unzip in a convenient directory. 
Make a copy of ExcelDna.xll in a convenient directory, calling the copy TestDna.xll. 
Create a new text file, called TestDna.dna (the same prefix as the .xll file), with 
contents: 
<DnaLibrary> 
<![CDATA[ 
Public Module MyFunctions 
Function AddThem(x, y) 
AddThem = x + y 
End Function 
End Module 
]]> 
</DnaLibrary> 
Load TestDna.xll in Excel (either File->Open or Tools->Add-Ins and Browse...). 
You should be prompted whether to Enable Macros; click Enable. There should be an 
entry for AddThem in the function wizard, under the category TestDna. 
Enter 
=AddThem(4,2)
into a cell - you should get 6. 
Enter 
=AddThem("a","b")
into a cell - you should get ab. 
Troubleshooting  
If you are not prompted to Enable Macros and nothing else happens, your security 
level is probably on High. Set it to Medium. 
If you get a message indicating the .Net runtime could not be loaded, you might not 
have the .NET Framework installed. Install it. 
If a window appears with the title 'ExcelDna Error Display' then there were some 
errors trying to compile the code in the .dna file. Check that you have put the right 
code into the .dna file. Eg,"error BC30001: Statement is not valid in a namespace" 
could mean you omitted the Public Module / End Module. 
If Excel prompts for Enabling Macros, and then the function does not appear to be 
available, you might not have the right filename for the .dna file. The name should be 
the same as the .xll file and it should be in the same directory. Or, you may have 
omitted to declare the module as Public. 
Otherwise, post on the discussion list http://groups.google.com/group/exceldna   
C# PDF Convert to Text SDK: Convert PDF to txt files in C#.net
NET project. Powerful .NET control for batch converting PDF to editable & searchable text formats in C# class. Free evaluation library
converting pdf to searchable text format; pdf find highlighted text
C# Create PDF Library SDK to convert PDF from other file formats
The PDF document file created by RasterEdge C# PDF document creator library is searchable and can be fully populated with editable text and graphics
how to make a pdf document text searchable; pdf searchable text converter
You can call a UDF in an XLL from VBA by using Application.Run.  
X = Application.Run("MyFunc", param1, param2) 
I have not yet seen any significant overhead in doing this. 
You could also use the Evaluate function or its square bracket equivalent, but these 
require the parameters to be passed as literals. For example:  
Function MyFunc2(s As String, d As Double) As Double 
You could call it from VBA as 
X = Application.Run("MyFunc2", "test", 3) 
X = [MyFunc2("test",3)] 
X = Evaluate("MyFunc2(""test"",3)") 
This gives a simple way to migrate a UDF from VBA to Excel-Dna for a quick and 
easy performance improvement. How much of an improvement depends on how 
efficient the code is. Avoid many thousands of calls to Excel worksheet functions, 
such as  ExcelDnautil.Application.WorksheetFunction.MIN(). Look for a native 
VB.Net equivalent, or it may be faster to rewrite some functions in inline logic. Write 
timing tests to verify whether there is any speed improvement.  
Stage 2: Compiling  a .DLL 
2.1 Compiling without an IDE 
You can skip to the IDE example, as I'll only show once this bit of a throwback to the 
old command line days, but it does reduce things to essentials. Create a text file 
'TestDll.vb' containing this code: 
' Simple test of ExcelDna 
Public Module MyFunctions 
Function AddThem(x, y) 
AddThem = x + y 
End Function 
End Module 
Change directory to where the Visual Basic compiler is, and use the vbc.exe compiler 
to compile the .vb file to a DLL (Dynamic Link Library) file to be included in the 
ExcelDna project.   
CD C:\Windows\Microsoft.NET\Framework\v4.0.30319 
vbc F:\DOCS\SCC3\ExcelDna\TestDll\TestDll.vb /target:library 
This creates a file 
F:\DOCS\SCC3\ExcelDna\TestDll\TestDll.dll
You can now refer to this external library from a .Dna file as follows: 
<DnaLibrary Language="VB" Name="MyFunctions" RuntimeVersion="v4.0"> 
<ExternalLibrary Path="TestDll.dll" /> 
</DnaLibrary> 
Copy the file ExcelDna.xll from the ExcelDna distribution folder to this project's 
folder and rename it TestDll.xll.  You should now have four files: 
TestDll.vb 
TestDll.dll 
TestDll.dna 
TestDll.xll 
VB.NET Image: Robust OCR Recognition SDK for VB.NET, .NET Image
for VB.NET provides users fast and accurate image recognition function, which converts scanned images into searchable text formats, such as PDF, PDF/A, WORD
pdf find text; search pdf documents for text
VB.NET PDF Convert to Text SDK: Convert PDF to txt files in vb.net
keeping original layout. VB.NET control for batch converting PDF to editable & searchable text formats. Support .NET WinForms, ASP
convert pdf to searchable text online; pdf text search
Now, double-click on TestDll.xll to load it. TestDll.xll will on loading read the 
TestDll.dna file and load the code from the TestDll.dll specified in the .dna file. 
Enable macros, and test the function. 
Troubleshooting 
Error: Could not load file or assembly '…TestDll.dl l' or one of its dependencies. This 
assembly is built by a runtime newer than the currently loaded runtime and cannot be 
loaded. 
RuntimeVersion="v4.0" 
was not specified so by default .Net runtime 
version 2 was loaded.  
Do not put spaces around the equals signs in the <DnaLibrary…> line. 
If you enclosed the function in a Public Class rather than a Public Module, and the 
function is not visible in Excel, add the keyword Shared to its declaration. 
2.2 Using an IDE 
If you have the budget, go for the Pro editions of the Visual Studio IDE with all the 
professional plugins. I shall use Microsoft Visual Basic 2010 Express which is free.  
An alternative is SharpDevelop, also free, which offers integration with third party 
plugins such as refactoring tools.  
http://www.icsharpcode.net/OpenSource/SD/Default.aspx 
Ross McLean uses the SharpDevelop IDE in this example 
http://www.blog.methodsinexcel.co.uk/2010/09/22/writing-an-Excel-Dna-function-
using-an-ide/ 
Download and install Visual Basic 2010 Express free from 
http://www.microsoft.com/visualstudio/en-us/products/2010-editions/express 
I recommend you read the Getting Started projects. 
By the time you read this, Visual Studio 2012 may be available. 
Start MS VS 2010 Visual Basic. You are going to create a new project. When I have 
re-used existing directories for VB.Net projects I ended up with a mess of duplicate 
files, so I'll start from scratch and copy in content as required. 
In Tools > Options > Projects and Solutions > check “Show Output window when 
Build starts” 
New Project > Class library, enter TestFuncs in the Name box. 
C# HTML5 Viewer: Load, View, Convert, Annotate and Edit Word
C# users can convert Convert Microsoft Office Word to searchable PDF online, create multi empowered to add annotations to Word, such as add text annotations to
select text in pdf file; pdf searchable text
Online Convert PDF to Text file. Best free online PDF txt
PDF document conversion SDK provides reliable and effective .NET solution for Visual C# developers to convert PDF document to editable & searchable text file.
how to select text in pdf image; select text in pdf
In the Solution Explorer pane, right-click Class1.vb and delete it. 
Project > Add New Item, Module, name it TestFuncs.vb. 
Enter the following code. It is very similar to what you would have in VBA except 
that in VBA the function declaration would be 
Public Function SumNValues(Values As Variant) As Double 
'Sum all numeric values in a 2-D array, excluding numbers formatted as dates  
Public Module MyFunctions 
Public Function SumNValues(ByVal Values(,) As Object) As Double 
Dim value As Object 
SumNValues = 0 
For Each value In Values 
Select Case VarType(value) 
Case vbDouble, vbCurrency, vbDecimal  ' exclude vbDate 
SumNValues = SumNValues + value 
End Select 
Next 
End Function 
End Module 
Next, you want the compiler to have a reference to the ExcelDna Integration library 
so it can resolve references to it. But you don't want to include the library as a file in 
the project, because it is also embedded in the file ExcelDna.xll which you will 
include as a file with the name changed to the project name. 
Project > Add Reference > Browse tab, to ExcelDna.Integration.dll eg 
…ExcelDna-0.30\Distribution\ExcelDna.Integration.dl l 
In subsequent projects, you can use Recent tab on the Add Reference dialog to revisit 
that location. 
Project > Show All Files and expand the References branch, 
Select ExcelDna.Integration, make property Copy Local=False 
VB.NET Create PDF from Text to convert txt files to PDF in vb.net
Best VB.NET adobe text to PDF converter library for Visual Studio .NET project. Batch convert editable & searchable PDF document from TXT formats in VB.NET
pdf text search tool; how to make pdf text searchable
C# Create PDF from Text to convert txt files to PDF in C#.net, ASP
Visual Studio .NET project. .NET control for batch converting text formats to editable & searchable PDF document. Free .NET library for
pdf make text searchable; search pdf files for text programmatically
Project > Add New Item > Text File > and name it TestFuncs.Dna  
Set in its File Properties the property Copy to Output Directory to Copy if newer
Enter the following content: 
<DnaLibrary Language="VB" RuntimeVersion="v4.0"> 
<ExternalLibrary Path="TestFuncs.dll" /> 
</DnaLibrary
File > Save All, leave the name as TestFuncs, create a directory for the solution. 
You can leave the output directory as the default (… … documents\visual studio 
2010\Projects) or change it to the same path as the previous example 
F:\DOCS\SCC3\ExcelDna\. If the folder name already exists, it will simply create 
another directory with a 1 added to the name, eg TestFuncs1. That could be a source 
of confusion. 
The folder has two files with extensions .sln, .suo, a subfolder TestFuncs with .vbproj 
and .vbproj.user, the .dna and .vb files you have just created, and subfolders binMy 
Project, and obj. The bin folder has subfolders Debug and Release. You don’t need to 
copy any files into Debug or Release, the Copy file properties you set above in the 
IDE will determine that.   
VB.NET Create PDF from Word Library to convert docx, doc to PDF in
Export all Word text and image content into high quality Professional .NET PDF batch conversion control. Easy to create searchable and scanned PDF files from
searching pdf files for text; text select tool pdf
VB.NET Create PDF from PowerPoint Library to convert pptx, ppt to
PDF, VB.NET convert PDF to text, VB.NET multiple pages PowerPoint to fillable and editable PDF documents. Easy to create searchable and scanned PDF files from
how to select all text in pdf; pdf text select tool
Outside the IDE, copy the file Excel-Dna-0.29\Distribution\ExcelDna.xll to the 
subfolder containing TestFuncs.dna and rename it TestFuncs.xll. To add it to the 
project do: 
Project > Add Existing Item > TestFuncs.xll and set in its File Properties the property 
Copy to Output Directory to Copy if newer.  
All you need to do now is click Build and check the Output window for any errors: 
------ Build started: Project: TestFuncs, Configuration: Debug Any CPU ------ 
TestFuncs -> F:\DOCS\SCC3\ExcelDna\TestFuncs\TestFuncs\bin\Debug\TestFuncs.dll 
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ========== 
Finally, double-click TestFuncs.xll in the output folder (Debug or Release) and test 
the function in Excel. Here is some test data: 
A1:  '1   
apostrophe prefix 
A2:  1 
number 
A3:  =1   
formula evaluating to 1 
A4: 100%  
1 formatted as percent 
A5: $1.00  
1 formatted as currency (your locale determines the symbol) 
A6: 01/01/1900  
1 formatted as date 
=SumNValues(A1:A6)
should return 4 the same as the VBA version (ie it should 
exclude A1 and A6), but it returns 5. Why? Let's do some debugging to find out. 
Compiler Options 
Visual Studio automatically chooses the Debug configuration when you choose Start 
from the Debug menu and the Release configurations when you use the Build menu. 
You can tailor this from the menu Build > Configuration Manager. See 
http://msdn.microsoft.com/en-us/library/wx0123s5.aspx  
Project > 
TestFuncs 
Properties > 
Compiler 
shows the 
options in 
effect. If you 
want a really 
nit-picking 
approach to 
possible 
problems, 
choose Option 
Strict On in the 
dialog: 
2.3 Debugging 
Debugging is easy in VBA, it takes a little more effort in VB.Net but still doable. 
VB Express does not show the option in its user interface (UI) to debug an addin 
executing inside Excel but you can do it yourself by editing the MyApp.vbproj.user 
file as follows, substituting MyApp with the XLL name. 
<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" 
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 
'Debug|AnyCPU' "> 
<StartAction>Program</StartAction> 
<StartProgram>C:\Program Files\Microsoft 
Office\Office14\EXCEL.EXE</StartProgram> 
<StartArguments>MyApp.xll</StartArguments> 
</PropertyGroup> 
<PropertyGroup> 
<ProjectView>ShowAllFiles</ProjectView> 
</PropertyGroup> 
</Project> 
Close the project and edit TestFuncs.vbproj.user as above, changing MyApp to 
TestFuncs. Then re-open the project and choose Debug or press F5. Excel will launch, 
you enable macros as normal. In the IDE, set a breakpoint on line 7: 
SumNValues = 0 
F9 sets a breakpoint same as VBA. Enter the function in a cell 
=SumNValues(A1:A6)
The code stops with the familiar yellow line in the IDE, you can inspect the variables, 
use the immediate window, and do pretty well anything you can do in VBA except 
edit the code on the run.  
Hover the mouse over the Values(,) parameter in line 5 and expand the tree to see 
what its items are: 
As you can see the last item, from A6, is passed as a Double rather than as a Date as is 
the case in VBA. This is another catch to be aware when passing values to VB.Net. 
To know what the original cell type is, we need to pass a reference to the range A1:A6 
to the function, not the values of the range. It's time to learn how to receive Excel 
references. 
2.4 Getting to the Excel object model 
The alternatives for interacting with Excel are explained by Govert van Drimmelen in 
a post to http://groups.google.com/group/Excel-Dna reproduced in the  background 
reading later.  
Example: Excel object model via COM, late bound 
Here is a VBA function that returns the sum of numeric values in a range excluding 
formula values and date constants. It uses properties such as .HasFormula and .Value. 
Public Function SumNConstants(RangeToSum As Range) As Double 
Dim cell As Range 
For Each cell In RangeToSum.Cells 
If Not cell.HasFormula Then 
Select Case VarType(cell.Value) 
Case vbDouble, vbCurrency, vbDecimal  ' exclude vbDate 
SumNConstants = SumNConstants + cell.Value 
End Select 
End If 
Next 
End Function 
For simplicity, let's add this function to the TestFuncs you already have. Later, you'll 
be starting a new project with more functionality.  
The type Range is flagged with green squiggles because it belongs to 
System.Data.Range which is a completely different VB.Net class which is not 
referred to in this project. Without using any Excel type library you need to use the 
variant Object type for Range and cell
When you fix that, you see a warning on the SumNConstants calculation: 
And on the End Function line 
These can be cleaned up by initialising SumNConstants to zero at the start of the 
function. 
However, we are not done yet. The line  
For Each cell In RangeToSum.Cells 
would throw a runtime error because RangeToSum is an Object in VB.Net with no 
connection to Excel. You would see #VALUE! in the cell and see in the IDE Output 
Window: 
A first chance exception of type 'System.MissingMemberException' occurred in 
Microsoft.VisualBasic.dll 
There are several things to add: 
1) 
At the top of TestFuncs.vb add a line 
Imports ExcelDna.Integration 
that 
allows us to shorten references to this frequently used qualifier like 
Dim App As Object = ExcelDna.Integration.ExcelDnaUtil.Application 
To 
Dim App As Object = ExcelDnaUtil.Application 
2) The 
<ExcelFunction(...)> 
attribute in the completed code below, and the 
IsMacroType:=True 
flag, are used to be able to handle ExcelReferences. 
3) The 
AllowReference:=True
option only affects parameters of type Object. It 
changes the registration type of the function to tell Excel to pass an 
ExcelDna.Integration.ExcelReference
if the function is called with a 
range reference. Otherwise the function would always get the values of the 
range, not the cell references. 
4) The 
ReferenceToRange
helper function converts an Excel Reference received 
from the UDF; first to an address using the C API class 
XlCall,
and then to a 
Range using the Range method of the ExcelDna.Integration. 
ExcelDnaUtil.Application object. 
In VBA you can define a function to receive a Range object and work with that 
directly. That is not possible with VB.Net. The closest we can get is to use 
AllowReference to tell Excel to pass a reference but even that is not a Range object; it 
is a C structure and we have to convert that to a Range by getting its address (eg 
"[TestFuncs.xlsx]Sheet1!$A$1:$A$6"
) and then passing that to the Excel 
Application.Range method to return a Range object which the function then returns as 
a generic Object. 
If you define a function but cannot see it from Excel as a UDF, first check that it is 
marked 
IsMacroType:=True 
and also check that the parameters are one of Object, 
Double, or String. A side effect to be aware of is that if the function that is registered 
as 
IsMacroType:=True 
has an argument marked 
AllowReference:=True
, Excel will 
treat the function as volatile even though you'd expect it not to be. 
Documents you may be interested
Documents you may be interested