【问题标题】:Deploying Macros as Add Ins with Custom Ribbon Buttons to the entire office将宏作为带有自定义功能区按钮的插件部署到整个办公室
【发布时间】:2019-05-15 19:41:53
【问题描述】:

我一直在寻找一种以最简单的方式将宏分发给我的技术文盲办公室的方法。

根据我的研究,将宏保存到 .xlam 加载项似乎是朝着正确的方向发展。

是否也可以以这种方式设置自定义功能区选项卡?

到目前为止,我还没有找到任何指南,而且我们的办公室保安也可能会阻止某些途径。

编辑: 使用 W-Hit 的出色解决方案,并按照指示设置文件夹结构,它肯定有助于使用 DeployAddIn 子例程更轻松地部署更新。

我还发现将 DeployAddIn 和 InstallAddin 子例程放入它们自己的自定义功能区选项卡中很有用!

我在使用 InstallAddin 子例程时遇到了一个问题:如何在 VBA 中格式化 XML 文本而不会遇到语法错误。

我发现每个元素的开头都必须有 mso,例如<button> becomes <mso:button> 并且一行中的每个“语音标记部分”必须有“双语音标记”。

也许使用此安装功能最简单的方法是将代码保存并编辑到一个活动文件中,然后在 Notepad++ 中打开 C:\Users[用户名]\AppData\Local\Microsoft\Office\Excel.officeUI。然后只需执行查找和替换以添加额外的引号并将其粘贴到代码的ribbonXML = "insert your text here" 部分,确保它被最终语音标记封装以将整个部分标记为文本字符串.

我可能还会考虑在此处添加额外的功能...有一个输入框或用户表单,允许您在此时粘贴代码,而不是让您输入 VBA 编辑器来粘贴它。

【问题讨论】:

  • This link 非常有用。您也可以直接分发到文件或加载项中。我最近都用过。
  • 我之前尝试过...它将自定义功能区应用到特定工作簿,下一步是将此工作簿保存为 .xlam 以在项目级别应用功能区(如果我'没看错)?
  • 您可以创建.xlam 并以这种方式自定义功能区。然后,您必须将加载项部署给希望使用它的用户。过去,我通过将加载项保存到共享位置并编写有关如何连接到它或在新版本发布时更新它的说明来做到这一点。
  • 我一定要试试这个!干杯老兄!

标签: excel vba


【解决方案1】:

我目前正在这样做,这是一个有点深入的设置过程,但一旦完成就可以顺利运行。

第一步是创建一个文件夹结构,其中包含您作为管理员的 .xlam 文件的测试和生产副本。

2nd,在生产文件夹中,右键单击所有.xlam文件并将属性中的属性设置为只读。否则,如果有其他人在其中,您将永远无法更新插件。

3、当您对测试文件中的代码进行更新时,只需将生产文件替换为更新文件,并再次更改为只读。用户只需关闭所有 excel 实例并重新打开即可获得最新的加载项副本。

以下是我用来将测试文件移至生产环境的管理插件。

Sub DeployAddIn()
'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
    Dim FSO As New FileSystemObject

    'Set development path
    ChDrive "R:"
    ChDir "R:\addins\PROJECTS"
    strAddinDevelopmentPath = Application.GetOpenFilename()
    If strAddinDevelopmentPath = "False" Then
        Exit Sub
    ElseIf InStr(strAddinDevelopmentPath, "\PRODUCTION\") > 1 Then
        If MsgBox("You've Selected a Production File To Replace a Production File. Would You Like To Continue Anyway?", vbYesNo) = vbNo Then
            Exit Sub
        End If
    End If

    'Get Desitination path
    strAddinPublicPath = Replace(strAddinDevelopmentPath, "TESTING", "PRODUCTION")

    'Create dir if it doesn't exist
    On Error Resume Next
    MkDir Left(strAddinPublicPath, InStrRev(strAddinPublicPath, "\") - 1)
    On Error GoTo 0

    'Turn off alert regarding overwriting existing files
    Application.DisplayAlerts = False

    'overwrite existing file
    On Error Resume Next
    SetAttr strAddinPublicPath, vbNormal
    On Error GoTo 0
    FSO.CopyFile strAddinDevelopmentPath, strAddinPublicPath, True
    SetAttr strAddinPublicPath, vbReadOnly

    'Resume alerts
    Application.DisplayAlerts = True
End Sub

第四,我还编写了一个宏来更改自定义功能区。下面的链接,另外 Ron deBruin 的网站也很有用。 https://grishagin.com/vba/2017/01/11/automatic-excel-addin-installation.html 从 officeUI 文件中获取正确文本后自动安装插件的代码

Sub InstallAddin()
    'Adapted from https://grishagin.com/vba/2017/01/11/automatic-excel-addin-installation.html
    Dim eai As Excel.AddIn
    Dim alreadyinstalled As Boolean
    Dim ribbonXML As String

    'check if already installed
    For Each eai In Application.AddIns
        If eai.Name = "Main addin.xlam" Then
            eai.Installed = False
            Exit For
        End If
    Next

    'add and install the addin
    Set eai = Application.AddIns.Add("path to Main addin.xlam", False)
    eai.Installed = True

    'append quick access ribbon xml to add button
    ClearCustRibbon
    LoadNewRibbon

    'have to close addin for it to load properly the first time
    Workbooks("Main addin.xlam").Close

End Sub

Sub ClearCustRibbon()
'https://social.msdn.microsoft.com/Forums/vstudio/en-US/abddbdc1-7a24-4664-a6ff-170d787baa5b/qat-changes-lost-when-using-xml-to-modify-ribbon-excel-2016-2016?forum=exceldev
Dim hFile As Long
Dim ribbonXMLString As String

hFile = FreeFile
OfficeUIFilePath = Environ("USERPROFILE") & "\AppData\Local\Microsoft\Office\Excel.officeUI"

ribbonXMLString = "<mso:customUI           xmlns:mso=""http://schemas.microsoft.com/office/2009/07/customui"">" & _
"<mso:ribbon>" & _
"<mso:qat>" & _
"<mso:sharedControls>" & _
"</mso:sharedControls>" & _
"</mso:qat>" & _
"</mso:ribbon>" & _
"</mso:customUI>"

Open OfficeUIFilePath For Output Access Write As hFile
Print #hFile, ribbonXMLString
Close hFile

End Sub

Sub LoadNewRibbon()
Dim hFile As Long

hFile = FreeFile
OfficeUIFilePath = Environ("USERPROFILE") & "\AppData\Local\Microsoft\Office\Excel.officeUI"

ribbonXML = "your ribbon text here"

Open OfficeUIFilePath For Output Access Write As hFile
Print #hFile, ribbonXML
Close hFile
End Sub

***重要---- 如果您手动安装插件,请确保在提示您是否要将文件保存到本地计算机时选择否。如果您将其保存到本地计算机,它会创建一个本地副本,并且如果您对网络副本进行更改或需要修复错误,它将永远不会更新。

还有更多提示,但您主要需要调整它们以适应您的操作方式。希望对您有所帮助。

【讨论】:

  • 终于开始研究这个了,我相信我遵循了所有这些,看起来棒极了!你是天赐之物!
  • 啊,现在我遇到了这个问题...在 LoanNewRibbon 部分,我认为“您的功能区文本在这里”将替换为 XML 代码,并且每一行都以“
  • 在您手动设置功能区后,最简单的方法是转到 OfficeUIFilePath,然后只需复制 xml 并将其粘贴到您的代码中。
猜你喜欢
  • 2013-08-24
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多