3

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

我有 3 个从 Excel 调用的 C# 函数(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 和 I Fund 定义:

[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,但每个项目都是“无变量”(见附图)

VBA 本地人

你知道为什么吗?

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

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

谢谢你的帮助

4

1 回答 1

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
于 2012-07-10T10:32:12.683 回答