使用VBA自动将VBProject引用添加到PowerPoint库,具体取决于运行的Office版本PC

Shai Rado

简介:我有一个VBA应用程序,大约有5000行,可以在Excel中处理数据,构建自动图表,然后将图表从每个工作表导出到不同的PowerPoint幻灯片。在过去的5个月中,这在许多运行此代码的计算机上都可以正常工作。

问题:我组织中的某些PC已从Office 2010升级到Office 2013和Office2016。在我的代码中,我正在PowerPoint处理上使用Early Binding,这导致错误,因为VB项目的引用已从“ Microsoft PowerPoint 14.0对象库”到“ Microsoft PowerPoint 15.0对象库”。

目标:如何根据运行我的代码的PC的PowerPoint版本,通过代码自动更改引用?

状态:我当前的代码能够遍历所有已启用的VBProject引用,检查其中是否有“缺少”的内容,并删除它们以避免出现错误消息。我还可以通过代码添加PowerPoint 14.0库。

我的问题:当PowerPoint不运行时,如何根据运行此代码的当前用户的PC上运行的PowerPoint添加PowerPoint库?不运行PC时,如何阅读安装在PC上的PowerPoint版本?

另外,如果您在不同的Windows版本上运行PC,“ Microsoft PowerPoint 15.0对象库”和“ Microsoft PowerPoint 16.0对象库”以及其他版本的文件夹位置是否会更改?Win7 32位不同于Win10 32位并不同于Win10 64-但是

“奖金”问题:我无法在网上任何地方找到图表(或列表)来存储“ MSPPT.OLB”文件的文件夹位置,不同的操作系统和不同的Office版本的所有数据。


我当前的代码

Option Explicit

Sub RemoveMissingReferences_AddReference()

'    display Windows Version installed on this PC
'    Win7.      (=6.1, 64bit)
'    Win8       (=6.2, 64bit)
'    Win8.1     (=6.3*)
'    Win10      (=10.0*)
'
MsgBox "Windows Version is: " & getVersion
MsgBox "Excel Version is: " & Application.Version

Dim theRef As Variant, i As Long
Dim ProjRef() As String

ReDim ProjRef(1 To ThisWorkbook.VBProject.References.count)
'Remove any missing references
For i = ThisWorkbook.VBProject.References.count To 1 Step -1
    Set theRef = ThisWorkbook.VBProject.References.Item(i)
    ProjRef(i) = theRef.FullPath ' read path to string array , will use it later

    ' if reference is "Missing" >> remove it to avoid error message
    If theRef.isbroken = True Then
        ThisWorkbook.VBProject.References.Remove theRef
    End If
Next i

' add a Reference to PowerPoint , according to version running on the PC
Dim NewRef_FullPath As String
NewRef_FullPath = "C:\Program Files (x86)\Microsoft Office\Office14\MSPPT.OLB" ' Add PowerPoint 2010 Windows 7-32Bit

' loop through all existing references and check if new requested reference already checked
For i = 1 To UBound(ProjRef)
    If InStr(1, ProjRef(i), NewRef_FullPath) > 0 Then  ' reference already installed on PC >> pevious code runs
        MsgBox "New Ref already installed"
        Exit Sub
    End If
Next i

On Error GoTo CanNotAddPowerPoint
Application.VBE.ActiveVBProject.References.AddFromFile NewRef_FullPath  'try to add a reference to PowerPoint
MsgBox "New Ref successfully installed"

Exit Sub
CanNotAddPowerPoint:
MsgBox "Can not reference PowerPoint"

End Sub
共产国际

在我看来,您可以使用Windows Installer对象来执行此操作-它使您几乎可以访问在MSI安装程序中注册的所有内容的信息。

第一步是找到Office安装信息。不幸的是,这是String基于的,因此您需要过滤输出。我使用了一个简单的Like比较,以匹配Office版本(专业版,家庭版等)。那是唯一可能需要调整的东西。请注意,尽管您可以尽早绑定到Microsoft Windows Installer对象库,但是除了初始开发以外,它对于其他任何事情都是毫无意义的-您不能使用WindowsInstaller.Installerwith创建一个Set whatever = New WindowsInstaller.Installer您必须使用CreateObject

Private Function FindPowerPointPath() As String
    With CreateObject("WindowsInstaller.Installer")
        Dim prod As Variant
        For Each prod In .Products
            Dim id As String
            id = .ProductInfo(prod, "ProductName")
            If id Like "Microsoft Office * ####" Then
                Dim location As String
                location = FindPowerPointLibrary(.ProductInfo(prod, "InstallLocation"))
                If location <> vbNullString Then
                    FindPowerPointPath = location
                    Exit Function
                End If
            End If
        Next
    End With
End Function

第二步非常简单-只需递归安装目录的子目录,直到找到MSPPT.OLB:

Private Function FindPowerPointLibrary(startPath As String) As String
    With New Scripting.FileSystemObject
        Dim cwd As Scripting.Folder
        Set cwd = .GetFolder(startPath)
        Dim test As String
        test = .BuildPath(startPath, "MSPPT.OLB")
        If .FileExists(test) Then
            FindPowerPointLibrary = test
            Exit Function
        End If
        Dim subdir As Scripting.Folder
        For Each subdir In cwd.SubFolders
            Dim found As String
            found = FindPowerPointLibrary(subdir.Path)
            If found <> vbNullString Then
                FindPowerPointLibrary = found
                Exit Function
            End If
        Next
    End With
