In the end, I did something a little different from my question.
This macro will search for each row in the source sheet and copy it to the target sheet, which is the parameter. Data does not need to be sorted, but it increases the runtime of marco. You can fix this by comparing the previous line, looking for a different value than before. The target list must exist and any data will be overwritten (cannot be undone!)
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 ! Worksheets(SheetData).Select //' 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 Selection.Copy //' Select target sheet to store the data "sheetname" and paste to next row Sheets(sheetname).Select Rows(CStr(SheetRowNum) & ":" & CStr(SheetRowNum)).Select ActiveSheet.Paste SheetRowNum = SheetRowNum + 1 //' Move to next row //' Select source sheet "SheetData" so searching can continue Sheets(SheetData).Select End If DataRowNum = DataRowNum + 1 //' Search next row Wend //' Search and copying complete. Lets make the columns neat Sheets(sheetname).Columns.AutoFit //' Finish off with freezing the top row Sheets(sheetname).Select Range("A2").Select ActiveWindow.FreezePanes = True End Sub
Remove each pair // before use.
Kim
source share