在Visio-VBA中将形状的输出ID拖动到屏幕上

时间:2018-06-30 10:38:45

标签: vba shape visio 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

每当将形状拖放到屏幕上时,就会向用户显示用户表单。提交后,此代码将运行。

当前,我只能输出首先拖动到此行显示的屏幕上的形状的ID:

Set shp1 = Application.ActivePage.Shapes(1)

如何更改此设置,以便改为显示拖动到屏幕上的形状的ID?

谢谢

1 个答案:

答案 0 :(得分:2)

如果您正在使用EventDrop处理程序和ShapeSheet单元,则只需将shape ID传递给函数即可。您可以使用类似下面的公式(其中ID()是返回形状ID的内置函数。您可以使用它从VBA代码中定义的OnDrop处理程序中获取形状)。用于连接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

在事件处理程序中,在显示表单之前,您需要记住形状,然后可以将其传递给表单。

请注意,在以上示例中,我假设在“ ThisDocument”中定义了“ OnDrop”。如果是在模块中定义的,则不需要“ ThisDocument”。前缀

然而,另一个选择可能是在VBA中处理“已添加形状”事件,而不是指定ShapeSheet公式。在这种情况下,您的事件处理程序会接收到形状被丢弃为参数的情况。