如何禁用(录制宏)菜单(通过宏代码)

时间:2015-04-23 15:26:36

标签: excel vba excel-vba vbscript

在(Microsoft Excel)中(工具>宏)有一个名称为(记录宏)的菜单

如何通过宏代码禁用(录制宏)菜单?

2 个答案:

答案 0 :(得分:1)

你可以使用这样的循环:

Dim ctl As CommandBarControl

For Each ctl In Application.CommandBars.FindControls(ID:=184)
    ctl.Enabled = False
Next ctl

答案 1 :(得分:0)

对于Excel 2007+,您需要操作功能区。这和我能想到的一样好,Rory和我在评论中讨论的问题是他的答案是MacroRecord命令可以添加到状态栏,状态栏不是功能区的一部分模型。黑客是禁用状态栏,但由于这是一个应用程序 -level属性,您需要一个事件处理程序来为其他工作簿重新启用它。

功能区XML 以禁用控件:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="ribbonOnLoad">
    <commands>
           <command idMso="MacroRecord" 
               enabled="false" 
           />
      </commands>
      <ribbon>
      <tabs>
      <tab>
      <group idMso="GroupMacros">
            <button idMso="MacroRecord" 
                enabled="false"
            />
      </group>
      <group idMso="GroupCode">
            <button idMso="MacroRecord"
                enabled="false"
            />
      </group>
      </tab>
      </tabs>
      </ribbon>
</customUI>

标准模块中的VBA 来处理功能区回调和相关过程:

Option Explicit
Option Private Module
Public XLEvents As New cEventClass

'Callback for customUI.onLoad
Sub ribbonOnLoad(ribbon As IRibbonUI)
    Call SetEventHandler
    Call ToggleStatusBar(ThisWorkbook)
End Sub


Sub SetEventHandler()

If XLEvents.appevent Is Nothing Then
    Set XLEvents.appevent = Application
End If

End Sub

Sub ToggleStatusBar(wb As Workbook, Optional ret$)

    If (wb.Name = ThisWorkbook.Name) Then
        Application.StatusBar = "Status Bar Disabled"
    Else
        Application.StatusBar = False
    End If

End Sub

类模块中的VBA ,名为“cEventClass”,用于执行应用程序事件处理:

Option Explicit
Public WithEvents appevent As Application
Dim ret As String
Private Sub appevent_WorkbookActivate(ByVal wb As Workbook)

    Call ToggleStatusBar(wb, ret)

End Sub