将属性添加到现有的VBA类

我想要做一些像添加一个漂亮的Excel函数Name属性到WorkBook类。 有没有一个好的方法来做到这一点?

更详细的问题:在VBA中,您可以将公式分配给Excel工作表中的范围。 我想这样做,我想我的公式引用第二个工作簿,这是在我的代码中称为wb的对象。 然后,我使用wb.Name将公式分配给一个范围。

wb.Namewb.Name有一个单引号时出现问题。 然后,你结束了这样的事情:

 =MONTH('[Ryan's WB]Sheet1'A1) 

在电子表格中失败,因为工作簿名称中的单引号与第一个单引号相匹配。

我想要的是一个FunName类的FunName属性,用两个单引号replaceName属性中的所有单引号并返回。 那么上面的公式就会很适合

 =MONTH('[Ryan''s WB]Sheet1'A1) 

您不需要制作单独的类来扩展工作簿类。 您可以将属性添加到现有的ThisWorkbook类模块,如下所示:

 Public Property Get FunName() As String FunName = Replace(Me.Name, "'", "''") End Property 

然后你调用ThisWorkbook.FunName来得到你清理的名字。 但是,该代码必须存在于手头的工作簿中。 如果你想让它在任何工作簿上工作,你的function就是要走的路。

只要做一个replace加倍单引号

 WorksheetName = Replace(WB.Name, "'", "''") 

最后的答案似乎是,WorkBook类可以扩展到包含对Excel公式很好的名称属性。 这可以使用dbb提供的方法来完成。 但是,由于VBA不支持inheritance,因此扩展类的对象将只具有您为其定义的属性。

因此,使用一个函数确实更有意义。 以下是我将要使用的内容:

 Function FormulaWorkName(ByVal aName As String) As String FormulaWorkName = Replace(aName, "'", "''") End Function 

我将应用于工作表名称和工作簿名称。

你需要的是一个扩展Workbook对象的类。 插入一个类模块,然后尝试下面的代码

 Dim WithEvents WB As Workbook Public Sub SetWB(W As Workbook) Set WB = W End Sub Public Property Get FunName() As String FunName = Replace(WB.Name, "'", "''") End Property Private Sub WB_SheetCalculate(ByVal Sh As Object) 'this runs when WB calculates End Sub 

“像这样使用它

 Dim WB As New wbClass WB.SetWB ActiveWorkbook CleanedName = WB.FunName 

请注意,作为奖励,我已将WithEvents放在class级顶部Dims WB的行中。 这可以让您捕获发生在WB的所有事件,并且将Calculate事件作为上面的演示包含在内。 如果您在类代码中并单击代码窗格左上angular的对象下拉列表,您将看到WB对象,如果单击此对象,则右侧列表框将为您提供所有可供select的事件。