VBA按列值复制行至另工作簿时出现运行时错误'13'排查
问题原因及解决办法
核心错误原因
- 变量类型声明错误:代码中
shtDest被声明为Workbook类型,但实际需要指向**工作表(Worksheet)**对象,赋值时Set shtDest = wb.Sheets("Orders Confirmed")直接触发「类型不匹配」错误,这是报错的直接原因。 - 其他潜在问题:
- 仅复制A列单个单元格,未复制整行,不符合需求;
Rows.Count未指定所属工作表,默认引用活动工作表行数,可能导致目标行定位错误;- 直接判断单元格值等于"x",若A列存在错误值(如#N/A),会再次触发类型不匹配。
修正后的代码
Sub ConfirmedDatabaseAdd() Const WB_PATH As String = "S:\Dott Work\Good Order 2024\Quotes\Confirmed Orders.xlsx" Dim srcSht As Worksheet, wb As Workbook, shtDest As Worksheet, i As Long Dim lastSrcRow As Long, lastDestRow As Long Set srcSht = ActiveSheet lastSrcRow = srcSht.Range("A" & srcSht.Rows.Count).End(xlUp).Row For i = 2 To lastSrcRow ' 先检查单元格是否为错误值,再判断内容 If Not IsError(srcSht.Cells(i, 1)) Then If UCase(srcSht.Cells(i, 1).Value) = "X" Then ' 兼容大小写输入 If shtDest Is Nothing Then Set wb = Workbooks.Open(Filename:=WB_PATH) Set shtDest = wb.Sheets("Orders Confirmed") End If ' 复制整行到目标工作表的下一行,保留格式 lastDestRow = shtDest.Range("A" & shtDest.Rows.Count).End(xlUp).Row + 1 srcSht.Rows(i).Copy Destination:=shtDest.Rows(lastDestRow) End If End If Next i If Not wb Is Nothing Then wb.Close SaveChanges:=True End If End Sub
关键修改点说明
- 修正变量类型:将
shtDest As Workbook改为shtDest As Worksheet,匹配赋值对象的实际类型; - 复制整行:用
srcSht.Rows(i).Copy替代原代码的单个单元格复制,确保整行内容和格式同步; - 明确工作表范围:所有
Rows.Count都指定所属工作表(srcSht.Rows.Count、shtDest.Rows.Count),避免引用错误; - 增加错误值判断:用
IsError先过滤错误单元格,防止比较时触发类型不匹配; - 兼容大小写:用
UCase()统一转为大写后比较,适配输入"X"或"x"的情况。
内容的提问来源于stack exchange,提问作者Charlotte
相关产品推荐
相关产品推荐

