<ExcelFunction(Category:="Test Functions", Description:="Sums numeric 
constants in range", IsMacroType:=True)>  
The Category and Description are used in Excel's Function Wizard: 
All the above looks rather more awkward compared to the VBA version. When you 
dig in to it, you recognise that the C API calls being used here are based on the 
original XLM macro language still used within defined Names for certain legacy 
purposes. For example, GET.CELL is represented by xlfGetCell. These macro-sheet 
functions and commands are documented in the Help file XLMacr8.hlp (formerly 
named Macrofun.hlp). That should be available from  
You can learn more by downloading the Microsoft Excel 2010 XLL Software 
Development Kit from 
The complete code of the function is now: 
Imports ExcelDna.Integration    ' for ExcelDnaUtil, XlCall, etc 
Public Module MyFunctions 
'Sum all numeric values in a 2-D array, exclude numbers formatted as 
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 
End Function 
<ExcelFunction(Category:="Test Functions", Description:="Sums numeric 
constants in range", IsMacroType:=True)> _ 
Public Function SumNConstants(<ExcelArgument(AllowReference:=True)> 
ByVal RangeToSum As Object) As Double 
Dim cell As Object, rgToSum As Object 
SumNConstants = 0 
rgToSum = ReferenceToRange(RangeToSum) 
For Each cell In rgToSum.Cells 
If Not cell.HasFormula Then 
Select Case VarType(cell.value) 
Pdf text search tool - 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
pdf find and replace text; convert pdf to searchable text
Pdf text search tool - 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
cannot select text in pdf; find text in pdf files
Case vbDouble, vbCurrency, vbDecimal  ' exclude vbDate 
SumNConstants = SumNConstants + cell.value 
End Select 
End If 
End Function 
Private Function ReferenceToRange(ByVal xlRef As ExcelReference) As 
Dim strAddress As String = XlCall.Excel(XlCall.xlfReftext, xlRef, 
ReferenceToRange = ExcelDnaUtil.Application.Range(strAddress) 
End Function 
End Module 
You can now press F5 to launch and test this solution. 
returns 3 because it sums A3,A4,A5, excluding A1 (text), A2 (formula), A6 (date). 
By the way, we can enhance the 
function to handle ranges with 
several areas. A single 
is limited to 255 characters, so the 
following concatenates the addresses from the individual areas of the reference: 
Private Function ReferenceToRange(ByVal xlRef As ExcelReference) As Object 
Dim cntRef As Long, strText As String, strAddress As String 
strAddress = XlCall.Excel(XlCall.xlfReftext, xlRef.InnerReferences(0), 
For cntRef = 1 To xlRef.InnerReferences.Count - 1 
strText = XlCall.Excel(XlCall.xlfReftext, 
xlRef.InnerReferences(cntRef), True) 
strAddress = strAddress & "," & Mid(strText, strText.LastIndexOf("!") + 
' +2 because IndexOf starts at 0 
ReferenceToRange = ExcelDnaUtil.Application.Range(strAddress) 
End Function
The drawback of late binding is that there is no Intellisense and no checking for 
mistakes at compile time. So you could have a misspelling like this that would only 
fail at runtime: 
Dim myRange 
myRange = Application.ActiveSheet.Ragne("A1") 
We'll show how to add Intellisense in the next section.  
Before we leave this example, let's look at another consequence of not having the 
Excel types available in DotNet.  
In VBA we are used to types like Range, Worksheet, Workbook, and global objects 
like ActiveCell, ActiveSheet, ActiveChart, ActiveWindow, ActiveWorkbook, and the 
Workbooks collection; and global constants like xlSheetVisible. These are not 
provided in VB.Net, so we have to use As Object for the types, qualify all the global 
objects back to the Application object, and define our own constants. 
To illustrate some of these concepts, let's add a Sub to the TestFuncs project to do 
some operations on an Excel sheet. 
Public Sub TestXL() ' test access to the Excel Object Model 
VB.NET PDF- View PDF Online with VB.NET HTML5 PDF Viewer
Easy to search PDF text in whole PDF document. VB.NET HTML5 PDF Viewer: View PDF Online. PDF file is loaded as sample file for viewing on the viewer. Select tool.
make pdf text searchable; how to search text in pdf document
C# HTML5 PDF Viewer SDK to view PDF document online in C#.NET
Easy to search PDF text in whole PDF document. C# HTML5 PDF Viewer: View PDF Online. PDF file is loaded as sample file for viewing on the viewer. 1. Select tool.
cannot select text in pdf file; select text in pdf reader
Dim ws As Object ' not As Worksheet 
ws = ExcelDnaUtil.Application.activesheet 
End Sub 
You can run this using Alt+F8 and typing in the macro name TestXL. 
Assuming Excel starts with the default Book1, it should show a message "Sheet1". 
To add it as a menu button for simpler testing, use: 
<ExcelCommand(MenuName:="Test&XL", MenuText:="Run Test&XL")> 
This is the old Excel 2003-style menu that appears in the Addins tab of the Ribbon. 
The shortcut key to that is X, and we have specified X as the menu accelerator and the 
button shortcut. So now you can run it just by typing Alt, X, X, X. 
By default the name is the method name, but you can override with an attribute:  
<ExcelCommand(Name:="MyMacro", MenuName:="Test&XL", MenuText:="Run 
When you go to the Macros dialog box and type in "MyMacro", the Run button 
should become available and then run your macro if you click it. 
To save having to type ExcelDnaUtil before Application, we can import that at the 
top. The code now reads 
Imports ExcelDna.Integration                ' for ExcelDnaUtil, XlCall, etc 
Imports ExcelDna.Integration.ExcelDnaUtil   ' for Application 
Public Module MyFunctions 
' we use ExcelCommand to attach this macro to a menu button in Excel 
<ExcelCommand(MenuName:="Test&XL", MenuText:="Run Test&XL")> _ 
Public Sub TestXL() ' test access to the Excel Object Model 
Dim ws As Object ' not As Worksheet 
ws = Application.activesheet 
End Sub 
You can now extend that to try other globals such as : 
MsgBox(Application.activeworkbook.name & vbLf _ 
& Application.activesheet.name & vbLf _ 
& Application.activecell.address  _ 
, vbOK, "Test XL") 
But if you try to specify  
The compiler outputs: 
Error 1 'xlR1C1' is not declared. It may be inaccessible due to its 
protection level. 
You would have to either specify the numeric value of 2 or add the line 
Const xlR1C1 As Integer = 2 
If you are pasting in code from VBA you either edit references to globals like 
"Workbooks" to prefix them with "Application." or add helper properties to return a 
reference to them like this: 
ReadOnly Property Workbooks As Object 
C# PDF Text Highlight Library: add, delete, update PDF text
a multifunctional PDF document annotation tool, which can example illustrates how to perform PDF text highlight function NET project, according to search option
select text pdf file; pdf search and replace text
VB.NET PDF Page Extract Library: copy, paste, cut PDF pages in vb.
Raster Edge XDoc.PDF SDK is such an extraction tool can be installed easily in VB.NET application, the extraction process will be greatly simplified.
can't select text in pdf file; text searchable pdf
Return Application.Workbooks 
End Get 
End Property 
So the code now looks like: 
Imports ExcelDna.Integration                ' for ExcelDnaUtil, XlCall, etc 
Imports ExcelDna.Integration.ExcelDnaUtil   ' for Application 
Public Module MyFunctions 
Const xlR1C1 As Integer = 2 
' we use ExcelCommand to attach this macro to a menu button in Excel 
<ExcelCommand(MenuName:="Test&XL", MenuText:="Run Test&XL")> _ 
Public Sub TestXL() ' test access to the Excel Object Model 
Dim ws As Object ' not As Worksheet 
ws = Application.activesheet 
MsgBox("Number of Workbooks open: " & Workbooks.count & vbLf _ 
& Application.ActiveWorkbook.name & vbLf _ 
& Application.activesheet.name & vbLf _ 
& Application.activecell.address(ReferenceStyle:=xlR1C1)  _ 
, vbOK, "Active info") 
End Sub 
ReadOnly Property Workbooks As Object 
Return Application.Workbooks 
End Get 
End Property 
At this stage you might be wondering how much editing is involved to migrate from 
ExcelDna, especially with all the xl* constants. Actually, the constants are easily 
done; just include in your project a copy of the enums downloaded from Mike 
Alexander's site. You'll have to change the second xlColorIndex to say xlCI. 
You can also use my contribution of the free addin QualifyVBACode. It takes the 
VBProject in a workbook and qualifies the xl constants with their enum types, and 
prefixes ones like ActiveSheet with Application. The search/replace strings are in a 
XML key/value config file that you can edit. Of course, please read the ReadMe.txt 
file first after unzipping this (XLL, DNA, DLL, CONFIG) :  
Because all the variables have to be Object, the loss of Intellisense is a risk when 
typing new code rather than simply copying working VBA code. So, let's tackle that 
problem next. 
C# WPF PDF Viewer SDK to view, annotate, convert and print PDF in
Rotate a PDF Page. PDF Read. Text: Extract Text from PDF. Text: Search Text in PDF. Users can add various annotations to PDF, such as text, text box, note
find and replace text in pdf; convert pdf to word searchable text
VB.NET PDF - WPF PDF Viewer for VB.NET Program
copy, paste, C#.NET rotate PDF pages, C#.NET search text in PDF, C# RasterEdge WPF PDF Viewer for VB.NET is a PDF utility annotation generation tool.
search text in multiple pdf; search a pdf file for text
Boilerplate steps for creating a project in VB Express 
The following projects start in the same way, so I'll give the generic steps here using 
the term "MyProject" which you can substitute with your own solution name. In the 
subsequent projects, I refer to these steps as "Create the standard ExcelDna project 
with the name …." 
New Project > Class library, enter MyProject in the Name box. 
Project > Add Reference > Recent tab, to ExcelDna.Integration.dll  
Project > Show All Files and expand the References branch, 
Select ExcelDna.Integration, make property Copy Local=False 
Project > Add New Item > Text File > and name it MyProject.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="MyProject.dll" /> 
In the Solution Explorer pane, right-click Class1.vb and delete it. Or, you can simply 
rename this later. 
File > Save All, leave the name as MyProject, create a directory for the solution. 
Close the project and outside the IDE edit MyProject.vbproj.user to add the Debug 
<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" 
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 
'Debug|AnyCPU' "> 
<StartProgram>C:\Program Files\Microsoft 
Outside the IDE, copy the file Excel-Dna-0.29\Distribution\ExcelDna.xll to the 
subfolder containing MyProject.dna and rename it MyProject.xll. To add it to the 
project, re-open the project and do: 
Project > Add Existing Item, Show All Files (*.*) > MyProject.xll and set in its File 
Properties the property Copy to Output Directory to Copy if newer
You could also do File > Export Template > project template > type a description and 
click Finish. This creates a file Myproject.zip in the folder Documents\Visual Studio 
2010\My Exported Templates.  You can then see this template when creating projects 
in the future. 
C# PDF Convert to Tiff SDK: Convert PDF to tiff images in C#.net
RasterEdge C#.NET PDF to TIFF converting library control (XDoc.PDF) is a multifunctional PDF document converting tool, which can perform high-fidelity PDF
search pdf files for text programmatically; search text in pdf image
VB.NET PDF Page Insert Library: insert pages into PDF file in vb.
Using our PDF document manipulation APIs, users can easily customize and set the PDF page adding tool to freely choose the specific location of the new page.
convert pdf to searchable text; cannot select text in pdf file
Stage 3: Adding Intellisense to a EXCELDNA solution 
As explained in the background reading at the end of this, there are two methods: the 
Microsoft Primary Interop Assembly (PIA) or a third party library like NetOffice.  
The simplest use of PIA is described at Ross Mclean's blog 
He provides all the PIAs in this zip: 
Project > Add reference > .Net assembly Browser > find the PIA folder you just 
extracted, and pick the right version for your needs. Then in your module use 
Imports Microsoft.Office.Interop.Excel 
He says "Otherwise, the drawback with the MS PIA is that it has to be installed on the 
client machine, and there is a different version for each version of Office. This also 
means you need admin rights to deploy your add-in."  However, that is overcome in 
.Net version 4.  
http://blogs.msdn.com/b/vsto/archive/2008/05/20/common-pitfalls- during-pia-
Example of using the Excel Primary Interop Assembly (PIA) 
I shall target Excel 2007 in this example and then test it in 2003 (for historical 
interest) and 2010. 
Create the standard ExcelDna project with the name TestPIA. 
For debugging, specify Excel 2007 in TestPIA.vbproj.user : 
<StartProgram>C:\Program Files\Microsoft 
Project > Add Reference > navigate to the Excel 2007 version of the PIA, in this case 
In the properties, check "Embed Interop Types" is True.
We can now use Excel types in Dim statements such as Range, Workbook, etc. 
Project > Add New Item, Module, name it TestPIA.vb. 
Copy in the following code, similar to that in the TestFuncs example.  
Because 'Application' is ambiguous between ExcelDna.Integration.ExcelDnaUtil and 
Microsoft.Office.Interop.Excel, create a global helper to point to the current Excel 
instance via ExcelDna. If you're preparing an addin for migration, changing 
As of Visual Studio 2010, C#/VB projects that target .NET 4 can now use the embedded interop types 
feature to get around the limitation of having to deploy the PIA on the target PC. When the Embed 
Interop Types property of a PIA reference is True, then any PIA types used by the application are 
embedded in the built assembly, so that the PIA is not needed at run time. In this scenario, an 
application that references an Office 2010 PIA can actually run on a computer with an earlier version 
of Office installed, provided that it does not use any APIs that are new in Office 2010. For a related 
walkthrough, see http://msdn.microsoft.com/en-us/library/ee317478.aspx. This will only work under 
.NET 4, and won't work with the NetOffice assemblies since they are not 'Primary' interop assemblies. 
VB.NET PDF Text Highlight Library: add, delete, update PDF text
C#.NET rotate PDF pages, C#.NET search text in PDF is a multifunctional PDF document annotation tool, which can sample code shows how to highlight PDF text in VB
how to search a pdf document for text; select text pdf file
XDoc.HTML5 Viewer for .NET, All Mature Features Introductions
search text-based documents, like PDF, Microsoft Office Word, Excel, and PowerPoint (2003 and 2007 versions). The well built-in text search tool is compatible
pdf searchable text converter; text searchable pdf file
"ActiveWorkbook" to "Application.ActiveWorkbook" etc can be done in VBA and it 
works just as well.  
The ExcelApi.Enums need their prefix so you have to use 
XlReferenceStyle.xlR1C1; or create your own enums module from the text 
file on the datapigtechnologies web site as described before.  
However although Intellisense is fine for suggesting methods and properties as you 
type, it does not detect invalid methods pasted in from other code. 
ws.UsedRagne will not get flagged as an error until runtime. 
Imports ExcelDna.Integration            ' for ExcelDnaUtil, ExcelCommand, 
XlCall, etc 
Imports Microsoft.Office.Interop.Excel  ' Interface types from PIA eg 
Workbook, Range 
'instead of Imports ExcelDna.Integration.ExcelDnaUtil create this global 
' because 'Application' is ambiguous between ExcelDnaUtil and Interop.Excel 
Module Globals 
' connect the global Application to the Excel instance via ExcelDna 
Public ReadOnly Property Application As Application 
Application = ExcelDnaUtil.Application 
End Get 
End Property 
End Module 
Public Module TestPIA 
' we use ExcelCommand to attach this macro to a menu button in Excel 
<ExcelCommand(MenuName:="Test &XL", MenuText:="Test &XL PIA")> _ 
Public Sub TestPIA() ' test access to Excel via PIA 
Dim wb As Workbook, ws As Worksheet, rg As Range, cell As Range 
wb = Application.ActiveWorkbook 
ws = Application.ActiveSheet 
cell = Application.ActiveCell 
' start with activecell A1 in Sheet1 
With cell.Offset(1, 1)  ' B2 
.Value = .Address(TrueTrue
End With 
cell = Application.ActiveCell 
rg = Application.ActiveSheet.range("B3:C5") 
rg.Formula = "=Row()" 
MsgBox("Number of Workbooks open: " & Application.Workbooks.Count & 
vbLf _ 
& wb.Name & vbLf _ 
& ws.Name & vbLf _ 
& cell.Address(TrueTrue
ReferenceStyle:=XlReferenceStyle.xlR1C1)  _ 
, vbOK, Application.Name & " " & Application.Version) 
End Sub 
End Module 
Test the project with VB Express with F5. Excel 2007 should launch and the menu 
should be visible. Quit Excel 2007. 
Start Excel 2003, double-click … … \TestPIA\TestPIA\bin\Debug\TestPIA.xll  and the 
menu 'Test XL' should appear with the item 'Text XL PIA' and it runs. 
Start Excel 2010, do the same, and it should also work. 
Obviously, you can't access parts of the object model not present in the version of 
Excel running. If you need to handle this conditionally, then in the code test for the 
value of Application.Version. 
I have Excel 2013 on another PC, so to test there I'll create a single XLL with the 
components so I have only one file to deploy. 
Simplify deployment by packing the components into one .XLL file. 
ExcelDnaPack is a command-line utility to pack Excel-Dna add-ins into a single .xll 
Example: ExcelDnaPack.exe MyAddins\FirstAddin.dna  
The packed add-in file will be created as MyAddins\firstaddin-packed.xll. 
To pack additional assemblies, you add Pack="true" (note lowercase "true") to the 
references in the .dna file, eg 
<ExternalLibrary Path="TestPIA.dll" Pack="true" /> 
<Reference Path="any other references" Pack="true" />  
So in the command window it will appear as (warning is from second time output) 
...\exceldna-0.29\distribution\exceldnapack bin\debug\testpia.dna 
Output .xll file bin\debug\testpia-packed.xll already exists. Overwrite? 
[Y/N] y 
Using base add-in bin\debug\testpia.xll 
->  Updating resource: Type: ASSEMBLY_LZMA, Name: EXCELDNA.INTEGRATION, 
Length: 43546 
~~> ExternalLibrary path TestPIA.dll resolved to bin\debug\TestPIA.dll. 
->  Updating resource: Type: ASSEMBLY_LZMA, Name: TESTPIA, Length: 7078 
->  Updating resource: Type: DNA, Name: __MAIN__, Length: 377 
Completed Packing bin\debug\testpia-packed.xll. 
To test, I copied testpia-packed.xll to the other PC, started Excel 2013, double clicked 
the xll, enable the addin, and the Alt-X,X,X test passes. 
Example of using NetOffice 
NetOffice is a version-independent set of Office Interop assemblies put together by 
Sebastian Lange. 
Unzip the distribution zip file into a convenient directory. 
When you have time, read the files in the Examples and Tutorials directories. 
Create the standard ExcelDna project with the name TestNetOffice. 
Project > Add Reference > navigate to the correct version of Netoffice.dll eg 
" NetOffice 1.5.1\NET 4.0\Assemblies\Any CPU\NetOffice.dll" 
Set in its File Properties the property Embed Interop types=False and Copy 
Local=True. We can't use the embedding feature, intended for the MS PIAs, in 
NetOffice. Do the same two things for ExcelApi.dll 
Depending on the features you use you may also need 
Project > Add New Item, Module, name it TestNetOffice.vb. 
Copy in this code, similar to that in the TestFuncs example, but instead of the generic 
Object type for the variables, we'll use types from NetOffice.ExcelApi. For 
convenience and compatibility with VBA we shall name the ExcelAPI as Excel in the 
Imports clause. This should look familiar enough to a VBA developer. If you're 
preparing an addin for migration, changing "As Range" to "As Excel.Range" can be 
done in VBA and it works just as well.  
There are some awkward syntax changes; for example, all .Address methods change 
to .get_Address. Be careful to change  .Offset() and .Resize() to .get_Offset and 
.get_Resize; the first version will not be flagged as an error but has no effect, it 
returns the original range, so it's an easy mistake to make. 
The extra line 
New Excel.Application(Nothing, ExcelDnaUtil.Application) 
is needed to initialise the NetOffice globals so we can now simply use 
ActiveWorkbook etc as in VBA.  
You will also notice that the imported ExcelApi.Enums need their prefix so you have 
to use XlReferenceStyle.xlR1C1; or create your own enums module from the text file 
on the datapigtechnologies web site as described before.  
Finally, I have added a Try…Catch block to illustra te the error handling in VB.Net. If 
you want to use Resume Next, that is only available with the On Error style of error 
Imports ExcelDna.Integration                 ' for ExcelDnaUtil, XlCall, etc 
'Imports ExcelDna.Integration.ExcelDnaUtil  ' not needed for Application now 
we have NetOffice 
Imports Excel = NetOffice.ExcelApi           ' For Excel. types 
Imports NetOffice.ExcelApi.GlobalHelperModules.GlobalModule ' for Workbooks 
Imports NetOffice.ExcelApi.Enums             ' for xlConstants 
Public Module MyFunctions 
' we use ExcelCommand to attach this macro to an Add-Ins menu button in 
<ExcelCommand(MenuName:="Test&XL", MenuText:="Run Test&XL")> _ 
Public Sub TestXL() ' test access to the Excel Object Model 
Dim wb As Excel.Workbook, ws As Excel.Worksheet, rg As Excel.Range, cell 
As Excel.Range 
Dim dummy As Excel.Application ' need this to initialise NetOffice 
dummy = New Excel.Application(Nothing, ExcelDnaUtil.Application) 
wb = ActiveWorkbook 
ws = ActiveSheet 
cell = ActiveCell 
' start with activecell A1 in Sheet1 
With cell.get_Offset(1, 1)  ' B2 
.Value = .get_Address(True, True, 
End With 
cell = ActiveCell 
rg = ActiveSheet.range("B3:C5"
rg.Formula = "=Row()" 
MsgBox("Number of Workbooks open: " & Workbooks.Count & vbLf _ 
& wb.Name & vbLf _ 
& ws.Name & vbLf _ 
& cell.get_Address(True, True, 
referenceStyle:=XlReferenceStyle.xlR1C1)  _ 
, vbOK, Application.Name) 
Catch ex As Exception 
Dim Message As String = ex.Message 
If StrComp(Message, "See inner exception(s) for details."
vbTextCompare) = 0 Then 
Message = ex.InnerException.Message 
End If 
Message = Message & vbLf & ex.StackTrace 
MsgBox(Message, MsgBoxStyle.Exclamation, ex.Source) 
End Try 
End Sub 
End Module 
NetOffice allows version independence with .Net version 2. As I shall be targeting 
version 4, I shall use the PIA and embed the Interop to obtain the same result. 
Documents you may be interested
Documents you may be interested