将宏作为插件分发给其他用户
Distributing macro as an Add-In to other users
我正在寻找一些技巧来解决向我公司的其他用户分发宏的问题。
我创建了一个特定的工作簿,其中包含一堆各种类型的数据,例如日期、字符串和数字。每个用户都必须管理相同类型的数据,因此我们使用此工作簿作为模板。数据存储在我应用了条件格式和数据验证的列中,以防止用户插入错误的值。本工作簿包含几个具有特定名称的工作表。此工作表的名称出现在代码中 - 为每个工作表进行一些特定的计算(基于工作表的名称)。
问题是将来我可能想对代码进行一些更改,例如使我的宏更高效或实施一些必要的更改。
我在互联网上搜索了最佳解决方案,我认为最好的办法是为 Excel 创建一个加载项。但我对此有一些疑问。
这真的是最好的解决方案吗?有人可以给我一个提示,让我以更好的方式制作它吗?
如果插件是最好的,有没有办法只将它添加到特定的工作簿(这是我的模板)?
是否可以在有人打开特定工作簿时安装插件(使用 Workbook_Open)并在工作簿关闭时卸载它(使用 Workbook_BeforeClose)。我在网上找了答案,但是这件事我不是很清楚。如果这是可能的,它会影响 closing/opening 工作簿的速度吗?
感谢任何help/advice!
将加载项放入网络驱动器并将其标记为只读。使用本地副本进行更新。确保每次复制它时将其设置为只读,并确保人们 运行 离开网络驱动器。
通常,当人们安装插件时,他们对有关将其复制到本地驱动器的问题的回答是“是”,但这不是正确的答案。如果他们不小心点击了“是”,您将需要编辑他们的注册表以删除本地引用。
要通过共享驱动器和您自己的开发副本分发加载项,我强烈建议您阅读 following link。
它有安装过程的描述,包括 braX 在他的回答中提出的一个非常重要的观点 - 当被问及复制到个人加载项文件夹时回答 No
。
下面是我用来保存加载项的 link 中经过调整的代码。它进入加载项本身的普通模块。它将加载项保存在一个文件夹中,并将其属性设置为Read only
,这样无论何时有人使用它都不会被锁定。此设置允许您随时通过 运行 此宏更新文件,而无需追踪用户并让他们关闭 Excel。
Private Sub Deploy()
Dim FolderOnSharedDrive as String
FolderOnSharedDrive = "Folder path to store add-in in here"
With ThisWorkbook
On Error Resume Next
SetAttr FolderOnSharedDrive & .Name, vbNormal
On Error GoTo 0
.SaveCopyAs FolderOnSharedDrive & .Name
SetAttr FolderOnSharedDrive & .Name, vbReadOnly
MsgBox "Deploy Completed to " & FolderOnSharedDrive & .Name
End With
End Sub
最好添加文件路径检查和一些错误处理。
关于您提出的其他一些问题:
- 加载项可以包括不可见的工作表,您可以使用它们来存储设置、路径等。
可以使加载项只出现在特定的工作簿上,但这需要一些努力:
Include a ribbon for an add-in that includes callback for visibility. Set it to visible whenever specific workbook(template) is active. It will still be loaded to memory in any Excel instance
You can programatically add add-ins on open and remove on close as you suggested, check this question to see some options.
Adding/removing 加载项关闭或打开肯定会影响速度,但我不能说是否会引起注意。
我正在寻找一些技巧来解决向我公司的其他用户分发宏的问题。
我创建了一个特定的工作簿,其中包含一堆各种类型的数据,例如日期、字符串和数字。每个用户都必须管理相同类型的数据,因此我们使用此工作簿作为模板。数据存储在我应用了条件格式和数据验证的列中,以防止用户插入错误的值。本工作簿包含几个具有特定名称的工作表。此工作表的名称出现在代码中 - 为每个工作表进行一些特定的计算(基于工作表的名称)。
问题是将来我可能想对代码进行一些更改,例如使我的宏更高效或实施一些必要的更改。
我在互联网上搜索了最佳解决方案,我认为最好的办法是为 Excel 创建一个加载项。但我对此有一些疑问。
这真的是最好的解决方案吗?有人可以给我一个提示,让我以更好的方式制作它吗?
如果插件是最好的,有没有办法只将它添加到特定的工作簿(这是我的模板)?
是否可以在有人打开特定工作簿时安装插件(使用 Workbook_Open)并在工作簿关闭时卸载它(使用 Workbook_BeforeClose)。我在网上找了答案,但是这件事我不是很清楚。如果这是可能的,它会影响 closing/opening 工作簿的速度吗?
感谢任何help/advice!
将加载项放入网络驱动器并将其标记为只读。使用本地副本进行更新。确保每次复制它时将其设置为只读,并确保人们 运行 离开网络驱动器。
通常,当人们安装插件时,他们对有关将其复制到本地驱动器的问题的回答是“是”,但这不是正确的答案。如果他们不小心点击了“是”,您将需要编辑他们的注册表以删除本地引用。
要通过共享驱动器和您自己的开发副本分发加载项,我强烈建议您阅读 following link。
它有安装过程的描述,包括 braX 在他的回答中提出的一个非常重要的观点 - 当被问及复制到个人加载项文件夹时回答 No
。
下面是我用来保存加载项的 link 中经过调整的代码。它进入加载项本身的普通模块。它将加载项保存在一个文件夹中,并将其属性设置为Read only
,这样无论何时有人使用它都不会被锁定。此设置允许您随时通过 运行 此宏更新文件,而无需追踪用户并让他们关闭 Excel。
Private Sub Deploy()
Dim FolderOnSharedDrive as String
FolderOnSharedDrive = "Folder path to store add-in in here"
With ThisWorkbook
On Error Resume Next
SetAttr FolderOnSharedDrive & .Name, vbNormal
On Error GoTo 0
.SaveCopyAs FolderOnSharedDrive & .Name
SetAttr FolderOnSharedDrive & .Name, vbReadOnly
MsgBox "Deploy Completed to " & FolderOnSharedDrive & .Name
End With
End Sub
最好添加文件路径检查和一些错误处理。 关于您提出的其他一些问题:
- 加载项可以包括不可见的工作表,您可以使用它们来存储设置、路径等。
可以使加载项只出现在特定的工作簿上,但这需要一些努力:
Include a ribbon for an add-in that includes callback for visibility. Set it to visible whenever specific workbook(template) is active. It will still be loaded to memory in any Excel instance
You can programatically add add-ins on open and remove on close as you suggested, check this question to see some options.
Adding/removing 加载项关闭或打开肯定会影响速度,但我不能说是否会引起注意。