为什么会出现“类型不匹配”错误?

时间:2019-01-23 15:32:42

标签: excel vba paste type-mismatch

我试图将范围从一个工作簿复制到另一个工作簿中的表以捕获生产数据。我能够复制正确的范围并成功打开带有表的工作簿。但是,当它尝试将信息粘贴到表中的下一个可用行时,出现错误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 Interrupters\1st Shift\B10\Data.xlsx")

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

   wbData.Close SaveChanges:=True
End Sub

2 个答案:

答案 0 :(得分:2)

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

@QHarr correctly identifiedRange(N & "A")的问题,并提出了针对您在Worksheets(Sheet1)遇到的类型不匹配错误的解决方案。

我只是想解释发生了什么事,而没有一个小的注释框。

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

Sheet1 properties toolwindow showing the (Name) property

如果将此属性值更改为SummarySheet,则Sheet1不再是有效的标识符,并且SummarySheet成为一个-这就是为什么指定{{ 1}}在每个模块的顶部很重要,因为没有它,VBA会很高兴地编译和运行,除了现在Option Explicit非法之外,它现在是一个未定义的Sheet1值,可以很容易地意外传递,这会使调试变得非常困难(任何未声明变量,不仅是工作表代码名称也是如此)。

因此Variant/EmptySheet1对象引用。如果Worksheet具有返回其Worksheet属性值的默认成员,则您的代码将起作用。

但是Name没有默认成员,因此WorksheetWorksheets(Sheet1)对象引用作为参数传递给Worksheet索引器(隐式-因为Worksheets.Item确实具有默认成员,其Worksheets属性),它期望一个Item持有工作表的名称(Variant或数字索引(Variant/StringVariant/Integer)。

Variant/Long对象传递给Worksheet是引发类型不匹配错误的原因。

因此,假设Worksheets.Item工作表是预期的目标,它将解决此问题(对QHarr先前确定的Sheet1参数错误进行抽象化处理):

Range

永远不需要从wbData.ActiveSheet.Paste Destination:=Sheet1.Range(...) 集合中检索ThisWorkbook中在编译时存在的工作表。

请注意,在原始代码中:

Worksheets

由于Destination1:=Worksheets(Sheet1).Range(N & "A") 不合格,因此它所属的Worksheets模棱两可:如果该代码是用Workbook编写的,则ThisWorkbook是对{ {1}},即Worksheets。否则,它“方便地”隐式地指的是当前工作簿上什么活着的,这通常对于编写代码来说是一个冒险的假设。

答案 1 :(得分:1)

您的范围需要正确的语法

Range("A" & N)

您也可以使用

Cells(N, "A")

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


@MathieuGuidon的其他评论:

我将添加Sheet1是新工作簿中“ Sheet1”工作表的默认代码名称;这是VBA免费创建的项目范围标识符,为您提供了对该特定Worksheet对象的编译时引用-因此,从Worksheets集合中检索该对象完全是多余的:Sheet1.Range(...)更可取-理想情况下,应将该工作表的(Name)属性修改为有意义的标识符,例如SummarySheet,它使SummarySheet.Range(...)合法,而无需声明任何SummarySheet变量