在VBA中查找和replace特定范围

我正在使用下面的代码来查找curr_symbol并用new_symbolreplace它。 即使我已经在代码中指定了它应该在特定的行号内这样做,它将查找和replace应用于所选工作表中的所有行,这不是我想要的。

Sub find_replace() Dim curr_symbol, new_symbol As String Dim row_num, last_row As Integer row_num = ActiveSheet.Cells(1, "A").Value 'row_num=9 last_row = ActiveSheet.Cells(2, "A").Value 'last_row=11 Do While row_num < last_row curr_symbol = ".ABC130301" new_symbol = ActiveSheet.Cells(row_num, "E").Value 'new_symbol=".BAC130306" With ActiveSheet.UsedRange .Replace curr_symbol, new_symbol, xlPart End With row_num = row_num + 1 Loop End Sub 

我什至尝试更换With ActiveSheet.UsedRange....End With与以下语句,但也取代了所有行中的curr_symbol。

 ActiveSheet.Cells.Replace What:=curr_symbol, Replacement:=new_symbol, LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, _ SearchFormat:=False, ReplaceFormat:=False 

我如何解决这个问题,所以它只replace指定行中的string。

我假设您想要replace的范围是从row_numlast_row A列。 尝试replace这个:

 With ActiveSheet.UsedRange .Replace curr_symbol, new_symbol, xlPart End With 

有了这个:

 Cells(row_num, 1).Replace curr_symbol, new_symbol, xlPart 

无论您将ActiveSheet.UsedRange放置在何处,它始终引用活动工作表的整个使用区域。 它是一个集合,它包含与所使用的单元格相同的行和列中的所有使用过的单元格和其他单元格。 这不是你使用它的方式(即不涉及你的循环的范围)。 Replace方法将应用于UsedRange中的每个单独的单元格。

ActiveSheet.Cells类似; 这总是指活动工作表中每个单元格的集合。 我的build议是一样的ActiveSheet.Cells(row_num, 1) ,指定一个单独的单元格应用Replace方法。

不再回答你的问题:

另外,下面一行:

 Dim curr_symbol, new_symbol As String 

将curr_symbol声明为Variant,将new_symbol声明为String。 这同样适用于你的下一行声明(整数)。 不,我也不喜欢这种宣言行为。 你必须为每个variables指定一个types。 以下是我倾向于声明的方式:

 Dim curr_symbol As String, _ new_symbol As String 

此外,Excel内部将所有Integertypes作为Longtypes内部存储。 声明为整数只限制它们的值,而不是它们消耗的内存量。 除非你特别想限制你的整数的值,否则我build议把所有的Integer声明改为Long:

 Dim last_row As Integer 

就像内存消耗一样:

 Dim row_num as Long 

但是,如果有任何速度差异,可能会慢一点。

您正在使用的“UsedRange”范围是您使用的整个电子表格。 您的replace正在应用于您的整个电子表格。

我会创build一个你想要做replace的范围,如:

 Dim MyRange as Range Set MyRange = Range("B7:C9") 

然后我会在这个范围内进行replace。