簡體   English   中英

向現有的VBA類添加屬性

[英]Add property to existing VBA class

我想做一些類似的事情,向WorkBook類添加一個Excel函數的Name屬性。 有什么好方法嗎?

更詳細的問題:在VBA中,您可以將公式分配給Excel工作表中的范圍。 我想要這樣做,並且我希望公式引用第二個工作簿,該工作簿在我的代碼中稱為wb 然后,我在將公式分配給范圍時使用wb.Name

wb.Name中包含單引號時,就會出現問題。 然后您會得到如下結果:

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

在電子表格中失敗,因為工作簿名稱中的單引號與第一個單引號匹配。

我想要的是WorkBook類的FunName屬性,該屬性將Name屬性中的所有單引號替換為兩個單引號,並返回該單引號。 然后上述公式將正確地看起來像

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

您不需要創建單獨的類來擴展工作簿類。 您可以將屬性添加到現有的ThisWorkbook類模塊中,如下所示:

Public Property Get FunName() As String

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

End Property

然后,調用ThisWorkbook.FunName以獲取清理后的名稱。 但是,此代碼必須存在於手邊的工作簿中。 如果您希望它在任何工作簿上都能工作,那么您的功能便是解決之道。

只需執行替換即可將單引號加倍

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

最終的答案似乎是可以將WorkBook類擴展為包括對Excel公式很友好的name屬性。 這可以使用dbb提供的方法來完成。 但是,由於VBA不支持繼承,因此擴展類的對象將僅具有您為其定義的屬性。

因此,僅使用函數確實更有意義。 這是我將要使用的:

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

我將同時應用於工作表名稱和工作簿名稱。

您需要一個擴展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對象,如果單擊此對象,則右側列表框將為您提供所有事件供您選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM