

Excel用のCOMをC#で作っております。

**Parameter.cs**

[code]

    [ClassInterface(ClassInterfaceType.None)]
    [ComDefaultInterface(typeof(IParameter))]
    [ComVisible(true)]
    public class Parameter : IParameter
    {
        public Member[] Members { get; set; }
    
        public Parameter()
        {
            Members = new Member[2];
            Members[0] = new Member(){ Name = "A"};
            Members[1] = new Member(){ Name = "B"};
            Members[2] = new Member(){ Name = "C"}
        }
    }
    
[/code]

**IParameter.cs**

[code]

    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    [ComVisible(true)]
    public interface IParameter
    {
        Member[] Members { get; set; }
    }
    
[/code]

VBA側でMemberクラスのインスタンスを生成する場合、以下のように記載

[code]

    Dim param as Object
    Set param = CreateObject("Parameter") ← 成功
    
    Dim count as Integer
    count = UBound(param.Members) ←countには2が入る
    MsgBox param.Members(0).Name ←Error! 0番目の要素にアクセスできない
    
[/code]

説明が長くなりましたが、上記でUBound(param.Members)では要素の数によって正しくUBound()の値が返ってきますが、各要素にアクセスしようとするとエラーになります。  
エラーメッセージは以下の通りです。

> Wrong number of arguments or invalid property assignment

どのようにすれば各要素にアクセスすることができるのでしょうか。


CC BY-SA 4.0
2022-03-31T11:06:37.453
88122
2022-04-01T01:26:47.523
12388
question
c# vba com
C#で作ったCOM内の配列要素にアクセスができない


VBにおけるUBoundは「個数」ではなく、「添え字の最大数」です。

元のC#のコードでは「new Member[2]」（要素数2）に対して、「Member[2] =
...」というように要素数3を期待しているコードがありますが、要素数はどちらでしょうか？

要素数2が正しく、LBoundが1であれば、添え字が1と2でアクセスできる2個の配列となっているのでしょう。ぜひ、LBoundも調べてみてください。


CC BY-SA 4.0
2022-03-31T14:52:39.237
88126
2022-03-31T14:52:39.237
4684
88122
answer


試していませんが、param.Members をいったん Variant で受けるとうまくいくかもしれません。

[code]

    Dim v As Variant
    Dim m As Member
    v = param.Members
    For i = LBounds(v) To UBounds(v)
        Set m = v(i)
    Next
    
[/code]


CC BY-SA 4.0
2022-04-01T01:26:47.523
88128
2022-04-01T01:26:47.523
50741
88122
answer