0

I have a workbook with multiple sheets.
The first sheet, "Task", contains the data.
The other sheets are lists for find and replace operations.

I have run the Sub successfully, replacing the data in one column (E) in my first sheet ("Task") with data from other sheets "Salary" & "HR".

Now, I need to perform a find and replace in another column (N) in the "Task" sheet, using data from the "Adm. list" sheet.

This gives me an error message:

Sub FindAndReplace()

    Dim TaskWorksheet As Worksheet
    Dim searchRange As Range
    Dim replaceTable As Variant
    Dim findWhat As String
    Dim replaceWith As String
    Dim i As Long
    
    Set TaskWorksheet = ThisWorkbook.Worksheets("Task")
    
    With TaskWorksheet
        Set searchRange = .Range("E2:E" & .Cells(.Rows.Count, "E").End(xlUp).Row)
    End With
            
    With ThisWorkbook.Worksheets("HR")
        replaceTable = .Range("A1:B" & .Cells(.Rows.Count, "A").End(xlUp).Row).Value
    End With
    
    With ThisWorkbook.Worksheets("Adm")
        replaceTable = .Range("A1:B" & .Cells(.Rows.Count, "A").End(xlUp).Row).Value
    End With
   
    Set TaskWorksheet = ThisWorkbook.Worksheets("Task")
    
    With TaskWorksheet
        Set searchRange = .Range("N2:N" & .Cells(.Rows.Count, "E").End(xlUp).Row)
    End With
            
    With ThisWorkbook.Worksheets("HR list")
        replaceTable = .Range("A2:B" & .Cells(.Rows.Count, "A").End(xlUp).Row).Value
    End With
     
    For i = 1 To UBound(replaceTable)
        findWhat = replaceTable(i, 1)
        replaceWith = replaceTable(i, 2)
        searchRange.Replace _
            What:=findWhat, _
            replacement:=replaceWith, _
            lookat:=xlPart, _
            MatchCase:=False
    Next i
    
End Sub
1
  • 1
    "an error message" doesn't help us much - it's best to include the specific message you're getting, and the line where it occurs Commented Sep 19, 2024 at 23:18

1 Answer 1

1

Whenever you have a repetitive task it's best to push each repeated part out into a separate method (Sub/Function). Refactoring your code a little it could work like this:

Sub FindAndReplace()

    Dim FeedbacktaskWorksheet As Worksheet, wb As Workbook
    
    Set wb = ThisWorkbook
    Set TaskWorksheet = wb.Worksheets("Task")
    
    'replacing col E values with list from "HR"
    ReplaceList GetRange(TaskWorksheet.Range("E2")), _
                GetRange(wb.Worksheets("HR").Range("A1"), 2)
        
    'replacing col E values with list from "Salary"
    ReplaceList GetRange(TaskWorksheet.Range("E2")), _
                GetRange(wb.Worksheets("Salary").Range("A1"), 2)
                    
    'replacing col N values with list from "Staff list"
    ReplaceList GetRange(TaskWorksheet.Range("N2")), _
                GetRange(wb.Worksheets("Staff list").Range("A2"), 2)
                    
End Sub

'replace content in `searchrange` using pairs of values from range `replaceTable`
Sub ReplaceList(searchRange As Range, replaceTable As Range)
    Dim rw As Range
    For Each rw In replaceTable.Rows 'loop over pairs of values
        searchRange.Replace What:=rw.Cells(1).Value, _
                            Replacement:=rw.Cells(2).Value, _
                            lookat:=xlPart, MatchCase:=False
    Next rw
End Sub

'Return a range starting at `c` to the end of data in same column,
'   resized to specified number of columns (# of cols defaults to 1)
'Helper Function to avoid all those `.End(xlUp)` calls
Function GetRange(c As Range, Optional numCols As Long = 1) As Range
    With c.Parent
        Set GetRange = .Range(c, .Cells(.Rows.Count, _
                        c.Column).End(xlUp)).Resize(, numCols)
    End With
End Function

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.