Enums的后期绑定问题

时间:2013-12-03 06:33:38

标签: vba visio

在开发期间一切都很好,早期绑定工作得很好,但现在我已经转移到生产的后期绑定,我遇到了Visio Enums的问题。如下:

 Set AppVisio = CreateObject("visio.application")
 Set vsoSelection = AppVisio.ActiveWindow.Selection
 Call vsoSelection.GetIDs(lngShapeIDs)

 With .Shapes.ItemFromID(lngShapeIDs(0))
    .CellsSRC(visSectionObject, visRowXFormOut, visXFormPinX).FormulaU = sngShapeHCenter
    .CellsSRC(visSectionObject, visRowXFormOut, visXFormPinY).FormulaU = sngShapeVCenter
    .CellsSRC(visSectionObject, visRowXFormOut, visXFormWidth).FormulaU = sngShapeWidth
    .CellsSRC(visSectionObject, visRowXFormOut, visXFormHeight).FormulaU = sngShapeHeight
 End With

早期绑定

visSectionObject, visRowXFormOut, visXFormPinX etc.

所有解决方案,但我无法让它们在Late Binding中解决。

我尝试过添加AppVisio。为参数添加前缀无效,任何人都可以帮助并告诉我引用枚举的正确方法吗?

我已经尝试过使用Visio VBA刻录机来查看它给出了什么,但它并不像我希望的那样冗长(是的,我知道,它是如此冗长,但不是在这种情况下)。

这需要适用于Visio 2010和2013等。

2 个答案:

答案 0 :(得分:4)

这是后期绑定的权衡之一,或者更确切地说,不是在工具>参考文献中设置显式引用。然后,预定义的枚举不再可用。

您必须使用其数值(see e.g. this list)替换枚举。

例如,visRowXFormOut的数值为1,您可以在立即窗口中自行检查:

?visRowXFormOut
1

因此,您可以将visRowXFormOut的所有实例替换为1,或将visRowXFormOut声明为常量:

Const visRowXFormOut As Integer = 1

并按原样保留其余代码。

答案 1 :(得分:0)

在某些情况下,自己定义所有枚举数或用普通数字替换代码可能有点过于具有挑战性。还有另一种方式。

如果您在Windows中使用脚本(语言类似.vbs),那么您仍然可以使用这些常量,方法是将文件包装到.WSF(Windows Script)文件中。

在.wsf文件中,您有一个“引用”项,允许您使用类型库中的常量。

<job id='my script'>

    <!-- this imports enumerators from Visio typelib -->
    <reference guid="{00021A98-0000-0000-C000-000000000046}" version="4.14" />

    <script language="vbscript">
        ... 
        your code here which uses constants from Visio type library here, like:
        ...
        WScript.Echo visRowXFormOut ' prints 1
        ...
    </script>

</job>

不是100%确定您是否必须在项目中明确指定版本,但无论如何,Visio 2010版本为4.14,Visio 2013为4.15。它也可以在没有明确版本规范的情况下工作(请参阅wsf文档)

您还可以考虑包装整个.vbs文件而不进行如下更改:

<job id='my script>

    <reference guid="{00021A98-0000-0000-C000-000000000046}" version="4.14"/>

    <!-- you can use enumerators in that script -->
    <script language="vbscript" src="code.vbs" />

</job>