Class 将属性添加到现有VBA类
我想在工作簿类中添加一个很好的Excel函数名属性。有什么好办法吗 更详细的问题:在VBA中,可以将公式指定给Excel工作表中的某个范围。我想这样做,我希望我的公式引用第二个工作簿,在我的代码中是一个名为wb的对象。然后,我使用wb.Name将公式分配给一个范围 当wb.Name中只有一个引号时,就会出现问题。然后你会得到这样的结果: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
=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不支持继承,您必须复制任何您想要的内容。就我个人而言,我只想添加一个普通函数来实现这一点,而不是扩展对象。