为什么我会收到 'type mismatch' 错误?

Why am I getting a 'type mismatch' error?

我正在尝试将一个工作簿的范围复制到另一个工作簿中的 table 以捕获生产数据。我能够复制正确的范围并成功打开带有 table 的工作簿。但是,当它尝试将信息粘贴到 table 中的下一个可用行时,我收到错误 13。我对 vba 比较陌生,似乎找不到解决方案,任何帮助都会不胜感激。

Dim wbTime As Workbook
   Set wbTime = ThisWorkbook

   Dim wbData As Workbook

   Dim N As Long
   N = Cells(Rows.Count, "A").End(xlUp).Row + 1

   Dim UsdRws As Long
   UsdRws = Cells.Find("*", After:=Range("A32"), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

   wbTime.ActiveSheet.Range("A6:O" & UsdRws).Copy

   Set wbData = Workbooks.Open("S:\Lean Carrollton Initiative\Allen\Buffering Interruptersst Shift\B10\Data.xlsx")

   wbData.ActiveSheet.Paste Destination:=Worksheets(Sheet1).Range(N & "A")

   wbData.Close SaveChanges:=True
End Sub

您的范围需要符合正确的语法

Range("A" & N)

您也可以使用

Cells(N, "A")

sheet1应该是"Sheet1"Worksheets("Sheet1")Sheet1 本身,未加引号,将被视为一个变量。除非你有一个那个名字的字符串变量?使用模块顶部的 Option Explicit 检查变量声明。


@MathieuGuidon 的补充评论:

补充一下,Sheet1 是新工作簿中"Sheet1"作品sheet的默认代号;它是项目范围内的标识符 VBA 免费创建,为您提供对该特定 Worksheet 对象的编译时引用 - 因此,从 Worksheets 集合中检索该对象是多余的总的来说:Sheet1.Range(...) 更可取——理想情况下,sheet 的(名称)属性 应该修改为有意义的标识符,例如SummarySheet,使 SummarySheet.Range(...) 合法,无需声明任何 SummarySheet 变量

Destination1:=Worksheets(Sheet1).Range(N & "A")

@QHarr Range(N & "A") 的问题,并针对您在 Worksheets(Sheet1).

遇到的类型不匹配错误提出了修复方案

我只是想更详细地解释发生了什么,无法容纳一个小评论框。

Sheet1是一个隐式声明的Worksheet类型的对象变量,其编译时标识符由工作表的(Name)属性决定:

如果将此 属性 值更改为 SummarySheet,则 Sheet1 不再是有效标识符,而 SummarySheet 变为一个 - 这是在每个模块的顶部指定 Option Explicit 的部分原因很重要,因为如果没有它 VBA 将愉快地编译和 运行,除了现在而不是 Sheet1 是非法的,现在是一个未定义的 Variant/Empty 值,可以意外地愉快地传递,这会使事情很难调试(这同样适用于 any 未声明的变量,而不仅仅是工作表代码名称)。

所以 Sheet1 是一个 Worksheet 对象引用。如果 Worksheet 有一个 默认成员 返回其 Name 属性 的值,您的代码将有效。

但是 Worksheet 没有 默认成员 ,因此 Worksheets(Sheet1)Worksheet 对象引用作为参数传递给Worksheets.Item 索引器(隐含地 - 因为 Worksheets class 确实 有一个默认成员,它的 Item 属性),期望 Variant 包含工作表名称 (Variant/String) 或数字索引(Variant/IntegerVariant/Long)。

Worksheet 对象传递给 Worksheets.Item 是引发 类型不匹配 错误的原因。

因此,假设 Sheet1 工作表是预期的目的地,这将修复它(对 QHarr 之前发现的 Range 参数错误进行抽象):

wbData.ActiveSheet.Paste Destination:=Sheet1.Range(...)

永远不需要从 Worksheets 集合中检索 ThisWorkbook 中编译时存在的工作表。

注意原代码中:

Destination1:=Worksheets(Sheet1).Range(N & "A")

因为Worksheets不合格,所以它所属的Workbook是有歧义的:如果那个代码写在ThisWorkbook,那么Worksheets就是成员调用反对 Me,即 ThisWorkbook.Worksheets。否则,它 "conveniently" 隐含地引用 当前处于活动状态的任何工作簿 ,这通常是对代码进行的冒险假设。