Excel VBA:将数组值写入多工作表指定单元格时下标越界求助
VBA代码修正:批量给所有工作表E4单元格赋值数组内容
原代码的问题:
- 变量声明语法错误:
Dim i As as Long多写了一个as,正确写法是Dim i As Long - 无效的
With ws语句:ws未定义就调用,且后续For Each已遍历工作表,该语句完全多余,会引发语法错误 - 单元格引用错误:
ws.Range(i, 4)写法错误,定位E4单元格(第4行第5列)应使用ws.Cells(4, 5),原代码错误指向了D列,且Range的参数使用不符合规范 - 数组索引错误:从Range赋值的数组默认是二维数组(即使是单列数据),直接用
myArray(i)会触发下标越界,需用myArray(i, 1)访问元素 - 循环逻辑缺失:
i未初始化,遍历工作表时未自增索引,导致始终使用同一个数组位置,同时未处理数组元素与工作表数量不匹配的情况
修正后的代码:
Sub test() Dim ws As Worksheet Dim i As Long Dim myArray As Variant ' 从data工作表的命名区域"range"获取单列数据,转为一维数组 myArray = Application.Transpose(Worksheets("data").Range("range").Value) i = 1 ' 初始化数组起始索引 For Each ws In ActiveWorkbook.Worksheets ' 给当前工作表的E4单元格赋值数组对应元素 ws.Cells(4, 5).Value = myArray(i) i = i + 1 ' 索引自增 ' 避免数组元素耗尽后继续循环报错 If i > UBound(myArray) Then Exit For Next ws End Sub
补充说明:
- 若数据源
range是单行区域,需用myArray = Application.Transpose(Application.Transpose(Worksheets("data").Range("range").Value))转换为一维数组 - 如需跳过特定工作表(比如数据源所在的data表),可在循环内添加判断:
If ws.Name <> "data" Then ws.Cells(4, 5).Value = myArray(i) i = i + 1 If i > UBound(myArray) Then Exit For End If
内容的提问来源于stack exchange,提问作者Ivan Huang
相关产品推荐
相关产品推荐

