Excel VBA跨工作簿搜索累加库存遇下标越界错误求助
解决VBA「下标越界」错误的修正方案
先给你修正后的可运行代码,再逐点拆解原代码的问题:
Option Explicit ' 强制变量声明,避免拼写错误 Sub Upload() Dim sourceWb As Workbook Dim targetWb As Workbook Dim targetWs As Worksheet Dim cProd As Variant Dim CAdd As Variant Dim lastRow As Long Dim i As Long ' 锁定当前工作簿,避免后续切换混乱 Set sourceWb = ThisWorkbook ' 读取当前工作簿Sheet1的指定单元格值 cProd = sourceWb.Sheets("Sheet1").Range("D6").Value CAdd = sourceWb.Sheets("Sheet1").Range("F6").Value ' 检查累加值是否有效,避免非数值导致错误 If Not IsNumeric(CAdd) Then MsgBox "F6单元格不是有效数值,请检查!" Exit Sub End If ' 打开目标工作簿,同时检查是否打开成功 On Error Resume Next ' 临时开启错误捕获 Set targetWb = Workbooks.Open("P:\Engineering\Stock Management\EngineerBookingSystem.xlsm") On Error GoTo 0 ' 关闭错误捕获 If targetWb Is Nothing Then MsgBox "目标工作簿打开失败,请检查路径或文件是否被占用!" Exit Sub End If ' 定位目标工作表,检查是否存在 On Error Resume Next Set targetWs = targetWb.Worksheets("Sheet9") On Error GoTo 0 If targetWs Is Nothing Then MsgBox "目标工作簿中找不到Sheet9,请检查工作表名称!" targetWb.Close SaveChanges:=False Exit Sub End If ' 获取A列最后一行,必须指定目标工作表的行数范围 lastRow = targetWs.Cells(targetWs.Rows.Count, 1).End(xlUp).Row ' 遍历搜索匹配项并累加库存 For i = 2 To lastRow ' 直接用单元格值比较,避免冗余的Range引用 If targetWs.Cells(i, 1).Value = cProd Then ' 处理空单元格情况,默认按0计算 targetWs.Cells(i, 3).Value = Val(targetWs.Cells(i, 3).Value) + CAdd End If Next i ' 保存并关闭目标工作簿(按需选择是否保存) targetWb.Close SaveChanges:=True MsgBox "库存更新完成!" End Sub
原代码的核心问题:
Rows.Count未限定工作表:原代码里Rows.Count默认取当前活动工作表的行数,打开目标工作簿后活动工作表未必是Sheet9,会导致Range引用出错触发下标越界,必须写成targetWs.Rows.Count锁定目标工作表。- 冗余的Range引用写法:
wks.Range(wks.Cells(i, 1))完全没必要,直接用wks.Cells(i,1).Value更简洁,多层Range嵌套容易因对象层次问题报错。 - 未检查工作簿/工作表是否存在:如果目标工作簿路径错误、文件被锁定,或者Sheet9不存在,代码直接执行
Set wkb/Set wks会导致对象为Nothing,后续引用必然触发下标越界,必须加存在性检查。 - 未声明变量:原代码里
cProd、CAdd等变量都未声明,VBA自动设为Variant类型,容易出现拼写错误,加上Option Explicit可强制声明,提前排查这类问题。 - 未处理空值/非数值情况:如果F6不是数值,或目标工作表C列是空值,直接累加会报错,用
Val()可把空值/非数值转为0,避免运行错误。
内容的提问来源于stack exchange,提问作者Rhi Rhi
相关产品推荐
相关产品推荐

