Vba Excel更改外接程序的链接

Vba Excel更改外接程序的链接,vba,excel,Vba,Excel,我需要将一个.xls(不能有宏)链接到我们网络上的宏。我认为我已经找到了一个很好的解决方案,它使用一个形状链接到一个宏,该宏是在Excel中设置的外接程序。这种方法在一年多的时间里效果很好,但现在事情开始变得很奇怪。Excel不断更改我从网络到本地驱动器的链接 基本上,我在电脑上运行代码,创建一个按钮,并将.OnAction值设置为“SPC_BUTTONS.xlam!”!excel有时会更新为“G:\NetworkLocation\SPC\u BUTTONS.xlam!”!(有时它会把它单独留下

我需要将一个.xls(不能有宏)链接到我们网络上的宏。我认为我已经找到了一个很好的解决方案,它使用一个形状链接到一个宏,该宏是在Excel中设置的外接程序。这种方法在一年多的时间里效果很好,但现在事情开始变得很奇怪。Excel不断更改我从网络到本地驱动器的链接

基本上,我在电脑上运行代码,创建一个按钮,并将.OnAction值设置为“SPC_BUTTONS.xlam!”!excel有时会更新为“G:\NetworkLocation\SPC\u BUTTONS.xlam!”!(有时它会把它单独留下)。我将外接程序链接到网络上运行(不要在本地复制),因此这是它的正确地址。但是,当我将文件从计算机移动到网络并移动到最终计算机时,链接将更改为“C:\NetworkLocation\SPC\U BUTTONS.xlam!”!“出口SPC”。文件的链接一直工作到它到达本地计算机的点

'Check if SPC Button already exists
Dim exportButton As Shape
On Error Resume Next
    Set exportButton = InspectionWS.Shapes("SPC Button")
On Error GoTo 0

If Not exportButton Is Nothing Then
    'Delete the old button
    InspectionWS.Shapes("SPC Button").Delete
End If

'Create "SPC Button"
InspectionWS.Shapes.AddShape(msoShapeRectangle, 770, 600, 160, 36).Name = "SPC Button"
Set exportButton = InspectionWS.Shapes("SPC Button")

With exportButton
    .ShapeStyle = msoShapeStylePreset34
    .TextFrame2.TextRange.Characters.Text = "Export SPC Data"
    .TextFrame2.TextRange.Font.Size = 20
    .TextFrame2.WordArtformat = msoTextEffect8
    .OnAction = "EXPORTSPC"
End With
我第一次看到这个问题是在我更改外接程序时。我在该文件中制作了另一个宏,名为EXPORTSPC2,并在上线时与原始宏交换了名称。那时所有的链接都断了。我调回了名字,并决定只交换代码,以防位置有问题。仍然没有帮助链接

我循环了原来的宏,它再次在每个文件上设置了按钮,但未能纠正问题。几个小时后,在尝试了许多选项后,我发现设置为“EXPORTSPC”的.OnAction再次获得了一些文件要重新链接,但前提是我在本地计算机上进行了链接。我尝试了完整地址、本地地址(并移动外接程序位置)和SPC_BUTTONS.xlam!EXPORTSPC和其中一个仍然以“C:/Networklocation.xlam”结尾!输出SPC'。。。即使在本地计算机上设置

问题是,昨天,当有人用他在网络上修改的另一组文件替换了更新的文件时,这种情况再次发生。这一次,我并不惊讶于它们没有连接(尽管很失望),但惊讶于将更新循环到EXPORTSPC的“我的代码”未能“接收”第二台计算机上的所有文件。实际上,只有少数几个文件会更改为EXPORTSPC,我最终不得不手动在最终计算机上为每个45.xls文件分配本地链接

真的,我不能继续做任何本地维修,因为它会造成机器停机

所以我的问题!有没有更好的方法来完成我想要完成的任务(.xls到附加模块)?你知道为什么移动这些文件会导致excel更改链接,迫使我在本地设置它们吗?为什么它突然只接受EXPORTSPC作为链接名?excel是否保存了宏/加载项/按钮的某种ID,而我不知道这些宏/加载项/按钮是意外损坏的

真的,任何一种见解都会有所帮助。谢谢

编辑:

我确实在循环代码中发现了一个错误,这影响了我在第二台计算机上遇到的问题。它在每个工作簿中循环并保存。。。但是在运行代码之前我没有激活工作簿,这非常重要(DOH!)。这只解决了我昨天遇到的手工编辑的问题

然而,再深入一点,我确实觉得我有了更好的理解。我使用下面的代码来确定我在“Assign Macro”中看到的内容是否与存储的.OnAction值匹配,而它不匹配。在我的计算机上测试此代码:

exportButton.OnAction = "'G:\NetworkLocation\SPC_BUTTONS.xlam!'EXPORTSPC" 
将导致“Assign Macro”更改为“EXPORTSPC”,即使正在调试

debug.print exportButton.OnAction
仍然显示原始的OnAction值。当我将文件移动到车间计算机时,“分配宏”将显示“G:\NetworkLocation\SPC\U BUTTONS.xlam!”EXPORTSPC,直到我单击它,然后它将切换到EXPORTSPC

因此,一旦Excel检测到正确的位置,它似乎会跟踪宏的位置。我交换了宏,它似乎断开了连接。我猜excel会在其内部链接断开后将位置修改为C:\。如果有人对此有任何详细说明/验证,我很乐意听到

我确实记得加载项按钮被随机取消选中,这可能是我调试工作时链接不断中断并恢复到c:\的原因之一。我也不确定是什么原因造成的。但如今,使用各种形式的出口似乎都奏效了。我仍然不相信我不会再看到它了,因为我不完全理解什么是未检查框和交换链接的催化剂

    If Not exportButton Is Nothing Then
        With exportButton
            .OnAction = "'SPC_BUTTONS.xlam'!EXPORTSPC"
            '.OnAction = "EXPORTSPC"
            '.OnAction = "'G:\NetworkLocation\SPC_BUTTONS.xlam'!EXPORTSPC"
        End With

        Debug.Print exportButton.OnAction
    End If
所以这个过程的某些部分看起来还是模糊的,但至少现在我知道如何更好地跟踪我所看到的

试试这个--限定外接程序文件名:

.OnAction=“SPC\u BUTTONS.xlam!EXPORTSPC”

我用网络驱动器上的XLAM和桌面上的XLS文件对此进行了测试。我已经将XLS文件复制到网络位置,它仍然有效。我还做了一个
SaveAs
,将XLS文件放在另一个网络驱动器上,操作仍在继续

当然,这需要用户的Excel实例启用外接程序

或者,尝试用单引号括起路径和文件名:

.OnAction=“'G:\NetworkLocation\SPC\u BUTTONS.xlam'!EXPORTSPC”


这个方法似乎保留了
OnAction
绝对路径。

实际上,这是我最初设置的,它已经工作了一段时间。但这已经不起作用了:(您如何知道链接正在更改?能否编辑您的问题以显示您是如何调试此链接的,以确定
操作
路径正在更改为,例如,
'g:\NetworkLocation\SPC\u BUTTONS.xlam!EXPORTSPC'
?请将其放入问题中,因为在注释中不容易阅读。我已添加了注释a。)bove和一个fe