繁体   English   中英

Excel VBA中带有“ WITH”的类型不匹配错误

[英]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.ItemExcel.Worksheets 集合类的默认属性。

集合类的Item属性已参数化-它需要一个来检索Object引用。 所以你需要一把钥匙

VBA.CollectionString键输入。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM