Vba 如何解决“错误”问题;电子表格已锁定以进行编辑";问题
使用Office 2010套件,我有一个PowerPoint演示文稿,其中所有图表都链接到Excel工作簿。要将演示文稿和/或工作簿移动到另一个目录,必须更新所有链接以指向新工作簿位置。为此,我编写了以下代码,这些代码驻留在PowerPoint的标准代码模块中: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
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