查找并替换VBA中的特定范围

时间:2013-02-24 23:16:36

标签: excel vba

我使用以下代码查找curr_symbol并将其替换为new_symbol。即使我在代码中指定它应该在特定的行号中这样做,它会将查找和替换应用于所选表单中的所有行,这不是我想要的。

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

如何解决这个问题,以便它只替换指定行中的字符串。

2 个答案:

答案 0 :(得分:8)

我假设您要替换的范围是A列,从row_numlast_row。尝试替换它:

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类似;这总是指活动工作表中每个单元格的集合。我的建议与ActiveSheet.Cells(row_num, 1)相同,指定了将Replace方法应用于的单个单元格。

不再回答您的问题:

顺便说一下,以下一行:

Dim curr_symbol, new_symbol As String

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

Dim curr_symbol As String, _
    new_symbol As String

此外,Excel内部将所有Integer类型存储为Long类型。声明为整数只会限制它们的值,而不是它们消耗的内存量。除非您特别想限制整数的值,否则我建议将所有整数声明更改为Long:

Dim last_row As Integer

就像内存消耗一样:

Dim row_num as Long

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

答案 1 :(得分:3)

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

我会创建一个你想要替换的范围:

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

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