3

C# ArrayList を使用して COM オブジェクト (C# で開発) のリストを返し、この COM オブジェクトのリストを VBA (Excel 2007、.NET 4) で使用しようとしています。

Excel (VSTO プロジェクト) から呼び出す 3 つの C# 関数があります。

    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 ですが、各項目は「変数なし」です (添付の図を参照)。

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 に答える