我在“thisWorkbook”中定义了一堆方法,但我无法=foo(17.0)从电子表格中访问它们。在互联网上搜索表明,对于要直接从电子表格使用的功能,您应该Module首先创建一个新的。所以,这是一个由两(三)部分组成的问题:第一个问题是:创建新模块与将内容放入本工作簿有何不同。第二个是:我应该放入什么thisWorkbook?第三个问题是:是否有任何方法可以访问thisWorkbookExcel UI 中的功能(或某些特定的工作表模块?
创建新模块与将内容放入此工作簿有何不同?
ThisWorkbook是宿主文档。它表示Workbook包含 VBA 项目的对象。像每个Workbook对象一样,它对事件做出响应Workbook。
ThisWorkbook与每个“SheetX”模块一样,是一种特殊的类模块,VBA 将其理解为“文档模块” - 这些特殊模块无法添加或删除。主机应用程序(此处为 Excel)负责: 要添加工作表模块,您必须将工作表添加到工作簿中。VBA代码无法New创建文档模块;您必须使用库提供的工厂方法来创建它们(即[ApplicationObject].Workbooks.Open, [ApplicationObject].Workbooks.Add, [WorkbookObject].Worksheets.Add)。
作为对象,如果没有它的实例,您就无法调用它们的公共成员。ThisWorkbook定义了一个方便命名的对象ThisWorkbook,因此您可以通过使用以下方式限定成员调用来调用其成员ThisWorkbook:
ThisWorkbook.SomePublicProcedure "arg1", arg2, 42
Run Code Online (Sandbox Code Playgroud)
与工作表模块相同,只不过这些模块定义了一个以模块属性命名的对象(Name)- 默认情况下(Name)工作表“Sheet1”的属性是Sheet1,因此您可以像这样限定它:
Sheet1.SomePublicProcedure "arg1", arg2, 42
Run Code Online (Sandbox Code Playgroud)
ThisWorkbook公开公共用户过程,以及从 继承的每个成员Workbook;Sheet1公开公共用户过程,以及从 继承的每个成员Worksheet。
我应该在这本工作簿中放入什么内容?
属于工作簿级别的任何内容。即影响宿主文档的代码。这主要是事件处理程序,例如Open在 Excel 中打开工作簿(启用宏)时调用事件处理程序。
您希望在任何文档的代码隐藏中包含尽可能少的代码,因此您的事件处理程序只需调用过程来响应事件:
Private Sub Workbook_Open()
DoSomething
End Sub
Run Code Online (Sandbox Code Playgroud)
标准模块中的DoSomethinga 应该在哪里。Public Sub
有什么方法可以访问此工作簿中的功能(或 Excel UI 中的某些特定工作表模块吗?
你不想那样做。但是如果您愿意,您可以将宏分配给Public Sub定义在ThisWorkbook:

请注意,宏是用ThisWorkbook对象名称限定的。
通常您会希望在标准模块中定义宏。标准模块不是对象,不能实例化。标准模块中的公共过程可以从项目中的任何位置访问,除非它Option Private Module在顶部说明,否则 Excel 可以轻松使用其公共成员。
如果您的意思是“可用于 Excel”作为“我可以在公式中使用”,那么您的意思是“作为 UDF 公开”,并且这些与宏一样属于标准模块,而不是ThisWorkbook.