vba中的COM对象的ArrayList返回<no variables =“”> </no>的n项

时间:2012-07-06 12:06:34

标签: c# vba com arraylist

我尝试使用C#ArrayList返回COM对象列表(在C#中开发),并在VBA中使用此COM对象列表(Excel 2007 ,. NET 4)

我有3个C#函数,我从Excel调用(VSTO项目)

    public ArrayList GetSimpleArray()
    {
        ArrayList arr = new ArrayList();
        arr.Add(3);
        arr.Add(2);
        return arr;
    }
    public ArrayList GetComplexArray()
    {
        ArrayList arr = new ArrayList();
        arr.Add(new Fund() { Id = "2" } );
        arr.Add(new Fund() { Id = "3" });
        return arr;
    }
    public IFund GetComplexObject()
    {
        return new Fund() { Id = "2" };
    }

与Fund和IFund一起定义:

[ComVisible(true)]
public interface IFund 
{
    string Id { get; set; }        
    string Name { get; set; }
}

[ComVisible(false)]
public sealed class Fund:IFund
{
    public string Id { get; set; }
    public string Name { get; set; }

    public Fund()
    {
    }

    public Fund(string id, string name)
    {
        this.Id     = id;            
        this.Name   = name;
    }
}

在Excel中我有:

Public Sub GetComObject()

  Call InitVSTOAddIn ' Initialise automationObject

  Dim complexObject
  Set complexObject = automationObject.GetComplexObject()

  Dim simpleArray
  Set simpleArray = automationObject.GetSimpleArray()

  Dim complexArray
  Set complexArray = automationObject.GetComplexArray()

End Sub

complexObject和simpleArray具有我正在寻找的值(complexObject是具有Id和Name的对象,simpleArray是具有2个元素“3”和“2”的ArrayList)。

问题出在complexArray上。它是一个包含2个项目的ArrayList,但每个项目都是“No Variables”(见附图)

VBA Locals

你知道为什么吗?

有没有办法在C#中返回COM对象列表并在VBA中使用它们?

做这样的事情是好的做法还是有更好的方法在VBA中使用C#对象?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

通过创建包含属性IFund [] ListFund

的IListFund,我找到了解决此问题的方法
[ComVisible(true)]
public interface IListFund
{
    public IFund[] ListFund { get; set; }
}

我可以在excel中获得:

Public Sub GetComObject()

  Call InitVSTOAddIn ' Initialise automationObject '

  Dim complexObject As ComEqd.IListFund
  Dim complexArr() As ComEqd.IFund

  Set complexObject = automationObject.GetComplexObject()
  complexArr = complexArr.ListFund

End Sub