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

use*_*299 1 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
Run Code Online (Sandbox Code Playgroud)

我甚至尝试用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
Run Code Online (Sandbox Code Playgroud)

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

mki*_*ton 8

我假设您有兴趣替换的范围是A列,从.row_numlast_row.尝试替换这个:

With ActiveSheet.UsedRange
    .Replace curr_symbol, new_symbol, xlPart
End With
Run Code Online (Sandbox Code Playgroud)

有了这个:

Cells(row_num, 1).Replace curr_symbol, new_symbol, xlPart
Run Code Online (Sandbox Code Playgroud)

无论您放置在何处,ActiveSheet.UsedRange它始终指的是活动纸张的整个使用区域.它是一个集合,包含与所用单元格相同的行和列中的所有已使用单元格和其他单元格.它不是你使用它的方式的上下文(即它不涉及与你的循环相关的范围).该Replace方法将应用于该中的每个单独的细胞UsedRange.

同样地ActiveSheet.Cells; 这总是指活动工作表中每个单元格的集合.我的建议与ActiveSheet.Cells(row_num, 1)指定要应用该Replace方法的单个单元格相同.

不再回答你的问题了:

另外,以下行:

Dim curr_symbol, new_symbol As String
Run Code Online (Sandbox Code Playgroud)

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

Dim curr_symbol As String, _
    new_symbol As String
Run Code Online (Sandbox Code Playgroud)

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

Dim last_row As Integer
Run Code Online (Sandbox Code Playgroud)

就像内存消耗一样:

Dim row_num as Long
Run Code Online (Sandbox Code Playgroud)

但可能有点慢,如果有任何速度差异.