Class 将属性添加到现有VBA类

Class 将属性添加到现有VBA类,class,excel,vba,Class,Excel,Vba,我想在工作簿类中添加一个很好的Excel函数名属性。有什么好办法吗 更详细的问题:在VBA中,可以将公式指定给Excel工作表中的某个范围。我想这样做,我希望我的公式引用第二个工作簿,在我的代码中是一个名为wb的对象。然后,我使用wb.Name将公式分配给一个范围 当wb.Name中只有一个引号时,就会出现问题。然后你会得到这样的结果: =MONTH('[Ryan's WB]Sheet1'A1) Public Property Get FunName() As String FunN

我想在工作簿类中添加一个很好的Excel函数名属性。有什么好办法吗

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

当wb.Name中只有一个引号时,就会出现问题。然后你会得到这样的结果:

=MONTH('[Ryan's WB]Sheet1'A1)
Public Property Get FunName() As String

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

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

我想要的是工作簿类的FunName属性,它用两个单引号替换Name属性中的所有单引号,并返回该单引号。那么,上面的公式将正确地结束如下

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

只需做一个替换,将单引号加倍

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

只需做一个替换,将单引号加倍

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

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

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

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

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

最后的答案似乎是工作簿类可以扩展为包含一个名称属性,该属性非常适合Excel公式。这可以使用dbb提供的方法来完成。但是,由于VBA不支持继承,扩展类的对象将只有您为其定义的属性

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

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

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

最后的答案似乎是工作簿类可以扩展为包含一个名称属性,该属性对Excel公式很好。这可以使用dbb提供的方法来完成。但是,由于VBA不支持继承,扩展类的对象将只有您为其定义的属性

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

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

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

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

=MONTH('[Ryan's WB]Sheet1'A1)
Public Property Get FunName() As String

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

End Property

然后调用ThisWorkbook.FunName以获得已清除的名称。但是,此代码必须存在于手头的工作簿中。如果您想让它在任何工作簿上工作,您的函数就是最佳选择。

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

=MONTH('[Ryan's WB]Sheet1'A1)
Public Property Get FunName() As String

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

End Property

然后调用ThisWorkbook.FunName以获得已清除的名称。但是,此代码必须存在于手头的工作簿中。如果你想让它在任何工作簿上工作,你的功能就是最好的选择。

绝对完美!这正是我想要的。非常感谢。好的,近乎完美。现在看来,wbClass对象只能访问FunName属性。有没有办法保留原始WB对象的全部内容并添加FunName属性?不幸的是,VBA不支持继承,您必须复制任何您想要的内容。就我个人而言,我只想添加一个普通函数来实现这一点,而不是扩展对象。绝对完美!这正是我想要的。非常感谢。好的,近乎完美。现在看来,wbClass对象只能访问FunName属性。有没有办法保留原始WB对象的全部内容并添加FunName属性?不幸的是,VBA不支持继承,您必须复制任何您想要的内容。就我个人而言,我只想添加一个普通函数来实现这一点,而不是扩展对象。