为什么我会收到 '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/Integer
或 Variant/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" 隐含地引用 当前处于活动状态的任何工作簿 ,这通常是对代码进行的冒险假设。
我正在尝试将一个工作簿的范围复制到另一个工作簿中的 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/Integer
或 Variant/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" 隐含地引用 当前处于活动状态的任何工作簿 ,这通常是对代码进行的冒险假设。