Vba 枚举的后期绑定问题

Vba 枚举的后期绑定问题,vba,visio,Vba,Visio,在开发过程中,一切都很好,早期绑定非常有效,但现在我已经转移到后期绑定进行生产,并且Visio Enum出现了问题。详情如下: Set AppVisio = CreateObject("visio.application") Set vsoSelection = AppVisio.ActiveWindow.Selection Call vsoSelection.GetIDs(lngShapeIDs) With .Shapes.ItemFromID(lngShapeIDs(0))

在开发过程中,一切都很好,早期绑定非常有效,但现在我已经转移到后期绑定进行生产,并且Visio Enum出现了问题。详情如下:

 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.
全部解决,但我无法在后期绑定中解决它们

我已尝试添加AppVisio。若要在参数前加前缀而不起作用,有人可以帮助我并告诉我引用枚举的正确方法吗

我曾尝试使用Visio VBA记录器查看它提供了什么,但它并不像我希望的那样详细是的,我知道,它非常详细,但在这种情况下不是这样


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

这是后期绑定的折衷方案之一,或者更准确地说,是不在工具>引用中设置显式引用的折衷方案之一。预定义的枚举将不再可用

您必须将枚举替换为其数值

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

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

Const visRowXFormOut As Integer = 1

并保持代码的其余部分不变

这是后期绑定的折衷方案之一,或者更准确地说,是不在工具>引用中设置显式引用的折衷方案之一。预定义的枚举将不再可用

您必须将枚举替换为其数值

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

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

Const visRowXFormOut As Integer = 1

并保持代码的其余部分不变

在某些情况下,自己定义所有枚举数或用普通数字替换代码中的枚举数可能有点太难了。还有另一种方法

如果您在windows中使用脚本语言,该语言看起来像.vbs,那么您仍然可以通过将文件包装到.WSF文件中来使用这些常量

在.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>

在某些情况下,自己定义所有枚举数或用普通数字替换代码中的枚举数可能有点太难了。还有另一种方法

如果您在windows中使用脚本语言,该语言看起来像.vbs,那么您仍然可以通过将文件包装到.WSF文件中来使用这些常量

在.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>

嗨,谢谢你-是的,这似乎是惩罚…我还发现了以下描述你描述的内容。很好,他们还提供了一页枚举供复制和使用。我接受了这个想法,并重新生成了Visio 2013,使我的代码在2010年和2013年都能正常工作。您好,谢谢您-是的,这似乎是一个惩罚…我还发现了以下内容,其中描述了您所描述的内容。很好,他们还提供了一页枚举供复制和使用。我接受了这个想法,并重新生成了Visio2013,使我的代码能够在2010年和2013年正常工作。