You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

VBA运行时错误13:类型不匹配问题求助(数据粘贴场景)

解决VBA Runtime Error 13: 类型不匹配问题

先直接点出核心问题:你的代码里的ShSummary变量是引发类型不匹配错误的关键,下面分两种常见情况分析并给出修复方案:

1. 最可能的原因:ShSummary未定义或未赋值

看你的代码,既没有声明ShSummary的变量类型,也没有给它赋值具体的工作表名称。如果你的VBA项目没有开启Option Explicit(默认状态可能未开启),VBA会把ShSummary当成一个未初始化的变体变量,值为空。而Worksheets()方法接收的参数只能是工作表名称(字符串)工作表索引(数字),传入空值自然会触发类型不匹配错误。

修复代码示例:

Sub Import_Data()
 Dim FilePth As String
 Dim SourceBook As Workbook
 Dim LastCell_Nbr As Long ' 改成Long,避免行数超过32767时溢出
 Dim ShSummary As String ' 声明为字符串变量,存储汇总表名称
 
 ' 替换成你实际的汇总工作表名称
 ShSummary = "汇总表"

 FilePth = "C:\Users\xxx\Desktop\xxx\xxx\Follow-up_File.xlsm"
 Set SourceBook = Application.Workbooks.Open(FilePth)
 
 ' 先判断工作表是否处于筛选状态,避免ShowAllData报错
 If SourceBook.Sheets("Follow up").FilterMode Then
    SourceBook.Sheets("Follow up").ShowAllData
 End If

 LastCell_Nbr = SourceBook.Sheets("Follow up").Cells(Rows.Count, "C").End(xlUp).Row
 ' 修复后的复制粘贴语句,明确指定Destination参数
 SourceBook.Sheets("Follow up").Range("A5:A" & LastCell_Nbr).Copy _
 Destination:=ThisWorkbook.Worksheets(ShSummary).Range("B5")
End Sub

2. 如果ShSummary是工作表对象(而非名称)

如果你原本打算把ShSummary定义为工作表对象,那需要用Set语句赋值,并且引用方式要调整:

Sub Import_Data()
 Dim FilePth As String
 Dim SourceBook As Workbook
 Dim LastCell_Nbr As Long
 Dim ShSummary As Worksheet ' 声明为工作表对象类型
 
 ' 直接绑定汇总表对象
 Set ShSummary = ThisWorkbook.Worksheets("汇总表")

 FilePth = "C:\Users\xxx\Desktop\xxx\xxx\Follow-up_File.xlsm"
 Set SourceBook = Application.Workbooks.Open(FilePth)
 
 If SourceBook.Sheets("Follow up").FilterMode Then
    SourceBook.Sheets("Follow up").ShowAllData
 End If

 LastCell_Nbr = SourceBook.Sheets("Follow up").Cells(Rows.Count, "C").End(xlUp).Row
 ' 直接通过对象引用Range,无需再调用Worksheets()
 SourceBook.Sheets("Follow up").Range("A5:A" & LastCell_Nbr).Copy _
 Destination:=ShSummary.Range("B5")
End Sub

额外优化建议

  • 开启Option Explicit:在模块顶部添加这行代码,强制声明所有变量,能提前发现这类未定义变量的隐性错误。
  • 避免依赖ActiveSheet:直接指定具体工作表(比如SourceBook.Sheets("Follow up")),防止当前激活的工作表不是目标表引发意外。
  • 用值传递替代复制粘贴(更高效):如果不需要复制格式,直接赋值单元格值会更快:
ShSummary.Range("B5:B" & (5 + LastCell_Nbr - 5)).Value = SourceBook.Sheets("Follow up").Range("A5:A" & LastCell_Nbr).Value

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

火山引擎 最新活动