2013-02-24 175 views
1

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

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 

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

回答

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 

无论你在哪里放置它始终指向活动工作表的整个使用区域。它是一个集合,其中包含与使用的单元格相同的行和列中的所有使用过的单元格和其他单元格。它不像你使用它的方式那样是上下文的(即它不涉及与你的循环相关的范围)。 Replace方法将应用于UsedRange中的每个单独的单元格。

ActiveSheet.Cells类似;这总是指在活动工作表中每个单元收集。我的建议与ActiveSheet.Cells(row_num, 1)相同,指定单个单元格将Replace方法应用于。

不再回答你的问题:

顺便说一句,下面一行:

Dim curr_symbol, new_symbol As String 

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

Dim curr_symbol As String, _ 
    new_symbol As String 

此外,Excel在内部将内部所有Integer类型都存储为Long类型。声明为整数只限制它们的值,而不是它们消耗的内存量。除非你特别想限制你的整数的价值,我建议改变所有INTEGER声明龙:

Dim last_row As Integer 

是一样的内存消耗为:

Dim row_num as Long 

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

+0

感谢您的解释和抛开 - 这是有助于知道,因为我不知道 – user1155299 2013-02-25 00:14:53

+0

没问题,乐于帮助。写了一些代码,然后认为我没有真正帮助任何人,所以添加了一个解释。教一个人钓鱼和所有:)。至于旁边......愚蠢的VBA行为:/。嘿。 – mkingston 2013-02-25 00:16:33

+0

是的,我同意:-) – user1155299 2013-02-25 00:19:53

3

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

我会创造你想要做的替换像一个范围:

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

然后我会做这个范围内的替换。

+0

请注意,因为'new_symbol'是在表中相对于替换范围指定的,所以这可能会改变。仍然是一个有用的答案,因为如果'new_symbol'永远不会改变,它会给OP另一个选项。 – mkingston 2013-02-25 00:12:44

+0

范围确实改变,正确的猜测:-) – user1155299 2013-02-25 00:13:49