2011-02-25 25 views
7

Word 2007'de VBA kullanarak bir form belgesini temsil etmek için kod oluşturmaya çalışıyorum. Bölüm, Soru Dizisi ve Soruyu temsil edecek sınıflar oluşturdum.VBA - Bir koleksiyon koleksiyonuna nasıl koleksiyon eklenir

Bu yüzden 15 bölümüm var. Her bir 'Bölüm' Nesnesi 'Bölümler' Koleksiyonuna eklemek için bir fonksiyon yarattım, ardından nesneyi yok edin, sonuç olarak nesneler koleksiyonda (veya bir şeyde) kalıcı olarak kalır.

Koleksiyonlara koleksiyon eklemek için aynı yöntemi kullanmak mümkün mü yoksa her koleksiyonu açık bir şekilde tanımlamalı mıyım? Modülünde

Kod: O zaman bu aracılığıyla denir

Public Sections As Collection 

Function DefineSection(ByVal SectionName As String) 

    Set Section = New clsSection 
    Section.myName = SectionName 
    Sections.Add Section, SectionName 

End Function 


Function DefineQuestionSet(ByVal SectionName As String, ByVal Name As String, ByVal NoOfQuestions As Integer, ByVal IsMutuallyExclusive As Boolean, Optional ByVal DependentOnSection As String) 

    Dim Qsets As Collection 

    Set Qsets = New Collection 
    Set QuestionSet = New clsQuestionSet 

    QuestionSet.Name = Name 
    QuestionSet.NoOfQuestions = NoOfQuestions 
    QuestionSet.MutuallyExclusive = IsMutuallyExclusive 

    If Not (DependentOnSection) = "" Then 
     QuestionSet.DependentOnSection = DependentOnSection 
    End If 

    Qsets.Add QuestionSet 
    Sections.Item(SectionName).Add Qsets 

End Function 

:

Sub Initilise() 

    Set Sections = New Collection 

    DefineSection "PersonalDetails" 
    DefineQuestionSet "PersonalDetails", "PersonalDetails", 29, False 

End Sub 

cevap

5

Evet. Koleksiyonlara koleksiyonları sonsuza dek koleksiyonlara kesinlikle ekleyebilirsiniz. Göndermiş olduğunuz kod, sadece göz atmaktan işe yarayacak gibi görünüyor. Özel problemlerin mi var?

UPDATE: vba sadece nesnelere yaklaşık referanslar geçer. Bir nesneyi bir koleksiyona atadıktan sonra açıkça imha ederseniz (örneğin, Set myObj = Nothing), aynı zamanda koleksiyondaki nesneyi de yok edersiniz.

[DÜZENLE]: Görünüşe göre bu doğru değil. this website itibaren (ilk yorumlarında Stevo ile bağlantılı):

  • sınıfının bir örneğini oluşturun:

    sınıf nesneleri yönetmek için koleksiyonları kullanabilmek için, aşağıdaki yapmalısınız

  • Set özellikleri ve sınıfa
  • yöntemleri kamu koleksiyonuna Ders ekle
  • Boşalt sınıfının örneği

Sen sınıfı sınıf sonuçlarının örneğini boşaltma kapalı ve bitirildiği düşünülebilir. Ancak, sınıf nesnesini devam ediyor çünkü koleksiyonuna eklersiniz ve bu da sınıfının referansına sahiptir. Bu, nesne başvurularını bir koleksiyonu aracılığıyla denetlemenizi sağlayan çok güçlü bir tekniğidir; sınıf nesnesini, koleksiyonu, koleksiyonundan kaldırılıncaya kadar sonlandırmaz.

GÜNCELLEME: Bir nesneye bir koleksiyon ekleyemezsiniz hiçbir neden yoktur. Sadece böyle bir yöntemi desteklemek için nesnenin başlatıldığı sınıfa ihtiyacınız var.Örneğin, clsSection sınıf modülünde sen clsSection saklanan bir koleksiyona kendisine geçirilen nesneleri ekler Add yöntemi gerekir:

Private QSetsColl As Collection 

Public Sub Add(QSets As Object) 
    If QSetsColl Is Nothing Then Set QSetsColl = New Collection 
    QSetsColl.Add QSets 
End Sub 
+0

Ne yazık ki şimdilik kod değiştirdik bir initializated koleksiyon dönmek - ancak 'Sections.Item (SectionName) .Add Qsets' satırında 'DefineQuestionSet' işlevinde bir hata var. – Stevo

+0

Sadece açıklığa kavuşmak için, kod nesneleri toplamaya ekler ve nesnenin örneğini yok eder, ancak koleksiyonda kalıcı olarak kalır, bu yüzden nesneleri takip etmek zorunda kalmam. Bu koleksiyonlar için aynı mı? yani, B koleksiyonunu yaratın, A koleksiyonuna ekleyin, B koleksiyonunu imha edin, fakat A koleksiyonuna eklendiğinden, A koleksiyonunda bir 'item' kalır. – Stevo

+0

hata mesajı, her zaman esrarengiz 'nesne bu özelliği desteklemez veya yöntem ' – Stevo

0

Ben şimdi cevap var, ama birisi açıklamak eğer olurdu faydalı.

Kodun ne yaptığını düşünüyorum, bir nesneye koleksiyon eklemeyi deniyor - ki bu açıkça işe yaramıyor. Bu yüzden, nesneyi VE koleksiyonunu ekleyebileceğim bir koleksiyon oluşturmam gerekiyor. vb

1

bu basit örneği deneyin:

Private Sub CommandButton1_Click() 

    Dim masterCollection As New collection 
    masterCollection.Add "first key", createDetailCollection() 
    masterCollection.Add "second key", createDetailCollection() 
    masterCollection.Add "third key", createDetailCollection() 

End Sub 

takip fonksiyonu denemek ve sadece bağımsız koleksiyonlar oluşturmak için,

Function createDetailCollection() 
    Dim collection As New collection 
    createCollection = collezioneBuy 
End Function 
+0

Belki 'createDetailCollection() 'içinde' createCollection = collezioneBuy' yerine create createCollection = collezioneBuy 'komutunu kullanmalısınız. – Ans