You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:05:25