我有一个带有一堆普通VBA宏的Excel工作表。此文件不断更新并作为Excel加载项(.xlam)进行分发。到目前为止,我对它的工作方式非常满意。
现在我想添加一个功能区选项卡和运行其中一些宏的按钮。最初,我很高兴找到this MSDN article,但后来感到沮丧的是SetCustomUI
似乎不存在Excel(只有Project),所以我无法在{{1}中简单地使用它}}。其他SO问题证实了这一点,但不提供替代方案。
我的要求:
有什么想法吗?
答案 0 :(得分:7)
这是我在AddIn文件上使用了一段时间的一些代码。我从别人那里继承了它,但它对我来说一直都很好。
它应该在AddIns
功能区中创建一个新工具栏:
我想我复制了所有相关的代码。如果您有任何问题或遇到任何问题,请告诉我。
Option Explicit
'This module contains functions and subroutines to create Add-in menus
Public Const MenuName As String = "Menu Name"
Public Const APPNAME As String = "&Menu Name"
Private Sub Credit_Inf()
MsgBox "Created by YOUR NAME"
End Sub
Private Sub Auto_Open()
Dim NewMenuItemMacro As String
Dim NewMenuItem As String
Dim XLCommandBar As Integer
Dim NewItem As CommandBarButton
Dim ToolsMenu As CommandBarPopup
Dim NewMenu As CommandBar
NewMenuItemMacro = MenuName
NewMenuItem = APPNAME & "..."
XLCommandBar = 1 'Worksheet Menu Bar
'Delete the current menu if it exists (just in case)
On Error Resume Next
CommandBars(MenuName).Delete
On Error GoTo 0
Set NewMenu = Application.CommandBars.Add(MenuName, msoBarTop)
' .....
NewMenu.Visible = True
' Create a popup control on the bar and set its caption.
Set ToolsMenu = NewMenu.Controls.Add(Type:=msoControlPopup)
ToolsMenu.Caption = "Who built this?"
ToolsMenu.BeginGroup = True
With ToolsMenu.Controls.Add(Type:=msoControlButton)
.OnAction = "Credit_Inf"
.Caption = "Find out who built this"
.FaceId = 99
.Style = msoButtonCaption
.BeginGroup = False
End With
'##Repeat ToolsMenu.Controls.Add, as necessary
End Sub
Private Sub Auto_Close()
'Delete the current menu if it exists (just in case)
On Error Resume Next
CommandBars(MenuName).Delete
On Error GoTo 0
End Sub
Private Sub EnableMenuItem(sItem As String, bEnable As Boolean)
On Error GoTo Err_EnableMenuItem
Dim NewItem As CommandBarButton
Dim NewMenu As CommandBar
Set NewMenu = Application.CommandBars(MenuName)
Set NewItem = NewMenu.FindControl(Tag:=sItem, recursive:=True)
NewItem.Enabled = bEnable
Err_EnableMenuItem:
Resume Next
End Sub
Public Function IsWorkbookOpen() As Boolean
IsWorkbookOpen = True
If Application.Workbooks.count = 0 Then
IsWorkbookOpen = False
End If
End Function
答案 1 :(得分:2)
您应该能够在XLAM文件中嵌入功能区CustomUI。我相信微软有一个工具可以帮助解决这个问题(尽管你也可以手动制作和嵌入它)。
从OP开始,他们使用Office Custom UI Tool:
完成了这项工作我已经尝试了这个答案的建议:在原始工作表中使用工具(我使用自定义UI编辑器工具)添加选项卡和按钮,然后另存为加载项。这非常适合我想要的。
以下是设置:
Module mdlMyActions in MyAddin.xlsm:
Public Sub HelloWorld(ctl As IRibbonControl)
MsgBox("Hello, world!")
End Sub
XML插入MyAddin.xlsm:
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="tabMyTab" label="My Tab">
<group id="grpMyGroup" label="My Group">
<button id="btnHelloWorld" label="Hello World"
imageMso="HappyFace" size="large" onAction="HelloWorld" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
请注意,这是在作为加载项保存之前的全部内容。一旦保存为加载项并安装到Excel中,加载项就能完美运行。