在列中循环查找/replace数组时,出现“下标超出范围”错误

我在excel表单上有两个名单(sh1 - Column A, Column D) 。 在另一个excel表格(sh2 - Column B) ,我还有一个名字列表。 我正在尝试在列B中find/replace列D上的A列名称。

我的完整代码列在底部。 我在这一行上得到一个“下标超出范围”的错误:

 Selection.Replace What:=fndArr(i), Replacement:=rplArr(i), LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _ ReplaceFormat:=False 

我已经检查了范围,看起来代码应该循环遍历sh2中的每个单元格。列B查找列A数据并用列D数据replace它。

我正在这个总的空白。 有谁知道我为什么得到这个错误? 感谢您的帮助。

 Column A | Column B | Column D -------------------------------------------- Hugh Jackman | Hugh J | Hugh Jackman Ronald Reagan | Ronald R | Ronald Reagan John Adams | John A | John Adams 

 Sub CheckReplace() Dim sh1 As Worksheet, sh2 As Worksheet Dim fndArr() As Variant Dim rplArr() As Variant Set sh1 = Sheets("CA") Set sh2 = Sheets("FD") ''' turn off screen updating ''' With Application .ScreenUpdating = False .EnableEvents = False End With ''' Find/Replace CA ''' sh1.Activate fndArr = sh1.Range("A2:A" & Cells(Rows.Count, "A").End(xlUp).Row) rplArr = sh1.Range("D2:D" & Cells(Rows.Count, "D").End(xlUp).Row) sh2.Activate Columns("B").Select For i = 0 To UBound(fndArr) Selection.EntireColumn.Select Selection.Replace What:=fndArr(i), Replacement:=rplArr(i), LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _ ReplaceFormat:=False Next i ''' turn on screen updating ''' With Application .ScreenUpdating = True .EnableEvents = True End With End Sub 

编辑:

代码中的以下变化允许它运行而不会引发错误,但是它会find/replace列A / B中的第一个值,例如Hugh Jackman Hugh J,而不是Ronald Reagan,Ronald R:

 fndArr = Array(sh1.Range("A2:A" & Cells(Rows.Count, "A").End(xlUp).Row)) rplArr = Array(sh1.Range("D2:D" & Cells(Rows.Count, "D").End(xlUp).Row)) 

当你将一个数组等同于一个范围时,即使只有一列,也可以创build一个基于1的2D数组,因此:

 For i = 1 To UBound(fndArr) Selection.EntireColumn.Select Selection.Replace What:=fndArr(I,1), Replacement:=rplArr(I,1), LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _ ReplaceFormat:=False Next I 

编辑:你也需要摆脱select的东西。 也许以下(未经testing)

 'Delete these two lines 'sh2.Activate 'Columns("B").Select With sh2.Columns("B") For i = 0 To UBound(fndArr) .Replace What:=fndArr(I,1), Replacement:=rplArr(I,1), LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _ ReplaceFormat:=False Next i