如何将工作表数据复制到临时文件工作表?遇“对象要求”错误求排查
问题排查与修复方案
核心错误原因
你遇到的“对象要求”错误,根源在这行代码:
Set wsDest = TempFileName.Sheets("Sheet1")
TempFileName是字符串类型(仅存储文件路径),并非Workbook对象,无法直接调用.Sheets方法- 变量
wsDest声明为Workbook类型,但你实际要赋值的是Worksheet对象,类型完全不匹配
修复后的完整代码
Sub CopyandPasteData() Dim wsCopy As Worksheet Dim wbDest As Workbook ' 修正:用wbDest表示工作簿,wsDest表示工作表 Dim wsDest As Worksheet Dim lCopyLastRow As Long Dim lDestLastRow As Long Dim JobName As String ' 补充变量声明,避免隐式类型问题 Dim TempFileName As String ' 补充变量声明 ' 设置复制源工作表(明确归属当前工作簿) Set wsCopy = ThisWorkbook.Worksheets("Report") ' 生成临时文件路径 JobName = "Service items report for " & ThisWorkbook.Sheets("Analysis").Range("A1").Value TempFileName = Environ$("temp") & "\" & JobName & ".xlsx" ' 处理临时文件:存在则打开,不存在则新建 If Dir(TempFileName) <> "" Then Set wbDest = Workbooks.Open(TempFileName) Else Set wbDest = Workbooks.Add wbDest.SaveAs TempFileName End If ' 绑定目标工作表 Set wsDest = wbDest.Sheets("Sheet1") ' 1. 获取复制源最后一行 lCopyLastRow = wsCopy.Cells(wsCopy.Rows.Count, "A").End(xlUp).Row ' 2. 获取目标区域第一空行(处理目标表为空的边界情况) lDestLastRow = wsDest.Cells(wsDest.Rows.Count, "A").End(xlUp).Offset(1).Row If lDestLastRow < 2 Then lDestLastRow = 2 ' 3. 复制粘贴数据 wsCopy.Range("A2:AI" & lCopyLastRow).Copy wsDest.Range("A" & lDestLastRow) ' 保存并关闭目标工作簿,确保数据写入 wbDest.Close SaveChanges:=True Application.CutCopyMode = False End Sub
额外优化说明
- 补充了未声明的变量,避免VBA隐式类型转换导致的潜在问题
- 用
ThisWorkbook限定工作表归属,防止切换工作簿后出错 - 增加临时文件不存在时的新建逻辑,解决文件找不到的报错
- 处理了目标工作表为空的边界场景,避免
Offset返回无效行号 - 新增目标工作簿的保存关闭操作,确保复制的数据被持久化到临时文件
内容的提问来源于stack exchange,提问作者Jannette
相关产品推荐
相关产品推荐

