Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“VBA”一词;“检测到名称不明确”;用于ActiveX标签_Vba_Ms Word - Fatal编程技术网

“VBA”一词;“检测到名称不明确”;用于ActiveX标签

“VBA”一词;“检测到名称不明确”;用于ActiveX标签,vba,ms-word,Vba,Ms Word,我有一个最初在Windows7 32位机器上创建的Word文档,自从切换到Windows7 64位之后,它现在给我带来了问题。两个系统都运行Word 2010(v14.0.7173.5000,32位)。Word文档有许多ActiveX标签和一个大宏,该宏将每个ActiveX标签链接到Excel文档中的特定单元格。通过这种方式,我更新Excel文件,并运行Word宏来更新所有标签 以下是在Win7 x86计算机上打开Word文档时,VBA中ActiveX标签的外观: 但是,当在Win7 x64计

我有一个最初在Windows7 32位机器上创建的Word文档,自从切换到Windows7 64位之后,它现在给我带来了问题。两个系统都运行Word 2010(v14.0.7173.5000,32位)。Word文档有许多ActiveX标签和一个大宏,该宏将每个ActiveX标签链接到Excel文档中的特定单元格。通过这种方式,我更新Excel文件,并运行Word宏来更新所有标签

以下是在Win7 x86计算机上打开Word文档时,VBA中ActiveX标签的外观:

但是,当在Win7 x64计算机上打开文档时,标签将重命名为末尾的“1”:

因为我的VBA代码本身没有更改,如果我运行宏,我会收到错误消息“Object library invalid or contains reference to Object definitions not found”。如果我试图通过删除“1”来修复标签,我会收到一条“检测到不明确的名称”错误消息

如果在标签中使用额外的“1”重新保存文件,则在Win7 x86计算机上打开时,新标签将保留并可见。然后,同一台机器可以删除额外的“1”,但如果我在Win7 x64机器上尝试执行相同操作,我会再次收到“检测到不明确的名称”错误消息


有人知道是什么导致了这个问题,以及如何修复它吗?

似乎您的控件需要修复/更改它们的名称。您可以在设计模式下手动执行此操作

或者,您可以更新代码,以便:

ThisDocument.ai_oos_01.Caption = "whatever"
您可以这样做:

FixControlNameAndSetCaption "ai_oos_01", "whatever"
只需抓取此过程并将其放入标准模块(例如,
Module1
):

公共子FixControlName和SetCaption(ByVal controlName作为字符串,ByVal newCaption作为字符串)
将单词形状变暗为InlineShape
对于此文档中的每个字形状。InlineShapes
使用wordShape.OLEFormat.Object
如果左$(.Name,Len(controlName))=controlName,则
如果.Name controlName,则.Name=controlName
.Caption=newCaption
出口接头
如果结束
以
下一个
端接头
现在,如果控件“
.Name
与指定的
controlName
完全匹配,则只有
.Caption
将更改(这是您的代码当前应该执行的操作)。如果控件“
.Name
与指定的
controlName
匹配,如果不存在讨厌的数字后缀,则它会将控件重命名为指定的
controlName
,从而有效地“修复”控件名

然而,如果您有合法/预期的控件名称
Foobar01
Foobar012
,那么我没有其他解决方案,只能强烈建议您在命名事物时避免使用数字后缀,并始终为事物指定有意义的/描述性名称


不直接引用
ThisDocument.ai_oos_01
的含义是,如果对象以某种方式重新命名,代码仍会编译并运行(我怀疑文档已损坏,或者有人复制了所有控件和/或删除了原始控件,这可能是偶然的).

您是否尝试修复处理程序以添加
1
,然后保存文档(副本)?还没有。有没有一种简单的方法可以代替从下拉菜单中逐个选择每个标签(如在我的屏幕截图中)?如果在代码窗格中一次只能看到一个过程,则需要切换到“模块视图”(代码窗格底部/角落的一个切换按钮);您应该能够滚动浏览模块,而无需使用这些下拉菜单进行导航。或者获取最新版本并使用代码浏览器和其他导航工具浏览您的代码(注意,v2.x还没有完全稳定,但我们正在处理;-)。我的VBA代码位于“ThisDocument”的Microsoft Word对象下,而不是模块下。这是一个问题吗?没有区别,我说的是编辑器本身(请参见这两个按钮上的工具提示)。
Public Sub FixControlNameAndSetCaption(ByVal controlName As String, ByVal newCaption As String)
    Dim wordShape As InlineShape
    For Each wordShape In ThisDocument.InlineShapes
        With wordShape.OLEFormat.Object
            If Left$(.Name, Len(controlName)) = controlName Then
                If .Name <> controlName Then .Name = controlName
                .Caption = newCaption
                Exit Sub
            End If
        End With
    Next
End Sub