Сравнение объекта формы, полученного из Selection, и той же формы, полученной из набора ActiveSheet.Shapes. - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь проверить, подходит ли выбранная пользователем форма. Для простоты, скажем, у нас есть только одна фигура в другом пустом листе. Из-за этого мы знаем, что выбранная форма должна быть правильной:

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? Как я могу проверить, ссылается ли пользовательское выделение на какой-либо конкретный c объект?

1 Ответ

0 голосов
/ 08 февраля 2020

Если вы измените Выбор на форму , вы получите True в окне сообщения. Это означает, что нам нужен способ сообщить макросу реальную ссылку , которая нам нужна для сравнения. Я не знаю, как пользователи выбирают форму, но я думаю, что это простой щелчок.

Если это так, вы можете действовать следующим образом. Назначьте следующий макрос для каждой фигуры для сравнения. Вы можете выполнить назначение, используя свойство onAction фигур с отдельным макросом для всех фигур в al oop над коллекцией фигур.

Поместите две фигуры для проверки и назначьте макрос до каждая форма. В этом примере вы должны указать индекс для ожидаемой фигуры в поле ввода. В вашем проекте индекс идет по-другому.

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
...