Excel VBA批量复制数据至对应工作表报错:类型不匹配
解决VBA「类型不匹配」错误并实现数据复制需求
先给你梳理下原代码里触发「类型不匹配」的核心问题,再给你一套更可靠的实现方案:
原代码的主要问题
- 变量
A被定义为Range类型,但后续代码里把它当成字符串/单元格值来使用(比如InStr(1, Name.Value, A)、Sheets(A)),这直接触发了类型不匹配错误 - 内层循环遍历整个A列,没有终止条件,效率极低还容易出问题
- 过度依赖
Select和Selection操作,这不仅拖慢代码,还容易因为工作表切换导致意外错误 - 逻辑混乱:比如
A = Cells(I, 1).Copy这种写法完全不符合VBA语法规范
修正后的代码
这个版本会高效地把主表「VARS Info」中对应姓名的B列数据,复制到同名工作表的指定区域,还会自动处理空行和不存在的工作表情况:
Sub ImportInfo() Dim wsMain As Worksheet Dim targetWs As Worksheet Dim lastRow As Long Dim i As Long Dim targetLastRow As Long Dim currentName As String Dim currentValue As String ' 关闭屏幕更新,提升代码运行速度 Application.ScreenUpdating = False ' 设定主工作表 Set wsMain = ThisWorkbook.Sheets("VARS Info") ' 获取主表A列最后一行行号 lastRow = wsMain.Cells(wsMain.Rows.Count, "A").End(xlUp).Row ' 遍历主表从第2行开始的所有数据行 For i = 2 To lastRow ' 获取当前行的姓名和对应值 currentName = wsMain.Cells(i, "A").Value currentValue = wsMain.Cells(i, "B").Value ' 跳过空姓名行 If currentName = "" Then GoTo NextRow ' 检查同名工作表是否存在 On Error Resume Next Set targetWs = ThisWorkbook.Sheets(currentName) On Error GoTo 0 ' 如果工作表存在,就复制数据 If Not targetWs Is Nothing Then ' 找到目标工作表B列最后一行,准备插入新数据 targetLastRow = targetWs.Cells(targetWs.Rows.Count, "B").End(xlUp).Row + 1 ' 把值写入目标工作表,避免使用Select/Selection targetWs.Cells(targetLastRow, "B").Value = currentName targetWs.Cells(targetLastRow, "C").Value = currentValue Else ' 如果工作表不存在,弹出提示(可选) MsgBox "工作表「" & currentName & "」不存在,跳过该行数据" End If NextRow: Next i ' 给主表自动调整列宽 wsMain.Cells.EntireColumn.AutoFit ' 恢复屏幕更新 Application.ScreenUpdating = True End Sub
代码说明
- 用
wsMain和targetWs直接引用工作表,彻底抛弃Select操作,避免切换工作表带来的错误 - 先检查目标工作表是否存在,防止因工作表缺失导致代码崩溃
- 遍历主表时只处理有数据的行,跳过空行
- 直接通过单元格赋值的方式写入数据,比复制粘贴更高效
- 最后自动调整主表的列宽,符合你的需求
测试数据适配
针对你提供的测试数据:
A B
Joe Bloggs £100
Dave Smith £100
Joe Bloggs £100
Dave Smith £100
运行代码后,「Joe Bloggs」工作表的B、C列会新增两行对应数据,「Dave Smith」工作表同理,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Tom Eggins
相关产品推荐
相关产品推荐

