【问题标题】:Package Outlook VBA Macro with Custom Button on ribbon使用功能区上的自定义按钮打包 Outlook VBA 宏
【发布时间】:2018-11-28 05:11:17
【问题描述】:

我在 Outlook 上有一个 VBA 宏,它允许我将电子邮件作为附件转发到不同的电子邮件地址。我自定义了 Outlook 功能区并创建了一个链接到此宏的按钮。我将如何打包这个项目(宏和功能区按钮),以便我可以将它提供给其他用户安装在他们的机器上?

谢谢,

【问题讨论】:

    标签: vba outlook office365 outlook-addin


    【解决方案1】:

    我认为您可以以编程方式进行。我有一个共享 Excel 宏/功能区的过程,您可以尝试为 Outlook 修改它。我很好奇它是否同样有效,因为我最终也想分享我的 Outlook 宏。用户所要做的就是运行一个批处理文件。有几个组件:

    1. 在共享目录中创建一个文件夹,您可以在其中存储您的个人宏和功能区。

    2. 从本地文件夹复制宏。对于 Excel,我从 C:\Users\username\AppData\Roaming\Microsoft\Excel\XLSTART 复制了我存储宏的个人 Excel 文件。对于 Outlook,我假设您会使用 C:\Users\username\AppData\Roaming\Microsoft\Outlook 中的 VbaProject.OPM 文件。

    3. 从本地文件夹复制 UI 文件(功能区):C:\Users\username\AppData\Local\Microsoft\Office。 Excel 功能区名为 Excel.officeUI,我假设 Outlook 功能区是名为 olkexplorer.officeUI 的文件。

    4. 创建您的批处理文件,该文件会将宏和 UI 从共享目录复制到用户的本地驱动器。然后它将调用一个 VBS 文件,该文件将稍微修改 UI 文件,将出现的用户名替换为用户的用户名。我是批处理文件的新手,不知道如何在代码中插入 cmets,但您应该修改第一个路径(使用上面存储 Outlook OPM 文件的路径),以及宏文件的名称和UI 文件(VbaProject.OPM 和 olkexplorer.officeUI)。

       Echo off
       cls
       Echo Please ensure that Excel(Outlook) is closed before continuing.
       pause     
       cls
      
       cd YourSharedDirectory
       copy PERSONAL.XLSB c:\users\%USERNAME%\AppData\Roaming\Microsoft\Excel\XLSTART\*.* /y
       cls
      
       cd YourSharedDirectory
       copy Excel.officeUI C:\Users\%USERNAME%\AppData\Local\Microsoft\Office\*.* /y
       cls
      
       @echo off
       wscript "findReplaceUserNameinUI.vbs"
      
    5. 创建一个 VBS 文件(您在批处理文件的末尾运行)以在 UI 文件中找到您的用户名并将其替换为下载宏的人的用户名,否则它将无法在他们的计算机上运行.

      Const ForReading = 1
      Const ForWriting = 2
      
      'get username
      username= CreateObject("WScript.Network").UserName
      
      'change this to the local location for outlook UI
      uiPath = "C:\Users\" & username & "\AppData\Local\Microsoft\Office\Excel.officeUI"
      
      'open the UI file in notepad, find & replace with new username
      Set objFSO = CreateObject("Scripting.FileSystemObject")
      Set objFile = objFSO.OpenTextFile(uiPath, ForReading)
      strText = objFile.ReadAll
      objFile.Close
      strNewText = Replace(strText, "your user name", username)
      Set objFile = objFSO.OpenTextFile(uiPath, ForWriting)
      objFile.WriteLine strNewText 
      objFile.close
      
      msgbox "Completed!"
      

    【讨论】:

    • 我对 Excel 做同样的事情,效果很好,办公室里的每个人都会收到我的更新,因为批处理文件在他们的启动中,我想弄清楚如何为 Outlook 做这件事,但是它看起来并不容易。这是我的做法,相同的想法,不同的批处理代码。 freesoftwareservers.com/display/FREES/…
    【解决方案2】:

    Outlook 宏不能在 Excel 等中分发。您应该使用 Office 工具在 .NET Framework 中构建加载项。

    这是一个介绍:https://docs.microsoft.com/en-us/outlook/add-ins/quick-start?tabs=visual-studio

    如果您仍想导出宏,有一些解决方法:

    解决方案 1

    您可以将模块导出为 .bas、.cls、frx 和 .frm 文件。其他用户必须通过导入来反转该过程。

    使用此方法,用户不会丢失任何代码。

    但是

    导入 ThisOutlookSession 模块时,将重命名为 ThisOutlookSession1。您必须从此处复制代码并将其粘贴到 ThisOutlookSession 中,否则它将无法运行。

    解决方案 2

    如果用户的 Outlook 中没有任何宏项目,您可以复制(假设 Outlook 上只有此宏)您可以在 %AppData%\Microsoft\Outlook 中找到的 VBAProject.OTM 并覆盖用户是它的一员。

    最后一种方法是我必须共享宏时使用的方法。但如果我知道它会是这样一个******,我会立即使用 VB.NET。还有其他解决方案,但我从未尝试过。

    【讨论】:

    • 您好,谢谢。唯一的问题是我必须自己在功能区上创建按钮,然后将宏链接到它。有没有办法在代码中实现这一点,以便在我分发给用户时将按钮添加到功能区。
    • 我目前正在做这个,如果我找到解决方案,我会告诉你。
    • 查看 Roi-Kyi Bryant 在这篇文章中的回答:stackoverflow.com/questions/8850836/… 您可以在打开工作簿时加载自定义功能区。此方法的缺点是您将丢失功能区上以前的任何自定义设置。
    【解决方案3】:

    VBA 宏不适用于在其他/多台机器上分发解决方案。此外,VBA 宏不允许以编程方式自定义 Fluent UI(又名 Ribbon UI)。由于这些原因,您需要开发基于 COM 的加载项。那是因为他们被发明了!请参阅Walkthrough: Create your first VSTO Add-in for Outlook 快速入门。

    您可以在以下系列文章中阅读有关 Fluent UI(又名 Ribbon UI)的更多信息:

    VSTO 提供了两种创建自定义功能区 UI 的主要方法:

    如果您仍想共享您的 VBA 宏,请参阅To distribute Microsoft Outlook VBA code to other users 了解可能的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多