2010-04-01 13 views
6

Tamam VBA'da kullanmak istediğim birkaç .NET sınıfım var. Bu yüzden onları COM üzerinden kaydetmeliyim ve hepsini. Sanırım COM kaydına karar verdim (nihayet) ama şimdi nesnelerin nasıl oluşturulacağının sözdiziminde yardıma ihtiyacım var. İşte yapmaya çalıştığım şeyi gösteren bazı sahte kodlar.VBA'da .NET sınıfını nasıl kullanırım? Sözdizimi yardımı!

DÜZENLEME: Değiştirilen Ekli Nesneler bir List

.NET sınıfları şuna benzer ...

public class ResourceManagment 
{ 
    public ResourceManagment() 
    { 
     // Default Constructor 
    } 

    public static List<RandomObject> AttachedObjects() 
    { 
     ArrayList list = new ArrayList(); 
     return list; 
    } 
} 

public class RandomObject 
{ 
    // 
    public RandomObject(int someParam) 
    { 

    } 

} 

Tamam yerine ArrayList dönmek için, bu nedenle bu İsterim budur VBA yapılacak nota

public class VBAClass 
{ 
    public void main() 
    { 
     ArrayList myList = ResourceManagment.AttachedObjects(); 
     foreach(RandomObject x in myList) 
     { 
      // Do something with RandomObject x like list them in a Combobox 
     } 
    } 
} 

bir şey RandomObject bir kamu defau sahip olmamasıdır ... (C# gösterdi) ama nasıl bilmiyorum lt kurucu. Bu yüzden Dim x As New RandomObject gibi bir örnek oluşturamıyorum. MSDN Types must have a public default constructor to be instantiated through COM. Managed, public types are visible to COM. However, without a public default constructor (a constructor without arguments), COM clients cannot create an instance of the type. COM clients can still use the type if the type is instantiated in another way and the instance is returned to the COM client. You may include overloaded constructors that accept varying arguments for these types. However, constructors that accept arguments may only be called from managed (.NET) code.

Eklendi ... Eğer COM üzerinden bir varsayılan kurucu olmayan bir nesne örneğini edemez ama başka yöntemle döndürülür eğer hala nesne türü kullanabilirsiniz söylüyor: İşte benim VB girişimi:

Dim count As Integer 
count = 0 
Dim myObj As New ResourceManagment 
For Each RandomObject In myObj.AttachedObjects 
    count = count + 1 
Next RandomObject 

cevap

1

Sorununuz, AttachedObjects() yönteminin statik olmasıdır. COM, statik yöntemler yapamaz. COM'da yapabileceğiniz tek “statik” işlem “bir sınıfı başlat”. Bu nedenle, VBA'dan AttachedObjects yöntemini çağırmak için, onu statik olmayan hale getirin (yani, tanımında static anahtar sözcüğünü kaldırın). Bunun dışında, yöntem şu an olduğu gibi kalabilir. Ve VBA kodunuz da iyi görünüyor - yöntemi değiştirdikten sonra çalışmalısınız.

Ve çalışmadığı durumda, bir sonraki soru: tam olarak hangi hatayı alıyorsunuz ve hangi noktada?

1

Eğer .net kodunda bir RandomObjectFactory oluşturup olması gerekir Bunu aşmanın bu RandomObject örneğini oluşturmak

yüzden bir şey gibi VBA kullanmak Bu: Bu sınıf uzatabilirsiniz

public class RandomObjectFactory 
{ 
    public static Create(int someParam) 
    { 
      return new RandomObject(someParam); 
    } 
} 

RandomObjects

farklı aşırı yükleri oluşturmak için oluşturmak yöntemlerden daha fazla yüke sahip

GÜNCELLEME: Söz this question doğru anlayışa dayalı

ve this one muhtemelen olacaktır yararlı

+0

Gerçekten VBA'dan bir RandomObject örneğini oluşturmaya çalışmıyorum. Ben sadece ResourceManagement sınıfı (yönetilen .NET) içinde oluşturulan bir RandomObjects listesi ile çalışıyorum. – PICyourBrain

+0

oh özür dilerim, sonra sorumu yanlış anladım. Bir döngü için vba sözdizimini bilmek ister misiniz? İlk probleminiz, genel bir listeyi com tarafına döndürdüğünüz, ancak com, jenerikleri desteklemeyecektir (bunu yapmaya çalıştığınız şeyden bir derleyici uyarısı almalısınız.) VBA’daki ResourceManagement sınıfına mı erişirsiniz? –

+0

Evet. VBA projesinde .NET derlemesine bir başvuru ekledim.Sonra VBA'da bunu "Dim myObj As New ResourceManagment" yapabilirim ancak AttachedObjects yöntemini nasıl arayabilirim? – PICyourBrain