Excel VBA Error 400报错求助:新手数据复制替换问题
搞定VBA Error 400:复制数据到指定工作表的排查与修复
作为VBA新手碰到Error 400确实挺闹心的,结合你说的需求——点击按钮删掉旧列表、选文件复制A-J列的新数据、K列用公式做跨表校验,咱们重点揪揪你提到的那行复制代码的问题,顺便捋清楚常见的坑和解决办法。
可能触发Error 400的几个常见原因
- 工作表引用不完整/错误:你写的
LijstBP.Sheets("B...明显没写完工作表名称,要是名称写错或者没明确指定,VBA找不到目标位置就会报错。另外LijstBP这个工作簿对象有没有提前定义?比如是不是应该用Set LijstBP = ThisWorkbook(指代当前运行代码的工作簿),或者是你打开的目标工作簿? - UsedRange的“隐形坑”:
UsedRange会包含所有曾经编辑过的单元格(哪怕现在是空的),范围可能比你实际需要的A-J列大很多,复制时容易出问题。不如换成精准定位A-J列的已用行,更稳妥。 - 复制目标位置不明确:你只写了
Copy后面的开头,没指定具体粘贴的起始单元格(比如Range("A1")),VBA不知道该把数据粘到哪,自然会报错。 - 工作表被保护或工作簿状态异常:如果目标工作表设了保护,或者源/目标工作簿处于不可操作的状态(比如正在被其他进程占用),也会触发Error 400。
给你改好的参考代码
我把你的需求整合到代码里,避开上述的坑,你可以根据实际情况替换工作表名称:
Sub 更新BP列表() Dim 源工作簿 As Workbook Dim 源工作表 As Worksheet Dim 目标工作表 As Worksheet Dim 文件路径 As Variant Dim 最后一行 As Long ' 第一步:清除现有列表(保留表头的话就删数据行,否则清整个UsedRange) Set 目标工作表 = ThisWorkbook.Sheets("你的目标工作表名") ' 替换成你实际的工作表名 目标工作表.Rows("2:" & 目标工作表.Rows.Count).ClearContents ' 假设表头在第一行 ' 第二步:让用户选择要导入的文件 文件路径 = Application.GetOpenFilename("Excel文件 (*.xlsx;*.xls), *.xlsx;*.xls") If 文件路径 = False Then Exit Sub ' 用户取消选择就退出 ' 第三步:打开源文件并复制A-J列数据 Set 源工作簿 = Workbooks.Open(文件路径) Set 源工作表 = 源工作簿.Sheets("Blad1") ' 确认这个工作表名是对的 ' 精准获取A列最后一行,复制A-J列的有效数据 最后一行 = 源工作表.Cells(源工作表.Rows.Count, "A").End(xlUp).Row 源工作表.Range("A1:J" & 最后一行).Copy 目标工作表.Range("A1") ' 明确粘贴到A1位置 ' 第四步:关闭源文件(不保存,避免修改原文件) 源工作簿.Close SaveChanges:=False ' 第五步:设置K列的校验公式(替换成你实际的公式) 最后一行 = 目标工作表.Cells(目标工作表.Rows.Count, "A").End(xlUp).Row 目标工作表.Range("K2:K" & 最后一行).Formula = "=VLOOKUP(A2, 其他工作表名!A:C, 3, FALSE)" ' 示例公式,按需修改 End Sub
几个要注意的细节
- 把代码里的
你的目标工作表名、其他工作表名换成你实际的名称,大小写和空格都要完全匹配! - 如果源文件的
Blad1不是正确的工作表名,一定要改过来,否则会找不到工作表报错。 - 要是你的表头不在第一行,记得调整清除数据行的范围(比如
Rows("3:" & ...))。
内容的提问来源于stack exchange,提问作者Koen Hendrikx
相关产品推荐
相关产品推荐

