With Worksheets(ws1)
当你做Worksheets(ws1)
,你实际上调用Application.Workbooks.Item
(在Excel.Worksheets
集合类的默认属性。
集合类的Item
属性参数 - 它需要一个键来检索Object
参考。所以你需要一个密钥。
A VBA.Collection
键入String
。 Excel.Worksheets
集合类的Item
属性需要一个Variant
- 这意味着在编译时,您给它的任何东西都可以工作。问题发生在运行时,当Variant
值用于检索与关键字关联的Object
。
你可以做Set ws1 = ThisWorkbook.Worksheets(1)
任何Long
(或Integer
)由指数检索项。
你可以做Set ws1 = ThisWorkbook.Worksheets("Sheet1")
任何String
由名检索项目。
就是这样。一个字符串或一个数字。
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!
或任何其他单元格错误值,它会从另一个10类型不匹配错误错误中排除错误。
但因为隐含的默认值,也可以告诉我们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")
'ws1'是一个'Worksheet'。您不需要(不能)将它作为索引传递给'Worksheets'。只需使用'With ws1'。 – Comintern