How to: Programmatically search for Text in worksheet ranges
Applies to: Visual Studio Visual Studio for Mac
Note
This article applies to Visual Studio 2017. If you're looking for the latest Visual Studio documentation, see Visual Studio documentation. We recommend upgrading to the latest version of Visual Studio. Download it here
The Find method of the Range object enables you to search for text within the range. This text can also be any of the error strings that can appear in a worksheet cell such as #NULL!
or #VALUE!
. For more information about error strings, see Cell error values.
Applies to: The information in this topic applies to document-level projects and VSTO Add-in projects for Excel. For more information, see Features available by Office application and project type.
The following example searches a range named Fruits
and modifies the font for cells that contain the word "apples". This procedure also uses the FindNext method, which uses the previously set search settings to repeat the search. You specify the cell after which to search, and the FindNext method handles the rest.
Note
The FindNext method's search wraps back to the beginning of the search range after it has reached the end of the range. Your code must ensure that the search does not wrap around in an infinite loop. The sample procedure shows one way to handle this using the Address[] property.
To search for text in a worksheet range
Declare variables for tracking the entire range, the first found range, and the current found range.
Excel.Range currentFind = null; Excel.Range firstFind = null;
Dim currentFind As Excel.Range = Nothing Dim firstFind As Excel.Range = Nothing
Search for the first match, specifying all the parameters except the cell to search after.
currentFind = Fruits.Find("apples", missing, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart, Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false, missing, missing);
currentFind = Fruits.Find("apples", , _ Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart, _ Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, False)
Continue searching as long as there are matches.
while(currentFind != null)
While Not currentFind Is Nothing
Compare the first found range (
firstFind
) to Nothing. IffirstFind
contains no value, the code stores away the found range (currentFind
).if (firstFind == null) { firstFind = currentFind; }
If firstFind Is Nothing Then firstFind = currentFind
Exit the loop if the address of the found range matches the address of the first found range.
else if (currentFind.get_Address(Excel.XlReferenceStyle.xlA1) == firstFind.get_Address(Excel.XlReferenceStyle.xlA1)) { break; }
ElseIf currentFind.Address = firstFind.Address Then Exit While End If
Set the appearance of the found range.
currentFind.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red); currentFind.Font.Bold = true;
With currentFind.Font .Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red) .Bold = True End With
Perform another search.
currentFind = Fruits.FindNext(currentFind);
currentFind = Fruits.FindNext(currentFind)
The following example shows the complete method.
Example
private void DemoFind()
{
Excel.Range currentFind = null;
Excel.Range firstFind = null;
Excel.Range Fruits = Application.get_Range("A1", "B3");
// You should specify all these parameters every time you call this method,
// since they can be overridden in the user interface.
currentFind = Fruits.Find("apples", missing,
Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart,
Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false,
missing, missing);
while(currentFind != null)
{
// Keep track of the first range you find.
if (firstFind == null)
{
firstFind = currentFind;
}
// If you didn't move to a new range, you are done.
else if (currentFind.get_Address(Excel.XlReferenceStyle.xlA1)
== firstFind.get_Address(Excel.XlReferenceStyle.xlA1))
{
break;
}
currentFind.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red);
currentFind.Font.Bold = true;
currentFind = Fruits.FindNext(currentFind);
}
}
Private Sub DemoFind()
Dim currentFind As Excel.Range = Nothing
Dim firstFind As Excel.Range = Nothing
Dim Fruits As Excel.Range = Me.Application.Range("A1", "B2")
' You should specify all these parameters every time you call this method,
' since they can be overridden in the user interface.
currentFind = Fruits.Find("apples", , _
Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart, _
Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, False)
While Not currentFind Is Nothing
' Keep track of the first range you find.
If firstFind Is Nothing Then
firstFind = currentFind
' If you didn't move to a new range, you are done.
ElseIf currentFind.Address = firstFind.Address Then
Exit While
End If
With currentFind.Font
.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red)
.Bold = True
End With
currentFind = Fruits.FindNext(currentFind)
End While
End Sub