Выходной идентификатор фигуры, перетаскиваемой на экран в Visio-VBA

У меня есть следующий код:

Sub CommandButton1_Click()
   Dim NoIO As String
   Dim shp1 As Visio.Shape
   Dim i As Integer

   Set shp1 = Application.ActivePage.Shapes(1)
   NoIO = ComboBox1.Value

   If NoIO = "7" Then
      MsgBox shp1.id
      'Target shape id selected'
      'Change shape data of that shape'
   End If
   Unload Me
End Sub

Всякий раз, когда фигура сбрасывается на экран, пользователю предоставляется форма пользователя. Когда он отправлен, этот код запускается.

В настоящее время я могу вывести только идентификатор фигуры, впервые перетащенной на экран, показанный этой строкой:

Set shp1 = Application.ActivePage.Shapes(1)

Как я могу изменить это так, чтобы вместо этого отображался идентификатор фигуры, перетаскиваемой на экран?

Спасибо

1 ответ

Решение

Если вы используете обработчик EventDrop и ячейку ShapeSheet, вы можете просто передать идентификатор формы своей функции. Вы можете использовать что-то вроде формулы ниже (где ID() является встроенной функцией, возвращающей идентификатор формы Вы можете использовать его, чтобы получить форму из OnDrop обработчик, определенный в вашем коде VBA. "&" используется для объединения текстовых строк в VBA:

RUNMACRO("ThisDocument.OnDrop("& ID() &")")

А потом в VBA:

Sub OnDrop(shapeId)
  Debug.Print shapeId
  Set shape = ActiveDocument.Shapes.ItemFromID(shapeId)
   ' do something with the shape
End Sub

Лучше вы можете использовать CALLTHIS вместо RUNMACRO (он всегда передает форму объекта в качестве первого параметра)

CALLTHIS("ThisDocument.OnDrop")

А потом в VBA:

Sub OnDrop(x As Shape)
   Debug.Print shape.ID
   ' do something with the shape
End Sub

В обработчике событий перед тем, как показывать форму, вам нужно запомнить форму, а затем передать ее в форму.

Обратите внимание, что в приведенных выше примерах я предполагаю, что "OnDrop" определен в "ThisDocument". Если это определено в модуле, вам не нужен "ThisDocument". префикс

Еще одним вариантом может быть обработка события "Shape Added" в VBA вместо указания формулы ShapeSheet. В этом случае ваш обработчик событий получает форму, отбрасываемую в качестве параметра.

Другие вопросы по тегам