Я вижу несколько ошибок на вашем пути, например, считается плохой практикой не указывать, где ваши ячейки и диапазоны расположены более явно, чем вы, и использовать .select
. Некоторые из операторов Select
также излишни, вам не нужно выбирать ячейку, когда вы определяете ее с помощью ссылки на диапазон в вашем коде. И хотя я буду аплодировать вам за фактическое объявление ваших переменных, вы также должны сказать, как вы их объявляете. В этом случае либо Dim i as Long
либо Dim i as Integer
(первый вариант немного лучше по сложным причинам).
Синтаксис, который вы используете для указания диапазонов, также недействителен, как упоминает DarkMoon, и хотя вы могли бы достичь чего-то вроде того, что вы хотите делать, например Range("G"&CStr(i))
я действительно призываю вас включить хотя бы какую таблицу на первом. Т.е. Worksheets("Sheet1").Range("G"&CStr(i))
Вот как я бы решил, что вы пытаетесь сделать, с несколькими комментариями о том, что делают разные куски кода. Вы заметите, что я не включил окно сообщения, которое есть в вашем коде, на случай, если вы получите много попаданий по 1000 строкам, держу пари, что вы не хотите нажимать эту кнопку OK несколько раз ;)
Option Explicit
Sub test()
Dim range_to_search As Range, string_to_find As String, found_cell As Range, first_address As String
' Turn off a couple of settings to make the code run faster
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
' Set the value to search for, and the range to search in
string_to_find = "CR"
Set range_to_search = Worksheets("Sheet1").Range("G1:G1000")
' Find the first cell in the range containing the searchstring
Set found_cell = range_to_search.Find(What:=string_to_find, After:=range_to_search(range_to_search.CountLarge, 1), LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False)
' No point in doing anything if no cell containing the string is found
If Not found_cell Is Nothing Then
' This isn't strictly necessary since we clear the cells as we go along, but at the end of the macro, we'll use this string to make sure we don't loop over the range again and again
first_address = found_cell.Address
' Start of loop
Do
' Replace the string we're searching for with a zero-length string
found_cell = Replace(found_cell, string_to_find, "", 1, -1, vbTextCompare)
' Copy the edited value to the adjacent column
found_cell.Copy Destination:=found_cell.Offset(0, 1)
' Clear the cell
found_cell.ClearContents
' Find a possible next value
Set found_cell = range_to_search.FindNext(found_cell)
' If we haven't found a new cell containing the searchstring, we exit the loop
If found_cell Is Nothing Then Exit Do
' Have we reached the top again? If not, keep looping.
Loop While found_cell.Address <> first_address
End If
' Turn the settings back on
Application.EnableEvents = True
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.Calculation = xlCalculationAutomatic
End Sub