EXCELVBA-“;“类型不匹配”;关于第二集形

EXCELVBA-“;“类型不匹配”;关于第二集形,vba,excel,Vba,Excel,我有一个小宏,但是在第二个“设置形状”行上得到类型13不匹配(运行时错误13)。第一个没有错误,但我不明白为什么第二个有错误。看来它也在做同样的事情 Sub myMacro() Dim mapWS, dataWS As Worksheet Dim fromX, fromY, toX, toY As Integer Dim fromShape, toShape As Shape Set mapWS = Sheets("World Map") Set dataWS = Sheets("Data")

我有一个小宏,但是在第二个“设置形状”行上得到类型13不匹配(运行时错误13)。第一个没有错误,但我不明白为什么第二个有错误。看来它也在做同样的事情

Sub myMacro()
Dim mapWS, dataWS As Worksheet
Dim fromX, fromY, toX, toY As Integer
Dim fromShape, toShape As Shape

Set mapWS = Sheets("World Map")
Set dataWS = Sheets("Data")


Dim shapeNames(2, 2) As String
shapeNames(0, 0) = "USA"
shapeNames(0, 1) = "USA2"
shapeNames(1, 0) = "Germany"
shapeNames(1, 1) = "DEU"

i = 0
Set fromShape = mapWS.Shapes.Range(Array(shapeNames(i, 1)))
Set toShape = mapWS.Shapes.Range(Array(shapeNames(i + 1, 1)))
...
End Sub
在第二行(“Set-toShape=mapWS…”)处出现错误。为什么它会出现在那里?或者相反,为什么它不会出现在第一个呢?一次只能设置一个形状范围吗


谢谢你的帮助和建议

注意,使用下面的语法,在VBA中,第一个对象
fromShape
是variant,第二个对象是
Shape

Dim fromShape, toShape As Shape
如果你想要两种形状,你必须写:
Dim fromShape As Shape,toShape As Shape

所以,在你的第一行:

Set fromShape = mapWS.Shapes.Range(Array(shapeNames(i, 1)))
您将影响范围对象到变量的结果。那很好

但在你的第二行:

Set toShape = mapWS.Shapes.Range(Array(shapeNames(i + 1, 1)))
您将影响范围对象到形状对象的结果。。。然后是“类型不匹配”

您最好让VBA决定,然后将这两个变量声明为变量:

Dim fromShape, toShape
多亏了Rory comment,如果您想要真正的类型化变量,您必须使用:

Dim fromShape As ShapeRange, toShape As ShapeRange

因为您实际上想要
形状
对象,所以在我看来,最好使用它们:

Dim fromShape As Shape, toShape As Shape
...

i = 0
Set fromShape = mapWS.Shapes(shapeNames(i, 1))
Set toShape = mapWS.Shapes(shapeNames(i + 1, 1))

当您调暗VAR时,如
dim mapWS,dataWS As Worksheet
,只有
dataWS
被声明为工作表。
mapWS
成为一个变体。fromShape、toShape和其他人也是如此。哦,哦,我不知道。那很有趣。(…现在我要回去润色一下我在[“Dim x,y,z as integer”]中使用的其他宏。它不是一个
范围
对象,而是一个
形状
对象-它们完全不同。)啊哈!非常感谢,我不知道:)谢谢Rory-通过执行宏并使用宏,我得到了整个“数组(shapeNames…”-Excel创建的宏使用了数组,但是你是对的,我想使用一个Shape.Hm-使用ShapeRange,我得到了一个新错误(“运行时错误424:需要对象”)。这行代码是:Set fromShape=mapsWS.Shapes(shapeNames(k,1))……也不能使用数组选项。我如何让它设置形状变量?你没有用我发布的代码替换你的所有代码,是吗?我只显示了需要更改的行。啊,是的,修复了它,它可以工作。但是,使用“ShapeRange”而不是“Shape”,我需要使用“数组”吗方法,就像在我原来的帖子中一样——使用“Shape”,我只使用mapWS.Shapes()?是的,这是正确的。
Shapes.Range()
将返回一个
ShapeRange
对象(即使它只是一个形状),而
Shapes()
返回一个
Shape
对象。