2010-04-01 11 views
6

ok Tôi có vài lớp .NET mà tôi muốn sử dụng trong VBA. Vì vậy, tôi phải đăng ký chúng thông qua COM và tất cả những điều đó. Tôi nghĩ rằng tôi đã đăng ký COM đã tìm ra (cuối cùng) nhưng bây giờ tôi cần trợ giúp với cú pháp về cách tạo các đối tượng. Dưới đây là một số mã giả cho thấy những gì tôi đang cố gắng làm.Làm cách nào để sử dụng lớp .NET trong VBA? Trợ giúp cú pháp!

EDIT: Thay đổi đối tượng đính kèm để trả lại một ArrayList thay vì một danh sách

Các lớp .NET trông như thế này ...

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) 
    { 

    } 

} 

OK, vì vậy đây là những gì tôi muốn làm trong VBA (được chứng minh bằng C#) nhưng tôi không biết làm thế nào ...

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 
     } 
    } 
} 

Một điều cần lưu ý là RandomObject không có một defau công cộng lt constructor. Vì vậy, tôi không thể tạo một thể hiện của nó như Dim x As New RandomObject. MSDN nói rằng bạn không thể tạo một đối tượng mà không có một constructor mặc định thông qua COM nhưng bạn vẫn có thể sử dụng các loại đối tượng nếu nó được trả về bởi phương pháp khác ... 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.

Added: Đây là của tôi nỗ lực trong VB:

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

Trả lời

1

Vấn đề của bạn là phương pháp AttachedObjects() là tĩnh. COM không thể thực hiện các phương thức tĩnh. Trong COM, thao tác "tĩnh" duy nhất bạn có thể làm là "khởi tạo một lớp".

Do đó, để gọi phương thức AttachedObjects từ VBA, chỉ cần làm cho nó không tĩnh (ví dụ: loại bỏ từ khóa static trong định nghĩa của nó). Ngoài ra, phương thức có thể vẫn chính xác như bây giờ. Và mã VBA của bạn có vẻ OK - nên làm việc sau khi bạn sửa đổi phương thức.

Và chỉ trong trường hợp nó không hoạt động, đây là câu hỏi tiếp theo: bạn mắc lỗi nào chính xác và tại điểm nào?

1

để làm được việc này bạn cần phải tạo ra một RandomObjectFactory trong mã .net của bạn và có điều này tạo ra các ví dụ RandomObject để sử dụng trong VBA

nên cái gì như này:

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

bạn có thể mở rộng lớp này có nhiều định nghĩa chồng cho tạo ra phương pháp để tạo ra quá tải khác nhau của RandomObjects

UPDATE:

dựa trên sự hiểu biết đúng đắn về câu hỏi this questionthis one có thể sẽ hữu ích

+0

Vâng tôi không thực sự cố gắng "tạo" một thể hiện của RandomObject từ VBA. Tôi chỉ cố gắng để làm việc với một danh sách các RandomObjects được tạo ra trong lớp ResourceManagement (managed .NET). – PICyourBrain

+0

oh xin lỗi tôi đã đọc sai câu hỏi rồi. bạn muốn biết cú pháp vba cho một vòng lặp? vấn đề đầu tiên của bạn là bạn đã trả về một danh sách chung về phía com, nhưng com không hỗ trợ Generics (bạn nên có một cảnh báo trình biên dịch bắt đầu rằng đây là những gì bạn đang cố gắng làm.) Bạn có thể truy cập lớp ResourceManagement trong VBA? –

+0

Có. Trong dự án VBA, tôi đã thêm một tham chiếu đến hội đồng .NET.Sau đó, trong VBA tôi có thể làm điều này "Dim myObj As New ResourceManagment" nhưng sau đó làm thế nào để tôi gọi phương thức AttachedObjects. – PICyourBrain