1

我想做一些事情,比如在类中添加一个 nice-to-Excel-functionsName属性WorkBook。有没有好的方法来做到这一点?

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

wb.Name其中包含单引号时,就会出现问题。然后你会得到这样的结果:

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

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

我想要的是一个类的属性,它用两个单引号替换属性中的所有单FunName引号并返回它。那么上面的公式会正确地看起来像WorkBookName

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

4 回答 4

3

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

Public Property Get FunName() As String

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

End Property

然后你打电话ThisWorkbook.FunName给你清理过的名字。但是,此代码必须存在于手头的工作簿中。如果您希望它适用于任何工作簿,那么您的功能就是要走的路。

于 2008-12-19T22:31:07.647 回答
1

只需进行替换以将单引号加倍

WorksheetName = Replace(WB.Name, "'", "''")
于 2008-11-12T19:35:34.873 回答
1

您需要的是一个扩展 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 放在 Dims WB 类的顶部。这允许您捕获发生在 WB 上的所有事件,并且我在上面包含了 Calculate 事件作为演示。如果您在类代码中并单击代码窗格左上角的对象下拉列表,您将看到 WB 对象,如果您单击它,右侧的列表框将为您提供所有可供选择的事件。

于 2008-11-12T22:25:02.457 回答
1

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

因此,只使用一个函数确实更有意义。这是我要使用的:

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

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

于 2008-11-12T23:14:42.090 回答