我想做一些事情,例如向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)
答案 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>