VBA代码报错索引越界,求解决字符串替换存入数组问题
问题分析与修复
索引越界原因
你的代码触发索引越界,核心问题是数组容量不匹配:
- 你给
ArrayValues只分配了lastRow个元素的空间,但内层循环j会遍历5个后缀,每个单元格会生成5个值存入数组,最终k的最大值是lastRow*5,远超过数组的索引范围,触发越界错误。 - 同时代码逻辑不符合需求:当前是对每个单元格用所有后缀各替换一次,存5个值,但实际需求应该是移除单元格中存在的那个预定义后缀,每个单元格只生成一个处理后的值。
修复后的代码
Sub New_1() Dim i As Long, j As Integer, k As Integer Dim Endings As Variant Dim ArrayValues() As Variant Dim lastRow As Long Dim cellValue As String Dim isReplaced As Boolean k = 0 Endings = Array("/A", "/BB", "/CCC", "/DDDD", "/EEEEE") With Worksheets("table1") lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row ' 按实际需要的元素数重新定义数组:每个单元格对应一个处理后的值 ReDim ArrayValues(lastRow - 1) ' VBA数组默认从0开始,长度对应lastRow个元素 For i = 1 To lastRow cellValue = .Range("A" & i).Value isReplaced = False ' 遍历后缀,找到匹配的结尾后缀就移除 For j = 0 To UBound(Endings) If Right(cellValue, Len(Endings(j))) = Endings(j) Then cellValue = Left(cellValue, Len(cellValue) - Len(Endings(j))) isReplaced = True Exit For ' 找到匹配项就停止遍历,避免重复替换 End If Next j ' 将处理后的值存入数组 ArrayValues(k) = cellValue k = k + 1 Next i End With ' 示例:可将数组内容输出到B列 ' Worksheets("table1").Range("B1:B" & lastRow).Value = Application.Transpose(ArrayValues) End Sub
关键修改点
- 数组容量修正:根据实际需求(每个单元格对应一个处理后的值),调整数组容量匹配元素数量。
- 逻辑优化:
- 用
Right判断确保只移除单元格结尾处的预定义后缀,避免误替换字符串中间的相同内容。 - 找到匹配后缀后立即退出内层循环,提升处理效率。
- 用
- 变量规范:将行号变量
i定义为Long,避免行号超过Integer范围导致溢出。
内容的提问来源于stack exchange,提问作者D3merzel
相关产品推荐
相关产品推荐

