【发布时间】:2018-11-28 05:11:17
【问题描述】:
我在 Outlook 上有一个 VBA 宏,它允许我将电子邮件作为附件转发到不同的电子邮件地址。我自定义了 Outlook 功能区并创建了一个链接到此宏的按钮。我将如何打包这个项目(宏和功能区按钮),以便我可以将它提供给其他用户安装在他们的机器上?
谢谢,
【问题讨论】:
标签: vba outlook office365 outlook-addin
我在 Outlook 上有一个 VBA 宏,它允许我将电子邮件作为附件转发到不同的电子邮件地址。我自定义了 Outlook 功能区并创建了一个链接到此宏的按钮。我将如何打包这个项目(宏和功能区按钮),以便我可以将它提供给其他用户安装在他们的机器上?
谢谢,
【问题讨论】:
标签: vba outlook office365 outlook-addin
我认为您可以以编程方式进行。我有一个共享 Excel 宏/功能区的过程,您可以尝试为 Outlook 修改它。我很好奇它是否同样有效,因为我最终也想分享我的 Outlook 宏。用户所要做的就是运行一个批处理文件。有几个组件:
在共享目录中创建一个文件夹,您可以在其中存储您的个人宏和功能区。
从本地文件夹复制宏。对于 Excel,我从 C:\Users\username\AppData\Roaming\Microsoft\Excel\XLSTART 复制了我存储宏的个人 Excel 文件。对于 Outlook,我假设您会使用 C:\Users\username\AppData\Roaming\Microsoft\Outlook 中的 VbaProject.OPM 文件。
从本地文件夹复制 UI 文件(功能区):C:\Users\username\AppData\Local\Microsoft\Office。 Excel 功能区名为 Excel.officeUI,我假设 Outlook 功能区是名为 olkexplorer.officeUI 的文件。
创建您的批处理文件,该文件会将宏和 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"
创建一个 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!"
【讨论】:
Outlook 宏不能在 Excel 等中分发。您应该使用 Office 工具在 .NET Framework 中构建加载项。
这是一个介绍:https://docs.microsoft.com/en-us/outlook/add-ins/quick-start?tabs=visual-studio
如果您仍想导出宏,有一些解决方法:
您可以将模块导出为 .bas、.cls、frx 和 .frm 文件。其他用户必须通过导入来反转该过程。
使用此方法,用户不会丢失任何代码。
但是
导入 ThisOutlookSession 模块时,将重命名为 ThisOutlookSession1。您必须从此处复制代码并将其粘贴到 ThisOutlookSession 中,否则它将无法运行。
如果用户的 Outlook 中没有任何宏项目,您可以复制(假设 Outlook 上只有此宏)您可以在 %AppData%\Microsoft\Outlook 中找到的 VBAProject.OTM 并覆盖用户是它的一员。
最后一种方法是我必须共享宏时使用的方法。但如果我知道它会是这样一个******,我会立即使用 VB.NET。还有其他解决方案,但我从未尝试过。
【讨论】:
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 了解可能的解决方案。
【讨论】: