我有以下代码:
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?
谢谢
答案 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公式。在这种情况下,您的事件处理程序会接收到形状被丢弃为参数的情况。