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

我的VBA For循环写法是否有误?求排查‘应用程序定义或对象定义错误’

VBA循环报错:Application-defined or object-defined error 解决方法

错误根源

你的循环代码中,8 - i的计算会生成无效的单元格行号:
当i从2循环到8时,8 - i的结果依次是6、5、4、3、2、1、0。而Excel单元格的行号最小为1,访问Cells(0, 2)会直接触发"Application-defined or object-defined error"。

修正方案

根据你要复制的原表行范围,二选一修改:

方案1:缩小循环范围(复制原表B1-B6到新表A1-A6)

调整循环结束值为7,避免生成0行号:

If CheckBox1.Value = True Then
    ' 一次性设置表头,比单独赋值更高效
    ActiveSheet.Range("A1:C1") = Array("Part Number", "Part Name", "Number of Parts Needed")
    
    ' 修正循环范围,i从2到7,8-i对应6到1的有效行号
    For i = 2 To 7
        ActiveSheet.Cells(i - 1, 1) = Worksheets("F8X SUSPENSION LINKS REV2").Cells(8 - i, 2)
    Next i
Else
End If
End Sub

方案2:调整行号计算式(复制原表B1-B7到新表A1-A7)

如果需要复制更多行,把行号计算改为9 - i,确保结果始终≥1:

If CheckBox1.Value = True Then
    ActiveSheet.Range("A1:C1") = Array("Part Number", "Part Name", "Number of Parts Needed")
    
    ' 9 - i对应7到1的有效行号,i从2到8
    For i = 2 To 8
        ActiveSheet.Cells(i - 1, 1) = Worksheets("F8X SUSPENSION LINKS REV2").Cells(9 - i, 2)
    Next i
Else
End If
End Sub

优化建议(避免后续潜在问题)

依赖ActiveSheet和Activate的代码很容易因用户切换工作表而出错,建议改用变量引用工作表:

  1. 在模块中声明全局变量存储新建工作表:
Global qty As Variant
Dim targetSheet As Worksheet
  1. 修改PartOrder子过程,将新建工作表赋值给变量:
Sub PartOrder()
    qty = Application.InputBox("How many assemblies are needed?")
    ' 直接将新建工作表赋值给变量
    Set targetSheet = Sheets.Add(After:=Worksheets(Sheets.Count))
    PartOrderForm.Show
End Sub
  1. 在窗体代码中用变量代替ActiveSheet:
If CheckBox1.Value = True Then
    targetSheet.Range("A1:C1") = Array("Part Number", "Part Name", "Number of Parts Needed")
    
    For i = 2 To 7
        targetSheet.Cells(i - 1, 1) = Worksheets("F8X SUSPENSION LINKS REV2").Cells(8 - i, 2)
    Next i
Else
End If
End Sub

内容的提问来源于stack exchange,提问作者snt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 08:06:19