End Function

这适用于任何Windows版本(XP或更高版本?)。请注意,这当前仅返回找到的第一个实例。如果你担心多个Office版本安装的可能性,你应该能够正好验证返回路径包含Office##其中##的主要版本匹配Application.Version

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将元素添加到文档OR元素,具体取决于不为null

来自分类Dev

将列添加到PySpark DataFrame中,具体取决于列值是否在另一列中

来自分类Dev

使用发布或快照存储库进行手动部署,具体取决于项目版本

来自分类Dev

Symfony 2 Forms-将新项目添加到Collection服务器端,具体取决于单击的按钮

来自分类Dev

Prestashop:禁用添加到购物车按钮,具体取决于用户组和产品

来自分类Dev

如何使用VBA将文本框添加到PowerPoint演示文稿

来自分类Dev

BooleanProperty,其值取决于是否将节点添加到场景中

来自分类Dev

如何使用外部SQL查询将项目版本添加到jira数据库

来自分类Dev

如何使用外部SQL查询将项目版本添加到jira数据库

来自分类Dev

有什么方法可以在运行时使用Entity Framework Core(代码优先)将旧版本模型实例添加到数据库中吗?

来自分类Dev

需要“添加到购物车”按钮价格来更新正确的金额,具体取决于选中的复选框

来自分类Dev

Shell脚本:将“通过键入q退出”添加到while大小写已经取决于if的情况下

来自分类Dev

使用引用将元素添加到数组

来自分类Dev

使用引用将NOT NULL列添加到SQLite表

来自分类Dev

如何使用代码将引用添加到多值ReferenceField?

来自分类Dev

在VBA powerpoint中如何将新幻灯片添加到空白演示文稿

来自分类Dev

VBA-PowerPoint宏-将文本框内容添加到大纲视图

来自分类Dev

VBA-PowerPoint宏-将文本框内容添加到大纲视图

来自分类Dev

使用.htaccess透明地管理网站的版本,具体取决于扩展名

来自分类Dev

使用.htaccess透明地管理网站的版本,具体取决于扩展名

来自分类Dev

将子视图添加到UITextView并使用自动布局

来自分类Dev

将DisplayPort输出添加到PC

来自分类Dev

是否使用VPN自动浏览Internet,具体取决于URL是否在黑名单中

来自分类Dev

如何在运行时使用VBA将按钮添加到MS Access表单并将代码添加到_Click()事件

来自分类Dev

将jar添加到无法使用redis的库中

来自分类Dev

将jar添加到无法使用redis的库中

来自分类Dev

使用cmake将Eigen库添加到C ++项目

来自分类Dev

使用代码将符号从库添加到舞台

来自分类Dev

将数据添加到数据库并使用JSON

Related 相关文章

  1. 1

    将元素添加到文档OR元素,具体取决于不为null

  2. 2

    将列添加到PySpark DataFrame中,具体取决于列值是否在另一列中

  3. 3

    使用发布或快照存储库进行手动部署,具体取决于项目版本

  4. 4

    Symfony 2 Forms-将新项目添加到Collection服务器端,具体取决于单击的按钮

  5. 5

    Prestashop:禁用添加到购物车按钮,具体取决于用户组和产品

  6. 6

    如何使用VBA将文本框添加到PowerPoint演示文稿

  7. 7

    BooleanProperty,其值取决于是否将节点添加到场景中

  8. 8

    如何使用外部SQL查询将项目版本添加到jira数据库

  9. 9

    如何使用外部SQL查询将项目版本添加到jira数据库

  10. 10

    有什么方法可以在运行时使用Entity Framework Core(代码优先)将旧版本模型实例添加到数据库中吗?

  11. 11

    需要“添加到购物车”按钮价格来更新正确的金额,具体取决于选中的复选框

  12. 12

    Shell脚本:将“通过键入q退出”添加到while大小写已经取决于if的情况下

  13. 13

    使用引用将元素添加到数组

  14. 14

    使用引用将NOT NULL列添加到SQLite表

  15. 15

    如何使用代码将引用添加到多值ReferenceField?

  16. 16

    在VBA powerpoint中如何将新幻灯片添加到空白演示文稿

  17. 17

    VBA-PowerPoint宏-将文本框内容添加到大纲视图

  18. 18

    VBA-PowerPoint宏-将文本框内容添加到大纲视图

  19. 19

    使用.htaccess透明地管理网站的版本,具体取决于扩展名

  20. 20

    使用.htaccess透明地管理网站的版本,具体取决于扩展名

  21. 21

    将子视图添加到UITextView并使用自动布局

  22. 22

    将DisplayPort输出添加到PC

  23. 23

    是否使用VPN自动浏览Internet,具体取决于URL是否在黑名单中

  24. 24

    如何在运行时使用VBA将按钮添加到MS Access表单并将代码添加到_Click()事件

  25. 25

    将jar添加到无法使用redis的库中

  26. 26

    将jar添加到无法使用redis的库中

  27. 27

    使用cmake将Eigen库添加到C ++项目

  28. 28

    使用代码将符号从库添加到舞台

  29. 29

    将数据添加到数据库并使用JSON

热门标签

归档