大多数读者已经知道可以使用VBA创建函数和子例程。这与VBA的名称Visual Basic一样。通常,除非满足以下三个条件之一,否则当您显示“宏”对话框(按Alt + F8)时,宏会显示在宏列表中。

  • 宏是一个函数。函数通常返回信息,并且它们要求将信息传递给它们。由于从宏列表运行宏不允许发生以上任何一种情况,因此Excel认为无需将其列出。用户定义的函数在Excel中非常有用,但它们毕竟是函数,因此不会在“宏”对话框中显示。

  • 宏是带有参数的子程序。 Excel假定由于参数是必需的,并且您不能通过从宏列表中选择子例程来提供参数,因此无需列出它。

  • 子例程已被声明为私有。这意味着子例程仅对在声明该子例程的模块内进行编码有用。

宏对话框中列出的唯一类型的宏是没有参数的非私有子例程。但是,在某些情况下,您可能也不想列出它们。例如,您可能已经创建了一些通用子例程,这些子例程如果单独调用则不会做任何有用的事情。它们旨在从其他代码中调用。例如,考虑以下宏:

Sub MySub()

MsgBox "We are running the macro"

End Sub

该宏将出现在“宏”对话框中。如果您不希望它出现,则可以采用几种解决方案,通过研究从宏列表中排除宏的三种方式,所有这些解决方案将变得显而易见。第一个潜在的解决方案是检查您的代码,并确定其是否真正“通用”。您是否需要多个模块中的代码?如果不这样做,则将子例程声明为Private;它不会出现在“宏”对话框中。因此,先前的问题宏变为以下内容:

Private Sub MySub()

MsgBox "We are running the macro"

End Sub

隐藏宏的第二种方法是将其简单地转换为函数。

这听起来可能很奇怪,特别是如果您不想返回任何值,但是绝对可以。在VBA中,函数不必返回值。在没有显式声明返回值的情况下,该函数将返回默认结果(例如,布尔值返回False,字符串返回“”等。)因此,可以将问题过程更改为函数并按如下所示进行声明:

Function MySub() As Boolean     MsgBox "We are running the macro"

End Function

此过程不会显示在“宏”对话框中,并且不需要参数。默认情况下,它返回False,但是可以忽略此结果。根据您要更改的子例程的性质,真正地使转换后的函数返回True或False可能对您有利,这取决于代码中执行的操作是否成功。在这种情况下,转换后的函数是一个实函数,而不是真正的伪子例程,因为它返回的是有价值的东西。

第三种可能的解决方案是在子例程中使用一些虚拟参数。您不需要在子例程本身中对它们执行任何操作,但是通过包含它们,该过程不会在宏列表中列出。在这种情况下,问题子例程更改为如下所示:

Sub MySub(Void As Integer)

MsgBox "We are running the macro"

End Sub

现在,该过程未在宏列表中列出,但是您需要更改子例程的调用方式。您必须修改每个实例,以便即使从未使用过参数也可以通过。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

链接:/ excelribbon-ExcelTipsMacros [点击此处在新的浏览器标签中打开该特殊页面]。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(3291)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007及更高版本)找到本技巧的版本:

链接:/ excelribbon-Hiding_Macros [隐藏宏]。