excel - 将宏作为带有自定义功能区按钮的插件部署到整个办公室
问题描述
我一直在寻找一种以最简单的方式将宏分发给我的技术文盲办公室的方法。
根据我的研究,将宏保存到 .xlam 插件中似乎是朝着正确的方向发展。
是否也可以以这种方式设置自定义功能区选项卡?
到目前为止,我还没有找到任何指南,我们的办公室安全也可能会阻止某些途径。
编辑:使用 W-Hit 的出色解决方案,并按照指示设置文件夹结构,它肯定有助于使用 DeployAddIn 子例程更轻松地部署更新。
我还发现将 DeployAddIn 和 InstallAddin 子例程放入它们自己的自定义功能区选项卡中很有用!
然而,我遇到了 InstallAddin 子例程的问题:如何在 VBA 中格式化 XML 文本而不会遇到语法错误。
我发现每个元素在开始时必须有 mso,例如<button> becomes <mso:button>
,一行中的每个“语音标记部分”必须有“双语音标记”。
使用此安装功能的最简单方法可能是将代码保存并编辑到活动文件中,然后在 Notepad++ 中打开 C:\Users[username]\AppData\Local\Microsoft\Office\Excel.officeUI。然后只需执行查找和替换以添加额外的引号并将其粘贴到代码的ribbonXML = "insert your text here" 部分,确保它被最终语音标记封装以将整个部分标记为文本字符串.
我也可能会考虑在这里添加额外的功能......有一个输入框或用户表单,允许您此时粘贴代码,而不是让您输入 VBA 编辑器来粘贴它。
解决方案
我目前正在这样做,这是一个有点深入的设置过程,但一旦完成就可以顺利运行。
第一步是创建一个文件夹结构,其中包含您作为管理员的 .xlam 文件的测试和生产副本。
2、在生产文件夹中,右键单击所有.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
4、我还写了一个宏来改变自定义功能区。下面的链接,另外 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
***重要---- 如果您手动安装插件,请确保在提示您是否要将文件保存到本地计算机时选择否。如果您将其保存到本地计算机,它会创建一个本地副本,并且如果您对网络副本进行更改或需要修复错误,它将永远不会更新。
还有更多提示,但您主要需要调整它们以适应您的操作方式。希望有帮助。
推荐阅读
- android - 编码 mp4 视频以支持搜索
- angular - Angular:一个mat-form-field中的两个FormControl
- json - 具有目标值或键的对象的 jq 过滤器不存在
- algorithm - 关于如何在多个大型项目组上拆分流程的建议
- html - 使用 jquery 在画布上绘制绘图
- python - 使用换行符过滤第三方 Python 警告
- php - 无处不在的 Wordpress 隐藏插件
- image - matplotlib :在大图像中插入小图像
- r - 如何在 RShiny 中使用 script.R
- javascript - 如何使用 Javascript 检测网页中的文本