2016-02-14 56 views
1

我創建了一個類對象classBlock,它使用數組加速讀取/寫入Excel工作表。我還創建了一個功能,可以很容易地使用:使用函數訪問類對象並使用/結束使用

Function funcBlock(objSheet as WorkSheet) as classBlock 
    Set funcBlock = New classBlock 
    funcBlock.Initialize objSheet 
End Function 

如果我打電話使用With結構如下功能...

With funcBlock(ActiveSheet) 
    .SomeFunctions 
End With 

...做的classBlock實例End With之後是否存在?

如果我多次撥打funcBlock,我是否在classBlock的實例中混淆了內存?

謝謝!

+0

我會說不,是的。後者可能依賴於類的析構函數。但是,如果您在一大塊單元格上使用變體數組來輔助處理,則不會將單元格值重新讀入數組中;不,你會批量加載一次,處理它們,然後將它們批量轉儲回工作表。我不明白你爲什麼需要反覆打電話給你的班級,用...結束與否。 – Jeeped

+0

謝謝。在我正在進行的項目中,我可能會將它稱爲三到四次,在不同的範圍和不同的工作表上。我可能重構代碼,以便每個表只調用一次,但在這一階段,我只是想了解上述情況下類實例會發生什麼。 – Harmless

+0

給你的課堂添加一個終止事件,以便你可以看到它何時被摧毀。但是,當您啓動一個新的With塊時,您的類將被重新實例化,因爲函數會在每次調用時實例化該類的新副本。 – jkpieterse

回答

1

也許你想念With-End With的概念? With語句允許您在指定對象上執行一系列語句,而無需重新驗證對象的名稱。

所以,你得到的類的實例,然後將With可以用來編寫報表,而無需重複對象的名稱:

Dim block as classBlock 
Set block = funcBlock(ActiveSheet) 

With block 
    .SomeFunctions 
    ' .SomeProperty = 100 
    ' .Save(true) 
    ' etc. 
End With 

With既節省了您鍵入以下。

block.SomeFunctions 
block.SomeProperty = 100 
block.Save(true) 

類的實例現在由可變block引用並根據它被聲明的範圍存在。

如果多次調用函數funcBlock,則每次調用函數時都會創建新對象。

因此,讓我們調用函數,例如三次:

Dim block1 as classBlock 
Set block1 = funcBlock(ActiveSheet) 

Dim block2 as classBlock 
Set block2 = funcBlock(ActiveSheet) 

Dim block3 as classBlock 
Set block3 = funcBlock(ActiveSheet) 

現在你有三個內存對象,其與變量block1, block2, block3引用。 使用此變量可以訪問對象。

但是,當你調用該函數funcBlock三次這樣的:

Dim block as classBlock 
Set block = funcBlock(ActiveSheet) 

' some code ... 
Set block = funcBlock(ActiveSheet) 

' some code ... 
Set block = funcBlock(ActiveSheet) 

...那麼只有最後一個實例是由varaible block引用,可以訪問。 前兩個實例只是凌亂的內存:)。 HTH

1

感謝您的回覆。以下jkpieterse的建議下,添加以下到classBlock

Private Sub Class_Initialize() 
    MsgBox "HELLO" 
End Sub 

Private Sub Class_Terminate() 
    MsgBox "GOODBYE" 
End Sub 

我然後跑以下:

Sub Test 

    With funcBlock(ActiveSheet) 
    End With 

    MsgBox "AFTER" 

End Sub 

所得消息序列是:HELLOGOODBYEAFTER。這意味着Excel意識到該實例是在With上創建的,因此在End With上銷燬該實例。據推測,由classBlock創建的陣列在類實例被銷燬時也會被擦除。

+0

嗯,這很有趣,也許我誤解了你的問題:)。 – dee

+0

沒問題。和你一樣,我擔心冗餘類實例會造成內存混亂,但它看起來像Excel管理得很好。 – Harmless