Выходной идентификатор фигуры, перетаскиваемой на экран в Visio-VBA - PullRequest
0 голосов
/ 30 июня 2018

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

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 Ответ

0 голосов
/ 30 июня 2018

Если вы используете обработчик 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. В этом случае ваш обработчик событий получает форму, отбрасываемую в качестве параметра.

...