【问题标题】:Output ID of the shape dragged onto the screen in Visio-VBA在 Visio-VBA 中拖动到屏幕上的形状的输出 ID
【发布时间】:2020-07-01 02:31:43
【问题描述】:

我有以下代码:

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?

谢谢

【问题讨论】:

标签: vba shapes visio


【解决方案1】:

如果您使用 EventDrop 处理程序和 ShapeSheet 单元格,则只需将形状 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

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

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

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

【讨论】:

  • 谢谢!这很有帮助。
  • 如果这回答了您的问题,请将其标记为答案。
  • 它有帮助,但由于提交用户表单而不是在形状被删除后,我仍然没有实现这一点。换句话说,如何在其他子程序中使用内置的 ID() 函数?
  • ShapeSheet中可以使用ID()函数,好像和子程序没有关系。
  • 我认为这与这里的问题/答案相同:stackoverflow.com/questions/51061741/… 为什么会被问两次?
猜你喜欢
  • 2018-12-06
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多