Excel – Find and select multiple rows


How do I search a column for a text and select all columns and rows which match the search text ?

Sample table:

      ColA  ColB  ColC  ColD
Row1        Bob
Row2        Jane
Row3        Joe
Row4        Joe
Row5        Jack
Row6        Jack
Row7        Jack
Row8        Peter
Row9        Susan

So the marco searches for "Jack" then it should select all of Row5-7 in ColA-D.

Best Solution

I ended up doing something slightly different from my question.

This macro will search on each row in source sheet and copy it to target sheet, which is the parameter. The data does not have to be sorted, but this makes the runtime of the marco longer. You can fix this by comparing previous row searched for a different value than before. The target sheet must exist and any data will be overwritten (not possible to undo!)

Sub Search_SelectAndCopy(sheetname As String)

Dim SheetData As String
Dim DataRowNum As Integer, SheetRowNum As Integer

SheetData = "name of sheet to search in" //' Source sheet
DataRowNum = 2 //' Begin search at row 2
SheetRowNum = 2 //' Begin saving data to row 2 in "sheetname"

//' Select sheetname, as its apparently required before copying is allowed !

//' Search and copy the data
While Not IsEmpty(Cells(DataRowNum, 2)) //' Loop until column B gets blank
    //' Search in column B for our value, which is the same as the target sheet name "sheetname"
    If Range("B" & CStr(DataRowNum)).Value = sheetname Then
       //' Select entire row
       Rows(CStr(DataRowNum) & ":" & CStr(DataRowNum)).Select

       //' Select target sheet to store the data "sheetname" and paste to next row
       Rows(CStr(SheetRowNum) & ":" & CStr(SheetRowNum)).Select

       SheetRowNum = SheetRowNum + 1 //' Move to next row

       //' Select source sheet "SheetData" so searching can continue
   End If

   DataRowNum = DataRowNum + 1 //' Search next row

//' Search and copying complete. Lets make the columns neat

//' Finish off with freezing the top row
ActiveWindow.FreezePanes = True
End Sub

Remove each pair of // before using.

Related Question