【问题标题】:Visio VBA copy/cut/paste interceptVisio VBA 复制/剪切/粘贴拦截
【发布时间】:2020-07-01 06:02:05
【问题描述】:

我还有另一个挑战。有没有人试图拦截复制/粘贴事件?我的目标是防止有人剪切/复制/粘贴已经在纸上的形状。如果他们把它从模板上拖下来,那很好。我只是不能让他们复制现有的形状。为了让这更难一点,我只需要防止这种形状。如果要复制文本,那很好。

我们有一个订单类型数据库,其中包含需要放在 Visio 工作表上的项目。我不能使用 shapeID,因为我需要能够从数据库更新形状,并且我不能将 ID 写回数据库,因为它违反了安全策略。我将两者联系在一起的方式是一个名为 shapeKey 的属性,该值由数据库在删除形状时提供。

当用户需要从数据库中刷新工作表时,我会遍历形状,比较形状和数据库中的 shapeKey。如果匹配,我会更新其他属性。如果没有匹配,我想删除形状。如果用户复制一个形状,shapeKey 也将被复制,这会导致问题。最后,他们可以从模具中添加自己的形状,这些形状必须从删除过程中排除

我有两个选择:

  1. 禁用形状剪切/复制/粘贴
  2. 截取复制/剪切并在粘贴时更改属性,以便我知道它是用户粘贴的形状。这是首选,因为它对用户更友好
  3. 我只是想如果另一种方法我可能会工作。有没有办法锁定形状以防止复制?如果有锁,那也会锁定位置吗?用户需要能够熟悉周围的大多数形状。

我考虑过捕获事件,但找不到要查找的事件代码。我无法安装具有事件监视器的 Visio SDK。监视器可能已经向我显示了代码。这是一些关于我认为流程的伪代码。

选项 1

if select item is a shape then
    msgbox "shape copying verboten. please us the stencil"
    clear selected item

选项 2

capture the paste event
    if selected item is a shape then
        vsoShape.Cells("Prop.ShapeKey").Formula = Chr(34) & "protect" & Chr(34)

图层可能会起作用。所有数据库控制的形状都可以在一个图层上,所有用户形状都可以在另一个图层上,但我以前没有使用过图层。那行得通吗?如何确保粘贴的任何形状都进入用户层?

【问题讨论】:

  • 您想只禁用某些剪切/复制/粘贴,还是禁用所有这些选项?看看这个例子:vbaexpress.com/kb/getarticle.php?kb_id=373
  • 这是个好主意,除了 application.OnKey 不适用于 Visio 之外,它还可以工作。该代码适用于 Excel。不过,我希望它会奏效。这本来是解决方案。

标签: vba visio


【解决方案1】:

谢谢大家!我确实找到了一个解决方案,它真的很优雅。我在这里找到了想法并将其更改为我需要的:

形状添加事件:https://msdn.microsoft.com/en-us/library/office/ff767288.aspx

这是我想出的:

Private Sub Document_ShapeAdded(ByVal vsoShape As Visio.IVShape)
    If vsoShape.CellExistsU("Prop.ShapeName", 0) Then
        vsoShape.CellsU("Prop.ShapeName").Formula = Chr(34) & "ShapeName" & Chr(34)
    End If
End Sub

有趣的是,如果我通过 VBA 添加形状,它不会触发。这非常适合我的需要,但我认为删除形状就是添加形状。我只寻找一个属性,因为并非模具上的所有形状都来自数据库,对于这些对象,我不需要做任何事情。

这不是我预期的解决方案,但效果很好。

【讨论】:

    猜你喜欢
    • 2013-02-05
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多