将属性添加到现有VBA类

时间:2008-11-12 19:06:10

标签: excel class excel-vba vba

我想做一些事情,例如向Name类添加一个很好的Excel函数WorkBook属性。有没有办法做到这一点?

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

wb.Name中包含单引号时,就会出现问题。然后你结束这样的事情:

=MONTH('[Ryan's WB]Sheet1'A1)
电子表格中的

,由于工作簿名称中的单引号与第一个单引号匹配而失败。

我想要的是FunName类的WorkBook属性,用{2}单引号替换Name属性中的所有单引号并返回它。然后上面的公式将适当地看起来像

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

4 个答案:

答案 0 :(得分:3)

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

Public Property Get FunName() As String

    FunName = Replace(Me.Name, "'", "''")

End Property

然后致电ThisWorkbook.FunName以获取清理后的姓名。但是,此代码必须存在于手头的工作簿中。如果您希望它可以在任何工作簿上运行,那么您的功能就是您的选择。

答案 1 :(得分:1)

只需替换单引号加倍

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

答案 2 :(得分:1)

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

因此,使用函数真的更有意义。这就是我将要使用的内容:

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

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

答案 3 :(得分:0)

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

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放在Dims WB位于班级顶部的行中。这允许您捕获发生在WB上的所有事件,并且我将Calculate事件作为上面的演示包括在内。如果您在类代码中并单击代码窗格左上角的对象下拉列表,您将看到WB对象,如果单击此对象,右侧列表框将为您提供所有可供选择的事件。 / p>