Specific NetOffice notes 
Range, Offset, Resize 
(This may change with Netoffice libraries) 
You can use Application.Range(strAddress) to get a range from any qualified address. 
Be aware that with the ExcelApi.Range type, you MUST change all occurrences of 
.Offset to .get_Offset and .Resize to .get_Resize. 
Dim xCell As NetOffice.ExcelApi.Range, oCell As Object 
ws.Range("B2:D4").Select() '  3 rows, 2 columns 
xCell = Selection 
oCell = Selection 
'Object references work like in VBA 
oCell: Range $B$2:$D$4  
oCell.offset(1, 1): Range $C$3:$E$5 as expected 
oCell.get_offset(1,1): Range $C$3:$E$5 as expected 
'ExcelApi references are different 
xCell: Range $B$2:$D$4 
xCell.offset(1, 1): Range $B$2 ' cell in row 1, col 1 of B2:D4 
xCell.get_offset(1,1): Range $C$3:$E$5 as expected 
xCell.offset(1, 1) is evaluated like this in NetOffice 
rg=xcell            ' B2:D4 
rg=rg.Offset    ' B2:D4 
rg=rg(1,1)        ' B2 
Enumerations and .xl* Constants 
With NetOffice, first import the NetOffice.ExcelApi.Enums module. Then prefix 
enumerated constants with their type, eg XlDirection.xlUp rather than simply xlUp. 
The prefix can be added in VBA as well which may avoid ambiguities like xlVisible 
and xlSheetVisible. 
Change all occurrences of "As Range" in your VBA to "As Excel.Range" and this will 
work the same in both VBA and VB.Net 
.Characters property gives an error 
Class 'NetOffice.ExcelApi.Characters' cannot be indexed because 
it has no default property. 
.Characters(Start:=1, Length:=lPos).Font.ColorIndex = 38 
This is a byproduct of the way the default properties are accessed in Netoffice. As of 
1.5.1, there is no workaround yet. 
To use the global Application object 
1) Do this in a Public Module GlobalHelper 
Property Application As Netoffice.ExcelApi.Application 
2) Do this in a Public module 
Public Module Globals 
' connect the global Application to the Excel instance via ExcelDna 
ReadOnly Property Application As Application 
Pdf select text - 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
text select tool pdf; pdf editor with search and replace text
Pdf select text - 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
find and replace text in pdf; convert pdf to word searchable text
Application = ExcelDnaUtil.Application 
End Get 
End Property 
End Module 
I need Netoffice.ExcelApi. or I get  
'error BC30561: 'Application' is ambiguous, imported from the namespaces or types 
'System.Windows.Forms, NetOffice.ExcelApi'.  
In VBA, drawing objects are a collection but in Netoffice they are a COMObject 
For Each obj In ws.DrawingObjects gives Error 155 Expression is of type 
'LateBindingApi.Core.COMObject', which is not a collection type. 
' instead use: 
For Each obj In CType(ws, Object).DrawingObjects 
For Netoffice it is also necessary to change some properties to the Excel-Dna get_ 
There may be more. 
VBA accepts a variable number of parameters, eg for .Offset you can specify only a 
row offset and the column offset defaults to 0. They must be specified in Excel-Dna 
so after the search/replace for the .get_ names, some parameters may have to be 
completed. The only one I found irritating was .get_Address which needs five 
parameters so I decided to create a function Range_Address which handles the 
optional parameters and will also convert 0/1 to False/True as required when that kind 
of lazy shortcut was taken when writing the VBA code. 
To do a search and replace of <expression>.Address(…  
Visual Studio regular expressions: Find and Replace 
Notepad++ regular expressions: Search for any text followed by a space or bracket 
then any text followed by .address( and replace it by the first two subexpressions then 
Range_Address( then the text just before .address, which should be the range object 
(.*)([ \(])(.*?)(\.address\() 
Replace with: 
\1\2 Range_Address(\3, 
To index into the wb.Names collection, use .get_Name(index) 
C# PDF Image Extract Library: Select, copy, paste PDF images in C#
C#: Select All Images from One PDF Page. C# programming sample for extracting all images from a specific PDF page. C#: Select An Image from PDF Page by Position.
select text in pdf reader; searching pdf files for text
VB.NET PDF Image Extract Library: Select, copy, paste PDF images
VB.NET : Select An Image from PDF Page by Position. Sample for extracting an image from a specific position on PDF in VB.NET program.
search pdf for text in multiple files; pdf select text
.Sort via the PIA needs at least the first key specified; and orientation if you want it 
sorted top to bottom, eg  
rg.currentregion.sort( Key1:=rg, 
Orientation:=xlSortOrientation.xlSortColumns ) 
The .Sort method in NetOffice was a headache because every possible parameter must 
be specified, unlike VBA where they can be omitted. Isolate this into its own sub: 
ws.Cells(1, 2 ).CurrentRegion.Sort(header:=XlYesNoGuess.xlYes, _ 
key1:=ws.Cells(1, 3 ), order1:=XlSortOrder.xlDescending, _ 
key2:=ws.Cells(1, 2 ), order2:=XlSortOrder.xlDescending, _ 
key3:=ws.Cells(1, 1 ), order3:=XlSortOrder.xlAscending, _ 
dataOption1:=XlSortDataOption.xlSortNormal, _ 
dataOption2:=XlSortDataOption.xlSortNormal, _ 
dataOption3:=XlSortDataOption.xlSortNormal, _ 
matchCase:=False, orderCustom:=Nothing, _ 
orientation:=XlSortOrientation.xlSortColumns, _ 
sortMethod:=XlSortMethod.xlPinYin, type:=Nothing
This has seventeen parameters. If you want to specify one near the end of the list, like 
AddToMRU, in VBA you can simply use named parameters, in VB.Net you must 
specify them all up to that point. You cannot omit them by using two commas in 
succession. You can pass Nothing for all values except 'format' and 'origin' which 
must have some real value, eg 
Workbooks.Open(filename:=strFilename, updateLinks:=False, readOnly:=False, _ 
format:=5, password:=Nothing, writeResPassword:=Nothing, _ 
ignoreReadOnlyRecommended:=Nothing, origin:=2, addToMru:=False, _ 
converter:=Nothing, corruptLoad:=Nothing, delimiter:=Nothing, _ 
editable:=False, local:=Nothing, notify:=Nothing) 
'format:=5 any value from 1-6 will do if it's not a text file 
You cannot specify Format:=Nothing or origin:=Nothing, get: 
System.Runtime.InteropServices.COMException (0x800A03EC): Unable to get the Open 
property of the Workbooks class 
The FileFilter argument consists of pairs of file filter strings followed by the MS-DOS 
wildcard file filter specification, eg "All Files (*.*),*.*". If you omit the comma, 
Excel silently errors and the ExcelDna app hangs. 
VB.NET PDF Text Redact Library: select, redact text content from
VB.NET PDF - Redact PDF Text. Help Users to Redact PDF Text to Protect PDF Document in VB.NET. Overview. Redact PDF Text using VB.NET. Add necessary references:
pdf text select tool; search pdf documents for text
C# PDF Text Redact Library: select, redact text content from PDF
C#.NET PDF SDK - Redact PDF Text in C#.NET. C# Demo Code for Redacting PDF Text to Protect Your PDF Document in C#.NET Project. Best
how to select all text in pdf file; find and replace text in pdf file
Stage 4: Creating an add-in with Ribbon commands 
The above examples show an old Excel 2003 style menu button. It's time to create an 
addin with a Ribbon button that does more work with Excel. 
We shall create an add-in to list the names of sheets to a worksheet named $TOC 
Create the standard ExcelDna project with the name WorkbookTOC. 
Project > Add Reference > navigate to the Excel 2010 version of the PIA, in this case 
Project > Add New Item, Module, name it WorkbookTOC.vb. 
Enter the following test code; we will replace it with real code later. 
Public Module WorkbookTOC 
Sub CreateTableOfContents() 
End Sub 
End Module 
Edit the standard .dna text file you created named WorkbookTOC.Dna and copy in 
the text below. The ExternalLibrary WorkbookTOC.dll will be created when you 
build the project. The CustomUI contains the Ribbon markup which adds a group to 
the Excel Ribbon with one button with a standard MSO image and an onAction that 
calls a standard ExcelDna method that in turn calls (with no parameter) the macro 
named in the tag. 
<DnaLibrary Language="VB" Name="Table of Contents Add-in" 
<ExternalLibrary Path="WorkbookTOC.dll" /> 
<!--Note the <CustomUI> with a capital ‘C’ tag that encloses the 
with a small ‘c’ tag that saved in the .xll. --> 
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> 
<ribbon startFromScratch="false"> 
<tab idMso="TabReview"> 
<group id="WorkbookTOC" label="TOC" insertAfterMso="GroupEditingExcel"> 
<button id="CreateTableOfContents" tag="CreateTableOfContents" 
onAction="RunTagMacro" label="&amp;Table of Contents"  
screentip="Insert Table of Contents worksheet" size="large" 
imageMso="TableOfFiguresInsert" /> 
To support the Excel 2007/2010 ribbon, add a Class module Ribbon.vb with a Public 
class for the Ribbon handler.   
The ExcelRibbon-derived class must also be marked as ComVisible(True), or in the 
project properties, advanced options, the ComVisible option must be checked. This is 
not the ‘Register for COM Interop’ option, which mu st never be used with ExcelDna. 
C# HTML5 PDF Viewer SDK to view PDF document online in C#.NET
Tools Tab. Item. Name. Description. 1. Select tool. Select text and image on PDF document. 2. Hand tool. Pan around the document. Go To Tab. Item. Name. Description
search text in multiple pdf; pdf find highlighted text
VB.NET PDF- View PDF Online with VB.NET HTML5 PDF Viewer
Tools Tab. Item. Name. Description. 1. Select tool. Select text and image on PDF document. 2. Hand tool. Pan around the document. Go To Tab. Item. Name. Description
search pdf files for text; pdf make text searchable
Imports ExcelDna.Integration 
Imports System.Runtime.InteropServices      ' for <ComVisible(True)>  
<ComVisible(True)> _ 
Public Class Ribbon    ' must be Public 
Inherits CustomUI.ExcelRibbon 
End Class 
If you use any other onAction procedure than "RunTagMacro", put it inside the 
Ribbon class because only subs in this class are visible to the Ribbon onAction. It is 
also the only way to pass the calling Ribbon control to the sub, for example: 
<ComVisible(True)> _ 
Public Class Ribbon 
Inherits ExcelRibbon 
Sub RunControlID(ByVal ctl As IRibbonControl) 
End Sub 
Sub RunControlIDWithTag(ByVal ctl As IRibbonControl
ExcelDnaUtil.Application.Run(ctl.Id, ctl.Tag) 
End Sub 
End Class 
Test the project with F5. After enabling the macros, you should see a button to the 
right of the Review group that displays the test message. If you don't, look at the 
Ribbon troubleshooting guide
Having got the skeleton right, now we'll add the code to create the TOC. 
It should look like this: 
VB.NET PDF - View PDF with WPF PDF Viewer for VB.NET
Tools Tab. Item. Name. Description. Ⅰ. Hand. Pan around the PDF document. Ⅱ. Select. Select text and image to copy and paste using Ctrl+C and Ctrl+V.
how to search text in pdf document; how to select text in pdf
C# WPF PDF Viewer SDK to view PDF document in C#.NET
Tools Tab. Item. Name. Description. Ⅰ. Hand. Pan around the PDF document. Ⅱ. Select. Select text and image to copy and paste using Ctrl+C and Ctrl+V.
converting pdf to searchable text format; how to make pdf text searchable
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 helper 
' because 'Application' is ambiguous between ExcelDnaUtil and Interop.Excel 
Public Module Globals 
' connect the global Application to the Excel instance via ExcelDna 
ReadOnly Property Application As Application 
Application = ExcelDnaUtil.Application 
End Get 
End Property 
End Module 
Public Module WorkbookTOC 
Const WS_TOC_NAME = "$TOC" 
Sub CreateTableOfContents() 
Dim wsDoc As Worksheet = Nothing 
'Structured Error Handling (SEH): 
If Application.ActiveWorkbook Is Nothing Then 
Exit Sub 
End If 
If SheetExists(WS_TOC_NAME) Then 
End If 
wsDoc = Application.Worksheets.Add() 
wsDoc.Name = WS_TOC_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 
Sub CreateTableOfSheetsInfo(ByVal wsDoc As Worksheet
Dim wbCheck As Workbook 
Dim ws As Worksheet, lRow As Long 
Dim lSheet As Long, lCol As Long, rgFound As Range, sTemp As String 
wbCheck = wsDoc.Parent 
On Error GoTo OnError 
Application.EnableCancelKey = XlEnableCancelKey.xlErrorHandler 
Application.Calculation = XlCalculation.xlCalculationManual 
Application.Cursor = XlMousePointer.xlWait 
Application.ScreenUpdating = False 
' Simplified version of columns, add CodeName or other stats if you like 
If SheetIsEmpty(wsDoc) Then 
lRow = 1 
lRow = wsDoc.Cells.SpecialCells(XlCellType.xlCellTypeLastCell).Row + 1 
End If 
lCol = 1 
' using Array() UDF for VBA compatibility 
WriteHeadings(wsDoc.Cells(lRow, lCol), _ 
C# WPF PDF Viewer SDK to annotate PDF document in C#.NET
Line color. Select the line color when drawing annotations on PDF document. Default create. Click to select drawing annotation with default properties. Text box.
search a pdf file for text; select text in pdf file
VB.NET PDF - Annotate PDF with WPF PDF Viewer for VB.NET
Line color. Select the line color when drawing annotations on PDF document. Default create. Click to select drawing annotation with default properties. Text box.
pdf text search tool; can't select text in pdf file
Array("Sheet""Type""Sheet Tab Name", "Visibility""Contents""Sum Total"
wsDoc.Cells(lRow, lCol).AddComment(CStr(Now())) 
For lSheet = 1 To wbCheck.Sheets.Count 
lRow = lRow + 1 
lCol = 0 
lCol = lCol + 1 
wsDoc.Cells(lRow, lCol).Value = lSheet 
lCol = lCol + 1 
wsDoc.Cells(lRow, lCol).Value = TypeName(wbCheck.Sheets(lSheet)) 
'Tab name with hyperlink to ws 
lCol = lCol + 1 
'ActiveSheet.Hyperlinks.Add Anchor:=ActiveCell, Address:= "F:\DOCS\TEST\ex1u.xls", _ 
'   SubAddress:="'Budget 08'!C69", TextToDisplay:="C69" 
' must specify all named parameters up to last one used, unlike VBA 
If TypeName(wbCheck.Sheets(lSheet)) = "Worksheet" Then 
wsDoc.Hyperlinks.Add(anchor:=wsDoc.Cells(lRow, lCol), _ 
address:=wbCheck.FullName, _ 
subAddress:=QuotedName(wbCheck.Sheets(lSheet).name) & "!A1", _ 
screenTip:=wbCheck.Sheets(lSheet).Name, _ 
textToDisplay:="'" & wbCheck.Sheets(lSheet).Name) 
End If 
Select Case wbCheck.Sheets(lSheet).Visible 
Case XlSheetVisibility.xlSheetHidden   ' was .xlHidden 
sTemp = "Hidden" 
Case XlSheetVisibility.xlSheetVeryHidden ' was . xlVeryHidden 
sTemp = "Very Hidden" 
Case Else 
sTemp = "Visible" 
End Select 
lCol = lCol + 1 
wsDoc.Cells(lRow, lCol).Value = sTemp 
lCol = lCol + 1 
' this section only for worksheets 
If TypeName(wbCheck.Sheets(lSheet)) = "Worksheet" Then 
ws = wbCheck.Sheets(lSheet) 'WS is type Worksheet 
If (ws Is wsDoc) Then ' skip THIS sheet being created 
wsDoc.Cells(lRow, lCol).Value = "(This sheet)" 
'Contents of first occupied cell 
If Not SheetIsEmpty(ws) Then  '  ws.UsedRange.Cells.Count > 0 Then 
' protect against empty sheet giving nonsense usedrange $U$1:$T$58 
rgFound = ws.Cells(1, 1) 
sTemp = CStr(rgFound.Value) 
' .text may show #### if narrow column and .value of date>2M may give 
overflow err 6 
If Len(sTemp) = 0 Then 
' don't use not IsEmpty(rgFound.Value) because single apostrophe  
'   or ="" return false, we want some text 
rgFound = FindFirst(ws.UsedRange, "*"XlFindLookIn.xlFormulas, 
' find anything starting top left used range 
If Not rgFound Is Nothing Then 
sTemp = CStr(rgFound.Value) 
End If 
End If 
wsDoc.Cells(lRow, lCol).Value = "'" & sTemp 
End If 
'Sum Total 
lCol = lCol + 1 
With wsDoc.Cells(lRow, lCol) 
.Formula = ("=sum(" & QuotedName(ws.Name) & "!" & ws.UsedRange.Address(True
True) & ")"
.Value = .Value ' convert to values; remove this if you want it to recalc 
.NumberFormat = "General" ' in case dates in source 
End With 
' #Rows, #Cols in used range (may not be real last occupied cell) 
rgFound = ws.Cells.SpecialCells(XlCellType.xlCellTypeLastCell) 
If Not SheetIsEmpty(ws) Then ' show blanks if empty sheet 
lCol = lCol + 1 
wsDoc.Cells(lRow, lCol).Value = rgFound.Row 
lCol = lCol + 1 
wsDoc.Cells(lRow, lCol).Value = rgFound.Column 
End If 
End If ' being checked 
ElseIf TypeName(wbCheck.Sheets(lSheet)) = "Chart" Then 
With wbCheck.Sheets(lSheet) 
If .HasTitle Then 
sTemp = "Chart Title:" & "'" & .ChartTitle.Text & "'" 
sTemp = "No Chart Title" 
End If 
sTemp = sTemp & ", " & .SeriesCollection.Count & " Series" 
End With 
wsDoc.Cells(lRow, lCol).Value = "'" & sTemp 
' not a worksheet, or Chart, what is it? Dialog? Macro? 
End If 
Next lSheet 
GoTo Exitproc 
Select Case ErrorHandler() 
Case vbYes, vbRetry : Stop : Resume 
Case vbNo, vbIgnore : Resume Next 
Case Else : Resume Exitproc ' vbCancel 
End Select 
On Error GoTo 0 ' restore any screenupdating etc 
Application.Calculation = XlCalculation.xlCalculationAutomatic 
Application.Cursor = XlMousePointer.xlDefault 
Application.ScreenUpdating = True 
End Sub 
Function SheetExists(ByVal sName As StringAs Boolean  ' check for any type of sheet - 
worksheet, chart 
On Error Resume Next 
SheetExists = (StrComp(sName, Application.ActiveWorkbook.Sheets(sName).Name, 
vbTextCompare) = 0) ' 0=matches 
End Function 
Function SheetIsEmpty(ByVal ws As WorksheetAs Boolean '-As Worksheet 
Dim rg As Range 
rg = ws.UsedRange 
If rg.CountLarge() = 1 Then  ' only 1 cell, probably A1 
SheetIsEmpty = IsEmpty(CStr(rg.Value)) 
SheetIsEmpty = False 
End If 
End Function 
Function Array(ByVal ParamArray items() As ObjectAs Array 
Return items 
End Function 
Sub WriteHeadings(ByVal StartCell As RangeByVal aHeadings As Object
With StartCell.Resize(1, UBound(aHeadings) - LBound(aHeadings) + 1) 
.Value = aHeadings 
.Font.Bold = True 
End With 
End Sub 
Private Function IsEmpty(ByVal p1 As StringAs Boolean ' for VBA compatibility 
Return String.IsNullOrEmpty(p1) 
End Function 
Function FindFirst(ByVal rgSearch As RangeByVal vWhat As ObjectByVal lLookIn As Long
ByVal lLookAt As LongAs Range 
On Error Resume Next ' should check for err=0 or err=1004 being only two expected 
' After:=rg.SpecialCells(xlCellTypeLastCell) means the first found could be first cell 
in range 
FindFirst = rgSearch.Find(What:=vWhat, 
After:=rgSearch.SpecialCells(XlCellType.xlCellTypeLastCell), _ 
LookIn:=lLookIn, LookAt:=lLookAt, _ 
SearchOrder:=XlSearchOrder.xlByRows, SearchDirection:=XlSearchDirection.xlNext, 
MatchCase:=False', SearchFormat:=False) 
Debug.Assert(Err.Number = 0 Or Err.Number = 1004 Or Application.ThisWorkbook.IsAddin) 
End Function 
Function ErrorHandler() 
Dim sErrMsg As String 
sErrMsg = "Error " & Err.Number & IIf(Erl() = 0, """ at line " & Erl()) & " " & 
ErrorHandler = MsgBox(sErrMsg, vbAbortRetryIgnore, "Error"
End Function 
Function QuotedName(ByVal sName As StringAs String ' return a  name properly quoted 
QuotedName = "'" & Replace(sName, "'""'" & "'") & "'" ' Dec'08 --> 'Dec''08', My 
Budget --> 'My Budget' 
End Function 
End Module 
Tips and workarounds 
One of my Excel VBA add-ins had 13,000 lines of code and took about two weeks 
(full-time equivalent) to convert to VB.Net using Visual Studio 2010, Excel-Dna 0.29 
and NetOffice 1.50. Bear in mind that the supporting libraries are being constantly 
updated so check for changes in more recent version of Excel-Dna and NetOffice. The 
following list of tips and gotchas was built up from that experience. 
Fix these first in VBA before doing the migration 
The first group are changes that are safe to make in VBA but will make the transition 
to VB.Net much safer. Fix any issues with Option Base 1 and ByRef first. 
Option Base and Array() 
In VBA, the default lower bound of an array dimension is 0 (zero). Using Option 
Base, you can change this to 1. In Visual Basic .NET, the Option Base statement is 
not supported, and the lower bound of every array dimension must be 0. Additionally, 
you cannot use ReDim as an array declaration. One thing to keep in mind when 
working with Office collections from Visual Basic .NET is that the lower array 
bounds of most Office collections begin with 1. 
When I was converting some old code with Option base 1 I found it easy to make 
mistakes when converting to the 0-based arrays of vb.net so I replaced the array by a 
class that contained the properties I had been storing in an array. The VBA function 
Array() can be replicated by defining an Array() function in a GlobalHelpers.vb 
Function Array(ByVal ParamArray items() As ObjectAs Array 
Return items 
End Function 
Or by using literal array syntax  
Dim aHeadings() As String = {"Sheet", "Type", "Sheet Tab Name”} 
When returning variant arrays from ranges, the only types you will get are String, 
Boolean, Number, or Error. Dates are returned as numbers. 
ByVal and ByRef 
VBA defaults to ByRef; VB.Net to ByVal. When passing parameters in VBA, be sure 
to explicitly specify ByRef so this can be preserved when the module is imported into 
VS2010. I used to do that for primitive type variables (String, Long, etc) but found I 
had omitted to do it for Object and Array types. This leads to bugs that can only be 
detected by executing test cases and comparing output with the VBA output. It would 
be nice if VS2010 Express could warn us of variables passed byref but changed in the 
sub. Is this done by tools like Migration Partner and Aivosto Project Analyzer? 
‘Variant’ is no longer a supported type: use the ‘O
bject’ type instead. Or simply Dim 
with no type, which is ugly but compatible with both VBA and VB.NET. If there are 
multiple parameters to a function, and some are declared eg As String, then all must 
be declared, so use As Object where you had nothing in VBA. 
There is no Range type in Excel-Dna so if you are not using NetOffice or the PIA use 
Dim rg As Object.  
Documents you may be interested
Documents you may be interested