Vba 如何解决“错误”问题;电子表格已锁定以进行编辑";问题

Vba 如何解决“错误”问题;电子表格已锁定以进行编辑";问题,vba,excel,powerpoint,Vba,Excel,Powerpoint,使用Office 2010套件,我有一个PowerPoint演示文稿,其中所有图表都链接到Excel工作簿。要将演示文稿和/或工作簿移动到另一个目录,必须更新所有链接以指向新工作簿位置。为此,我编写了以下代码,这些代码驻留在PowerPoint的标准代码模块中: Private Sub RedirectLinks() Dim Source As String Dim Dest As String Dim Action As Integer If InStr(1, ActiveP

使用Office 2010套件,我有一个PowerPoint演示文稿,其中所有图表都链接到Excel工作簿。要将演示文稿和/或工作簿移动到另一个目录,必须更新所有链接以指向新工作簿位置。为此,我编写了以下代码,这些代码驻留在PowerPoint的标准代码模块中:

Private Sub RedirectLinks()

  Dim Source As String
  Dim Dest As String
  Dim Action As Integer
  If InStr(1, ActivePresentation.Path, "Dev\") > 1 Then
    Action = MsgBox("Changing pointers to PRODUCTION", vbOKCancel)
    Source = "Dev\"
    Dest = vbNull
  Else
    Action = MsgBox("Changing pointers to DEVELOPMENT", vbOKCancel)
    Source = "Templates\"
    Dest = "Dev\Templates\"
  End If

  If Action = vbOK Then
    Dim SL As Slide
    Dim SH As Shape
    Dim Top As Double
    Dim Left As Double
    Dim Width As Double
    Dim Height As Double
    For Each SL In ActivePresentation.Slides
      SL.Select
      For Each SH In SL.Shapes
        SH.Select
        If SH.Type = msoLinkedOLEObject Then                                 'when we find a linked one
          Top = SH.Top
          Left = SH.Left
          Width = SH.Width
          Height = SH.Height
          SH.LinkFormat.SourceFullName = Replace(SH.LinkFormat.SourceFullName, Source, Dest)
          SH.Top = Top
          SH.Left = Left
          SH.Height = Height
          SH.Width = Width
        End If
      Next
    Next
  End If

  If InStr(1, Dest, "dev") > 0 Then
    Action = MsgBox("About to OVER WRITE the Dev copy with this one." & vbCrLf & "Click 'Cancel' to prevent this and save manually", vbOKCancel, "OVER WRITE WARNING!!")
  Else
    Action = MsgBox("About to OVER WRITE the PRODUCTION copy with this one." & vbCrLf & "Click 'Cancel' to prevent this and save manually", vbOKCancel, "OVER WRITE WARNING!!")
  End If

  If Action = vbOK Then
    ActivePresentation.SaveAs Replace(ActivePresentation.Path, Source, Dest) & ActivePresentation.Name
  End If

End Sub
代码执行得很好,但是,当它执行
SH.LinkFormat.SourceFullName=Replace(SH.LinkFormat.SourceFullName,Source,Dest)
行时,我经常从Excel中弹出这个消息框

注意事项:

  • 有问题的工作簿实际上是关闭的——我知道它不会被其他人打开(我是唯一一个经常使用它的人,而在那里的另一个人今天早上不在办公室)
  • 它声称文件被另一个用户锁定,而这个用户实际上是我。我通常可以通过关闭工作簿,然后立即重新打开它来获得此警告。我不知道这是否是网络延迟问题(文件驻留在服务器上,而不是本地),或者是什么,但在使用工作簿几分钟后,我会收到
    工作簿现在可用于读写的消息
  • 我并不是每次它尝试执行设置
    .SourceFullName
    的行时都收到此警告。有时我会得到它的大部分时间,有时我根本不会得到它,有时我会偶尔得到它
  • 尽管我有网络延迟的想法,但不管我调试代码的速度有多快或多慢,我都会在随机时间收到此消息
  • 在操作系统级别将新的或旧的工作簿标记为
    只读
    ,似乎并不能改善这种情况。
    • 但是,标记这两个行似乎会为每次执行替换行得到2个警告

  • 有人对如何解决这个问题有什么建议吗?

    当PPT中的代码打开PPTM时,我遇到了奇怪的行为,我的宏安全设置比“打开任何愚蠢的东西”更严格。试着在PPT和Excel中尽可能低地拨宏安全性,就像测试一样,看看这是否能消除问题


    如果有人知道一种动态设置安全选项并在之后重置它们的方法,那就更好了。在执行任何调用XL的操作之前,可以通过注册表执行此操作

    您确定没有用自己的代码多次打开电子表格吗?您可以通过将文件复制到自己的处理位置并对其进行处理来进行检查-这将隔离文件。我发布的是完整的代码。我从来没有真正用代码打开工作簿。PowerPoint以某种方式打开工作簿,读取PPT中的链接并将其指向新位置的新工作簿。我能想到的唯一额外的事情是,它实际上在打开新位置时出错,因此它可以确保链接到的对象在那里,并从中刷新图表。在用户等方面,新工作簿与旧工作簿存在相同的情况。如果在该行之前使用
    Application.DisplayAlerts=ppAlertsNone
    ,会发生什么?好主意,@SiddharthRout!遗憾的是,这没有帮助。@SiddharthRout,这促使我
    将XL设置为新的Excel.Application
    ,然后是
    XL.DisplayAlerts=False
    ,这也没用。建议不错,Steve。通过一些额外的播放,我发现将
    宏设置
    保留在
    禁用带有通知的所有宏
    ,但检查对VBA项目对象模型的
    信任访问似乎可以抑制所有这些恼人的弹出窗口,并且不会使宏安全性完全打开。我在PPT和XLS中都做了这些更改,但我不确定是否只有一个或另一个就足够了。
    如果有人知道如何动态设置安全选项并在之后重置它们,那就更好了。在做任何调用XL的事情之前,可以通过注册表来实现这一点。
    我还没有做任何挖掘,但我敢打赌这在VBA中是不可能的,否则它会使安全设置变得有点毫无意义——恶意代码一旦被允许,可能会为任何其他恶意代码打开大门。当然,将我的网络位置作为受信任的位置可能会有所帮助,因此我不会收到关于内部创建项目的宏的警告弹出窗口…@FreeMan,谢谢你提到这一点,我想知道受信任的位置是否会有所帮助。你是对的,你不能在应用程序内更改安全设置,但至少直到最近,只要PPT还没有运行,PPT的安全设置很容易被任何其他应用程序更改。它被巧妙地隐藏在注册表中一个名为“安全”的键下。鬼鬼祟祟的,嗯?如果XL有同样愚蠢的东西,PPT例程可以在进行任何更新之前修改注册表,从而启动Excel,然后将注册表设置回原来的状态。我找不到任何明显的XL tho