我有一个用于视听示意图的启用宏的模板,其中包括团队进行 19 英寸机架布局时的机架框架形状。默认情况下,这是 1U 高,但向上拖动时它会扩展,高达 47U(我们常用的最大机架)。
每个 U 旁边都有一个标记(方形),用于显示机架 U 的编号 - 从底部的 01 到顶部的 47。形状表上有一些公式,可以在机架没有其位置那么高时隐藏它们(在 01 标记后面),并在机架扩展时使它们可见并移动到位。这一切都有效。
我一直在尝试解决一个问题,即用户可能会删除机架主体但不会删除标记,从而留下不可见和可见的标记。我通过向每个标记的形状表上的用户定义单元格添加一个公式来解决此问题,该公式将 iferror 函数包装在对机架主体的引用周围。当删除机架主体时,iferror 函数会调用模板 VBA 代码中的“DeleteMe”子函数。
我在形状表上使用的函数是:
=IFERROR(IF(RackBody!Width>20 mm,TRUE,TRUE),CALLTHIS("ThisDocument.DeleteMe","AV_Symbols_24"))
因此,If 语句始终解析为 True,除非 RackBody 已被删除,当它出错时,会触发 CALLTHIS 函数。 DeleteMe 子程序只有一行:
Sub DeleteMe(vsoShp as Visio.Shape)
vsoShp.delete
End Sub
但是,当我删除 RackBody 形状时,并非所有标记都会被删除 - 尽管它们都具有完全相同的功能。我在代码中添加了一个 debug.print 调用,它会触发前 65 个标记(始终是相同的标记,并且始终是具有 65 个最低形状 ID 编号的标记)。如果我注释掉删除行,则会针对所有 94 个标记触发 debug.print。
因此,我怀疑每次删除都需要一些时间,当前 65 个删除完成时,Visio 会错过其余的内容,但如果有人有任何进一步的见解,我会很感兴趣。目前我已将机架高度限制为 27U,这样可以可靠地工作(并且我有一个设施可以让您在其旁边放置第二个机架,从 28U 开始)。
我在形状表上使用的函数是:
=IFERROR(IF(RackBody!Width>20 mm,TRUE,TRUE),CALLTHIS("ThisDocument.DeleteMe","AV_Symbols_24"))
请看下面的图片