[英]Type Mismatch Error In Excel VBA With “WITH”
我正在尝试从工作簿中加载的加载项中通过名称选择工作表。 我的代码迭代到With worksheets(ws1)
的行,然后抛出
类型不匹配错误
在该工作表上执行操作并使用with
功能的正确方法是什么?
Dim ws2 As Worksheet, ws1 As Worksheet
Dim aData
Set ws2 = ActiveWorkbook.ActiveSheet
Set ws1 = ThisWorkbook.Worksheets("Tastatas")
With Worksheets(ws1)
aData = .Range("a1").CurrentRegion
End With
With Worksheets(ws1)
当您执行Worksheets(ws1)
,实际上是在调用Application.Workbooks.Item
( Excel.Worksheets
集合类的默认属性。
集合类的Item
属性已参数化-它需要一个键来检索Object
引用。 所以你需要一把钥匙 。
VBA.Collection
用String
键输入。 该Item
的物业Excel.Worksheets
集合类需要一个Variant
-这意味着在编译时, 任何你给它会奏效 。 当使用Variant
值检索与您提供的键相关联的Object
时,会在运行时发生问题。
您可以对任何Long
(或Integer
)执行Set ws1 = ThisWorkbook.Worksheets(1)
以通过index检索项目。
您可以对任何String
进行Set ws1 = ThisWorkbook.Worksheets("Sheet1")
来按名称检索项目。
就这样。 字符串或数字。
Dim ws2 As Worksheet, ws1 As Worksheet
击败了我为什么在ws2
之前有ws1
,但无论如何ws1
是一个Worksheet
对象引用,不是String
,不是Long
。
所以您的代码会编译,因为您正在将该引用传递给Variant
参数,并在运行时因类型不匹配错误而崩溃 ,因为您提供的类型( Worksheet
)与预期的类型不匹配 ( String
或任何整数)数字类型)。
With
块可以很好地为您保存该引用-从而节省了变量声明:
With ThisWorkbook.Worksheets("Tastatas")
aData = .Range("A1").Value
End With
请注意,赋值右侧的显式.Value
:如果将其省略,它仍然存在,只有隐式 。 这是因为Range
类具有指向其Value
的默认属性 ,该属性是一个Variant
,可以包含字符串,日期,数字,错误值...将值读入Variant
是一个好主意:如果您正在读取的单元格包含#REF!
其他类型的不匹配错误#REF!
或任何其他单元格erorr值。
但是由于隐式默认值,唯一可以告诉我们aData
是值还是引用的就是赋值本身:
[Let] aData = .Range("A1") ' value assignment: aData is the cell's value.
Set aData = .Range("A1") ' reference assignment: aData is a Range object.
使用显式代码可以使事情变得更清楚:
aData = .Range("A1").Value
Set aData = .Range("A1")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.