如何分发 PowerPoint AddIn/PPAM 同时仍能更新
How to distribute PowerPoint AddIn/PPAM while still able to update
我已经开发了一个自定义的 PowerPoint 加载项,我正试图想出一个解决方案来以简单的方式分发它。
我最初的计划是将插件 (.ppam) 放在中央驱动器中,让用户从那里添加它,不幸的是,我似乎无法更新它,那就是在现有位置保存它的新副本,如果用户已打开它(尽管已将其设置为只读)。这可以通过如下脚本使用 Excel 插件来完成。
Sub DeployAddIn()
'Test
Dim strNewName As String
'Author : Ken Puls (www.excelguru.ca)
'Macro Purpose: To deploy finished/updated add-in to a network
' location as a read only file
Dim strAddinDevelopmentPath As String
Dim strAddinPublicPath As String
'Set development and public paths
strAddinDevelopmentPath = ThisWorkbook.Path & Application.PathSeparator
strAddinPublicPath = "C:\Public Path" & Application.PathSeparator
'Turn off alert regarding overwriting existing files
Application.DisplayAlerts = False
'Save the add-in
With ThisWorkbook
strNewName = Left(.Name, InStrRev(.Name, "-") - 1) & "." & Right(.Name, (Len(.Name) - InStrRev(.Name, ".")))
'Save to ensure work is okay in case of a crash
.Save
'Save read only copy to the network (remove read only property
'save the file and reapply the read only status)
On Error Resume Next
SetAttr strAddinPublicPath & strNewName, vbNormal
On Error GoTo 0
.SaveCopyAs FileName:=strAddinPublicPath & strNewName
SetAttr strAddinPublicPath & strNewName, vbReadOnly
End With
'Resume alerts
Application.DisplayAlerts = True
End Sub
有人对如何巧妙地分发 PowerPoint 插件有任何想法吗?
编辑:更新了解决方案
我最终使用了一个由两部分组成的插件,因为我不能确定允许用户访问 运行 EXE/MSI 文件。基本上我的构建就像
Const strCentralPath As String = Central path
Sub Auto_Open()
Dim objAddins As AddIns
Dim objAddIn As AddIn
Dim dblCurrentVersion As Double
Dim dblMyVersion As Double
Set objAddins = Application.AddIns
'Check if Addin is already added and loaded.
'If it is, check if version is same as local.
For Each objAddIn In objAddins
If objAddIn.Name = "Name of addin" Then
If objAddIn.Loaded = msoCTrue Then objAddIn.Loaded = msoCTrue
GoTo CheckVersion
End If
Next objAddIn
'If addin is not found add it
Call AddAddin
GoTo ExitLine
'Check version
CheckVersion:
dblCurrentVersion = Version(strCentralPath)
dblMyVersion = Version(local path)
If dblCurrentVersion > dblMyVersion Then
Application.AddIns(Name of addin).Loaded = msoFalse
Call AddAddin 'If version is lower, unload and add the the new one.
End If
ExitLine:
Set objAddins = Nothing
End Sub
Function Version(Path As String) As Double
Dim fso As Object
Dim dblDate As Integer
Set fso = CreateObject("scripting.filesystemobject")
intDate = CDbl(fso.GetFile(Path).DateCreated)
Version = intDate
Set fso = Nothing
End Function
Sub AddAddin()
Dim strAddInLocalPath As String
Dim strAddinCentralPath As String
Dim fso As Object
'Get local path
strAddInLocalPath = local path
Set fso = VBA.CreateObject("scripting.Filesystemobject")
DeleteFile strAddInLocalPath
Call fso.CopyFile(strCentralPath, strAddInLocalPath, True)
SetAttr strAddInLocalPath, vbReadOnly
With Application.AddIns.Add(strAddInLocalPath)
.Loaded = msoCTrue
End With
Set fso = Nothing
End Sub
Sub DeleteFile(ByVal FileToDelete As String)
If FileExists(FileToDelete) Then 'See above
SetAttr FileToDelete, vbNormal
Kill FileToDelete
End If
End Sub
Function FileExists(ByVal FileToTest As String) As Boolean
FileExists = (Dir(FileToTest) <> "")
End Function
我知道我很快需要面对同样的问题,并且一直在考虑两种选择。首先将加载项构建到 MSI 安装程序包中,我相信它可以自动管理此更新元素(我正在评估 the Advanced Installer solution)。其次,我想知道我是否可以构建一个包含两个加载项的体系结构,其中第一个加载项没有任何 UI,它的唯一目的是从远程位置下载主要的加载项。但是,我不认为有一种方法可以确定应用程序加载项的加载顺序(即使它似乎是按字母顺序排列的)。我想这就是你想要做的?
我不会尝试让多个用户加载同一个加载项文件。
如果用户可以双击 EXE 或 MSI 安装程序,这是分发更新的一种方式。由于提到了 Advanced Installer,我将补充说它会生成任何一个,并且是一个 非常 的工具,并且得到很好的支持。
另一种方法是让登录脚本将插件的当前版本从集中位置下载到每个用户的本地计算机。然后它会在用户启动PPT之前在系统上,所以没有冲突。
理论上,您可以安装插件 A,当它自动运行时,它会查看插件 B PPA/PPAM 文件的日期,如果有更新的版本 "Out There" ,将其复制到本地加载项文件夹。然后无论哪种方式,按需加载 Addin B,它完成真正的工作。当我认为以前的方法同样有效时,似乎要经历很多麻烦。
我已经开发了一个自定义的 PowerPoint 加载项,我正试图想出一个解决方案来以简单的方式分发它。
我最初的计划是将插件 (.ppam) 放在中央驱动器中,让用户从那里添加它,不幸的是,我似乎无法更新它,那就是在现有位置保存它的新副本,如果用户已打开它(尽管已将其设置为只读)。这可以通过如下脚本使用 Excel 插件来完成。
Sub DeployAddIn()
'Test
Dim strNewName As String
'Author : Ken Puls (www.excelguru.ca)
'Macro Purpose: To deploy finished/updated add-in to a network
' location as a read only file
Dim strAddinDevelopmentPath As String
Dim strAddinPublicPath As String
'Set development and public paths
strAddinDevelopmentPath = ThisWorkbook.Path & Application.PathSeparator
strAddinPublicPath = "C:\Public Path" & Application.PathSeparator
'Turn off alert regarding overwriting existing files
Application.DisplayAlerts = False
'Save the add-in
With ThisWorkbook
strNewName = Left(.Name, InStrRev(.Name, "-") - 1) & "." & Right(.Name, (Len(.Name) - InStrRev(.Name, ".")))
'Save to ensure work is okay in case of a crash
.Save
'Save read only copy to the network (remove read only property
'save the file and reapply the read only status)
On Error Resume Next
SetAttr strAddinPublicPath & strNewName, vbNormal
On Error GoTo 0
.SaveCopyAs FileName:=strAddinPublicPath & strNewName
SetAttr strAddinPublicPath & strNewName, vbReadOnly
End With
'Resume alerts
Application.DisplayAlerts = True
End Sub
有人对如何巧妙地分发 PowerPoint 插件有任何想法吗?
编辑:更新了解决方案
我最终使用了一个由两部分组成的插件,因为我不能确定允许用户访问 运行 EXE/MSI 文件。基本上我的构建就像
Const strCentralPath As String = Central path
Sub Auto_Open()
Dim objAddins As AddIns
Dim objAddIn As AddIn
Dim dblCurrentVersion As Double
Dim dblMyVersion As Double
Set objAddins = Application.AddIns
'Check if Addin is already added and loaded.
'If it is, check if version is same as local.
For Each objAddIn In objAddins
If objAddIn.Name = "Name of addin" Then
If objAddIn.Loaded = msoCTrue Then objAddIn.Loaded = msoCTrue
GoTo CheckVersion
End If
Next objAddIn
'If addin is not found add it
Call AddAddin
GoTo ExitLine
'Check version
CheckVersion:
dblCurrentVersion = Version(strCentralPath)
dblMyVersion = Version(local path)
If dblCurrentVersion > dblMyVersion Then
Application.AddIns(Name of addin).Loaded = msoFalse
Call AddAddin 'If version is lower, unload and add the the new one.
End If
ExitLine:
Set objAddins = Nothing
End Sub
Function Version(Path As String) As Double
Dim fso As Object
Dim dblDate As Integer
Set fso = CreateObject("scripting.filesystemobject")
intDate = CDbl(fso.GetFile(Path).DateCreated)
Version = intDate
Set fso = Nothing
End Function
Sub AddAddin()
Dim strAddInLocalPath As String
Dim strAddinCentralPath As String
Dim fso As Object
'Get local path
strAddInLocalPath = local path
Set fso = VBA.CreateObject("scripting.Filesystemobject")
DeleteFile strAddInLocalPath
Call fso.CopyFile(strCentralPath, strAddInLocalPath, True)
SetAttr strAddInLocalPath, vbReadOnly
With Application.AddIns.Add(strAddInLocalPath)
.Loaded = msoCTrue
End With
Set fso = Nothing
End Sub
Sub DeleteFile(ByVal FileToDelete As String)
If FileExists(FileToDelete) Then 'See above
SetAttr FileToDelete, vbNormal
Kill FileToDelete
End If
End Sub
Function FileExists(ByVal FileToTest As String) As Boolean
FileExists = (Dir(FileToTest) <> "")
End Function
我知道我很快需要面对同样的问题,并且一直在考虑两种选择。首先将加载项构建到 MSI 安装程序包中,我相信它可以自动管理此更新元素(我正在评估 the Advanced Installer solution)。其次,我想知道我是否可以构建一个包含两个加载项的体系结构,其中第一个加载项没有任何 UI,它的唯一目的是从远程位置下载主要的加载项。但是,我不认为有一种方法可以确定应用程序加载项的加载顺序(即使它似乎是按字母顺序排列的)。我想这就是你想要做的?
我不会尝试让多个用户加载同一个加载项文件。
如果用户可以双击 EXE 或 MSI 安装程序,这是分发更新的一种方式。由于提到了 Advanced Installer,我将补充说它会生成任何一个,并且是一个 非常 的工具,并且得到很好的支持。
另一种方法是让登录脚本将插件的当前版本从集中位置下载到每个用户的本地计算机。然后它会在用户启动PPT之前在系统上,所以没有冲突。
理论上,您可以安装插件 A,当它自动运行时,它会查看插件 B PPA/PPAM 文件的日期,如果有更新的版本 "Out There" ,将其复制到本地加载项文件夹。然后无论哪种方式,按需加载 Addin B,它完成真正的工作。当我认为以前的方法同样有效时,似乎要经历很多麻烦。