【问题标题】:MS Visio Drop a custom shape using VBAMS Visio 使用 VBA 拖放自定义形状
【发布时间】:2018-07-05 00:23:09
【问题描述】:

我似乎不知道如何使用 VBA 删除形状。

我想要做的是:用户打开一个用户窗体并在文本框中输入一些内容。单击命令按钮时,我想从自定义模具(即shapes.vssx)加载形状(即资源),将用户条目写入ShapeData(即在Props.Name中写入名称字符串),然后将其放在某处工作表。我知道我必须使用 Shape.Drop 方法,但如何引用我想用于创建新形状的特定 Master-Shape?

到目前为止,我正在尝试这个

Private Sub CommandButton1_Click()
   Dim shp As Visio.Shape
   Dim page As Visio.page
   Set page = Application.ActiveWindow.page
   Set shp = Application.Documents.Item("shapes.vssx").Masters.ItemU("ressource")

   page.Drop shp, 1, 1
End Sub

返回类型不匹配。我错过了什么?

【问题讨论】:

    标签: vba ms-office visio


    【解决方案1】:

    您希望删除 Master 而不是 Shape,因此请尝试修改您的代码(未经测试):

    Private Sub CommandButton1_Click()
       Dim mst as Visio.Master
       Dim shp As Visio.Shape
       Dim pag As Visio.page
       Set pag = Application.ActiveWindow.Page
       Set mst = Application.Documents.Item("shapes.vssx").Masters.ItemU("ressource")
       'You might also want to add some checks that the target document and then master exist
       Set shp = pag.Drop(mst, 1, 1)
    End Sub
    

    【讨论】:

    • 非常感谢!你知道如何更改主形状的名称吗?我修改了一个现有的形状(即同心层 1)并将其添加到我自己的模板中。我更改了模具中形状的名称,但我仍然必须将其称为同心层 1 才能使代码正常工作。在母版的 ShapeSheet 中找不到正确的单元格。当我打印 mst.Name 时,它​​返回的名称也显示在模具中。
    • Visio 具有本地 (Name) 和通用 (NameU) 名称的概念。您在 UI 中看到的名称是本地名称,但在您的代码中您使用的是 ItemU。浏览您的 master 集合并报告 Name 和 NameU,您应该会看到差异(如果有的话)。如果要“重置”,则可以在代码中设置 NameU。查看这篇文章了解更多详情:blogs.msdn.microsoft.com/visio/2006/07/27/name-and-nameu
    • 你是对的。感谢链接,我现在明白了其中的区别。当我尝试更改 NameU 时,它返回错误“请求的操作当前已禁用”。我找不到任何有关是否有另一种更改方法的文档。 (非常感谢您为我提供的所有帮助!)
    • 我猜您的目标文档(模板)是只读的,因此您需要右键单击模板并在执行更改之前点击“编辑模板”。您也可以在代码中执行相同的操作,方法是在读写模式下关闭并重新打开模板以对其进行编辑。 (这是在 UI 中点击“编辑模具”时 Visio 在后台执行的操作)。对于代码版本,您可以使用Documents.OpenEx "shapes.vssx", visOpenDocked + visOpenRW,但是除非您需要这样做很多,否则我只会通过手动方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    相关资源
    最近更新 更多