3

私は必死にこれをしようとしています。

この投稿で見つかった動作を再現できました。

http://damianblog.com/2009/07/05/excel-wcf/comment-page-1/#comment-64232

ただし、公開された wcf 関数に配列を渡すことができません。

私のWCFサービスはこのように機能します(intの配列も使用しようとしました)

public object[] GetSomeArray()
    {
        return  new object[] { 1, 2, 3, 4};
    }

    public object[] ReturnSomeArray(object someArray)
    {
        object[] temp = (object[]) someArray;
        for (int i = 0; i < temp.Length; i++)
        {
            temp[i] = (int)temp[i] + 1;
        }

        return temp;
    }

私のVBAコードは次のようになります。

Dim addr As String
...


Dim service1 As Object
Set service1 = GetObject(addr)

Dim columnsVar
columnsVar = Array(1, 2, 3)


Dim anotherArray As Variant
anotherArray = service1.ReturnSomeArray(columnsVar)

上記の最後の行には常に問題があります。WCF サービスから配列を返すことができるのに、同じ配列をパラメーターとして別の WCF 関数に渡すことができない理由がわかりません。
現在のエラー メッセージ

シリアル化エラーが発生しています。

どんな助けでも大歓迎です。

4

1 に答える 1

2

Type mismatchこの方法でVBAで配列変数を宣言した場合にのみ、同様の問題がエラーで発生します。

Dim anotherArray() As Variant

ただし、変数が次のように定義されている場合、エラーは消えます。

Dim anotherArray As Variant

あなたと私の同様のソリューションのその他の違いは次のとおりです。

//C#- my solution- without array[] definition:
public object[] ReturnSomeArray(object someArray)

//VBA- my solution -without array() definition:
Dim someArray As Variant 

編集: 2013-08-28

C#-Excel-Interopを使用して、ソリューションを検索する方法を試してテストすることを好みます。何かが機能する場合は、それに固執しますが、解決策やロジックのソースを示すのを忘れることがあります。

LINQ以下に、配列を操作するためのコードを示します。これらのコード スニペットは、C# から VBA にデータを取得する >> 並べ替えのために C# に戻す >> VBA に戻るという両方向で機能します。最終的に問題を解決するのに役立つことを願っています。

最初: いくつかの C# コード

    public object[] GetSomeArray()
    {
        return new object[] { 5, 2, 1, 7, 9, 1, 5, 7 };
    }

    public double[] ArraySorted(object tablica)
    {
        object[] obj = (object[])tablica;
        var filtr = from i in obj
                    orderby Convert.ToDouble(i)
                    select Convert.ToDouble(i);

        double[] wynik = (double[])filtr.ToArray();
        return wynik;
    }

2番目: VBAコード

Sub qTest_second_attempt()

'declare array variable
    Dim tmp()
'and other variables
    Dim addr As String
        addr = "UDFArrayLinqTest.ArrayLinq"
'get references
    Dim service1 As Object
    Set service1 = CreateObject(addr)

'get array from C#
    tmp = service1.GetSomeArray()

'pass this array to C# back to sort it
    Dim someArray As Variant
    someArray = service1.ArraySorted(tmp)

'check the result in Immediate window
    Debug.Print Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(someArray)))
    'result: 1 1 2 5 5 7 7 9

End Sub
于 2013-08-26T21:14:25.833 に答える