0

我正在尝试检查用户选择的形状是否正确。为简单起见,假设我们在其他空白工作表中只有一个形状。因此,我们知道选择的形状必须是正确的:

Sub AreShapesTheSame()

    Dim ws As Worksheet
    Set ws = ActiveSheet

    Dim shape As Object
    Dim selShape As Object

    Set shape = ws.Shapes.Item(1).DrawingObject
    Set selShape = Selection

    MsgBox shape Is selShape

End Sub

我可以在 Locals 窗口中看到,对象 shape 和 selShape 具有相同的属性。此外,如果我更改其中一个对象的名称(shape.name = "xxx"),另一个对象的名称也会更改。所以我假设它们是相同的对象,或者至少引用相同的对象。

如果是这样,为什么语句 (shape Is selShape) 返回 False?如何检查用户选择是否引用了某些特定对象?

4

1 回答 1

0

如果将选择更改为形状,则会在消息框中获得True。这意味着我们需要一种方法来告诉宏我们需要比较的真实参考。我不知道用户如何选择形状,但我认为这是一个简单的点击。

如果是这样,您可以进行如下操作。将以下宏分配给每个形状以进行比较。您可以使用形状的onAction属性进行分配,并为形状集合上的循环中的所有形状使用单独的宏。

放置两个形状进行测试并将宏分配给每个形状。在示例中,您必须在输入字段中指定预期形状的索引。在您的项目中,索引以另一种方式出现。

Sub AreShapesTheSame()

  Dim shape As Object
  Dim selShape As Object
  Dim shapeIndexToCompareWithClickedOne As Long

  shapeIndexToCompareWithClickedOne = InputBox("ShapeIndex", "Insert shape index")
  Set shape = ActiveSheet.Shapes.Item(shapeIndexToCompareWithClickedOne)
  Set selShape = ActiveSheet.Shapes.Item(Application.Caller)

  MsgBox shape Is selShape
End Sub
于 2020-02-08T13:17:48.290 回答