2017-03-18 100 views
1

我试图从我的工作簿中加载的加载项按名称选择工作表。我的代码迭代高达With worksheets(ws1)行则抛出一个类型不匹配错误Excel VBA与“WITH”

类型不匹配错误

会是怎样执行对工作表的行动,并使用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 
+2

'ws1'是一个'Worksheet'。您不需要(不能)将它作为索引传递给'Worksheets'。只需使用'With ws1'。 – Comintern

回答

5
With Worksheets(ws1) 

当你做Worksheets(ws1),你实际上调用Application.Workbooks.Item(在Excel.Worksheets集合类的默认属性

集合类的Item属性参数 - 它需要一个来检索Object参考。所以你需要一个密钥

A VBA.Collection键入StringExcel.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

击败我,为什么你不得不ws2ws1前,但无论如何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")