2013-07-20 49 views
2

我正在尋找一種'鏈類方法'的方法,例如Range對象可以做像「Range.Borders.Color」之類的東西,我猜Borders部分是它自己的類,它是被Range類訪問,但我不知道如何實現與我自己的類相似的東西 - 我甚至不知道這是什麼叫,經過幾個小時的搜索,我想我可能會慢慢地不學習VBA。VBA類方法鏈接

任何人都可以a)提供代碼,我可以看看複製或b)告訴我這是叫什麼,甚至可以幫助我在一個有用的方向嗎?

因爲我知道要求代碼沒有提供任何讓我看起來像一個傢伙,考慮下面的僞代碼。我知道這很可怕,但它可以幫助我做出任何意義:

main -------------------------------- ----------------------------------------

Dim obj as class1 
set obj = new class1 

obj.Target = Range("A1:B5") 
obj.Borders.Add 

'A1:B5 put into modRange then given borders 

class1 - -------------------------------------------------- --------------------

Private modRange as range 

Public Property Let Target(newTarget as Range) 
    set modRange = newTarget 
End Property 

Public Property Borders() 
    Public Sub Add() 
     'Code to add borders to modRange 
    End Sub 
    Public Sub Remove() 
     'Code to remove borders from modRange 
    End Sub 
End Property 

我知道這不是實際代碼的外觀。但是因爲我不知道這是我能想象的最接近的語法。我想真實的東西會有class1鏈接到其他類模塊。也許。

作爲一個側面說明。如果我確實有一個名爲「Borders」的類(我可能不會)作爲這個1類對象的一部分,它是否會與Range對象的Borders部分發生衝突以及它有相似的名稱?或者私人範圍會保存一天嗎?

(該.Borders.Add /刪除有點可笑有,因爲我知道一個班,我只是語法後,我真的 - 誠實)

回答

5

爲了有一個對象的複雜屬性,則需要創建一個新類,然後在父類中創建該類的一個實例。所以,如果你想擁有類似Class1.Borders.Add()的東西,你首先必須創建一個新的CBorders類(爲了避免名稱衝突,我以前在VB6/VBA中爲我的類名添加了C)。喜歡的東西:

'- in class CBorder 
Private m_lColor As Long 

Public Property Get Color() As Long 
    Color = m_lColor 
End Property 

Public Property Let Color(ByVal lNewColor As Long) 
    m_lColor = lNewColor 
End Property 

Public Sub Reset() 
    m_lColor = 0 
End Sub 

... 

然後裏面的Class1,你有這樣的事情:

Private m_oBorder As CBorder 

Private Sub Class_Initialize() 
    ... 
    Set m_oBorder = New CBorder 
    ... 
End Sub 

Public Property Get Border() As CBorder 
    Set Border = m_oBorder 
End Property 

... 

然後,你可以這樣做:

Dim obj As Class1 
Set obj = New Class1 

obj.Borders.Color = ... 
... 

通知Class1Borders財產如何作爲obj實例的成員進行訪問,然後如何使用CBorder類的Color屬性。將這些值創建爲屬性可以讓您將這些調用鏈接在一起。

您還需要錯誤檢查和驗證代碼 - 我將這些代碼保留爲簡短。

+0

美麗。我幾乎在那裏,我只是不知道把吸氣劑當成一個物體。非常感謝! – Dicckk

+0

@Dicckk不客氣,我很高興這有助於。 – xxbbcc

2

對此的另一個解決方案是讓我返回以使其可鏈接。

類模塊:CChaining

使用的目標和邊框功能回到我啓用鏈接。使用子添加和刪除來「完成」鏈。

Private modRange As Range, modRangeBorders As Object 

Public Function Target(rng As Range) 
    Set modRange = rng 
    Set Target = Me 
End Function 

Public Function Borders() 
    Set modRangeBorders = modRange.Borders 
    Set Borders = Me 
End Function 

Public Sub Add() 
    modRangeBorders.LineStyle = xlContinuous 
End Sub 

Public Sub Remove() 
    modRangeBorders.LineStyle = xlNone 
End Sub 

測試類的模塊中

Sub testing() 
    Dim obj As New CChaining 
    obj.Target(Range("A1:B5")).Borders.Add 
    'now the target and property (Borders) is set and you could do this 
    'obj.Remove 
End Sub 

多麼美妙......嗯,這個有可能建立一個圖書館像其他語言(JavaScript的>的jQuery)使用Excel進行VBA更容易。