2

我正在使用以下代码来查找 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

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

4

2 回答 2

9

我假设您有兴趣替换的范围是 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 类型。声明为 Integer 只会限制它们的值,而不是它们消耗的内存量。除非您特别想限制整数的值,否则我建议将所有 Integer 声明更改为 Long:

Dim last_row As Integer

与以下内容一样消耗内存:

Dim row_num as Long

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

于 2013-02-25T00:01:38.213 回答
3

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

我会创建一个您想要替换的范围,例如:

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

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

于 2013-02-25T00:03:23.130 回答