Forum Discussion
mlondonop
Jul 21, 2022Copper Contributor
Find in excel VBA
I am trying to use the find function in excel VBA inside of a loop. Frist pass would make the "what" in this find function as the value in file A cell B4, and then look for this value in file B and the do an overwrite of values on that row using offset. The next look the "what" in the find would need to look for the value in file A cell B12, the next loop the "what would be the value in B20, the next loop in B28, etc. until it reaches the last row of data in File A. I know how to do loops but I do not know how to use Find within a loop nor do I know how to do Find across various workbooks because the syntax for Find is very specific. Any help on this would be appreciated.
Your description is not very specific, so my reply is vague too.
By "file", do you mean a worksheet in the active workbook?
Sub ReplaceLoop() ' Column to search on sheet B Const col = "D" ' Offset to use Const offs = 5 ' Replacement text Const repl = "Replacement Text" Dim wsA As Worksheet Dim wsB As Worksheet Dim r As Long Dim m As Long Dim s As String Dim rng As Range Dim adr As String Application.ScreenUpdating = False ' Use the real names of the worksheets Set wsA = Worksheets("A") Set wsB = Worksheets("B") m = wsA.Range("B" & wsA.Rows.Count).End(xlUp).Row For r = 4 To m Step 8 s = wsA.Range("B" & r).Value Set rng = wsB.Columns(col).Find(What:=s, LookAt:=xlWhole) If Not rng Is Nothing Then adr = rng.Address Do rng.Offset(0, offs).Value = repl Set rng = wsB.Columns(col).Find(What:=s, After:=rng, LookAt:=xlWhole) If rng Is Nothing Then Exit Do Loop Until rng.Address = adr End If Next r Application.ScreenUpdating = True End Sub
Your description is not very specific, so my reply is vague too.
By "file", do you mean a worksheet in the active workbook?
Sub ReplaceLoop() ' Column to search on sheet B Const col = "D" ' Offset to use Const offs = 5 ' Replacement text Const repl = "Replacement Text" Dim wsA As Worksheet Dim wsB As Worksheet Dim r As Long Dim m As Long Dim s As String Dim rng As Range Dim adr As String Application.ScreenUpdating = False ' Use the real names of the worksheets Set wsA = Worksheets("A") Set wsB = Worksheets("B") m = wsA.Range("B" & wsA.Rows.Count).End(xlUp).Row For r = 4 To m Step 8 s = wsA.Range("B" & r).Value Set rng = wsB.Columns(col).Find(What:=s, LookAt:=xlWhole) If Not rng Is Nothing Then adr = rng.Address Do rng.Offset(0, offs).Value = repl Set rng = wsB.Columns(col).Find(What:=s, After:=rng, LookAt:=xlWhole) If rng Is Nothing Then Exit Do Loop Until rng.Address = adr End If Next r Application.ScreenUpdating = True End Sub
- mlondonopCopper ContributorHello Hans, thank you for your quick reply. I am a bit slow to review to be able to let you know if this worked or not because I am about to leave office for a few weeks for the birth of a new baby. But I can at least answer your question. By new "file" I mean entire different workbook, not just different worksheet in the active workbook. That's part of the reason I was having difficulty in the syntax of the find function.
I hope everything will go well!
Do those workbooks contain multiple sheets?
If so, do you want to search all sheets, or only a specific one?