【问题标题】:Calling a WCF function (with parameters by reference) from VBA code in Excel从 Excel 中的 VBA 代码调用 WCF 函数(使用引用的参数)
【发布时间】:2013-04-25 11:11:56
【问题描述】:

我开发了一个成功运行的 WCF 服务。然后我在 Excel 中有一些 VBA 代码,是我按照本指南编写的 - http://damianblog.com/2009/07/05/excel-wcf/

它正在工作,我已经使用具有参数和返回值的简单函数对其进行了测试 - 它正确返回结果。我现在需要的是通过引用传递几个参数,在函数中设置它们的值,然后返回。为此我创建了这个测试函数:

// interface...
[OperationContract]
int Read(ref int val1, ref int val2);

// implementation...
public void Read(ref int val1, ref int val2)
{
    val1 = 10;
    val2 = 20;
}

我从 VBA 模块中这样称呼它:

val1 = 0
val2 = 0

Call service1.Read(val1, val2)
MsgBox val1
MsgBox val2

我最后得到的值是 20 和 0,而不是 10 和 20。

不支持超过 1 个 'byref' 参数还是我在这里做错了什么?

附:另一个有趣的事情是我不能将 val1 声明为整数或长整数,因为 service1.Read() 调用返回异常“类型不匹配”。它似乎只适用于 Variant 类型。


编辑:好的,我通过从函数返回一个对象数组来解决这个问题。像这样的:

// interface...
[OperationContract]
object[] Read();

// implementation...
public object[] Read()
{
    return new object[4] { 10, 20, "hello world", DateTime.Now };
}

在 VBA 中:

Dim val() As Variant

val = service1.Read()
MsgBox val(0)
MsgBox val(1)
MsgBox val(2)
MsgBox val(3)

工作就像一个魅力

【问题讨论】:

    标签: wcf excel pass-by-reference vba


    【解决方案1】:

    你能添加你的结构并从 wcf 方法返回吗?我的意思是,而不是

    int Read(ref int val1, ref int val2);
    

    做类似的事情

    [DataContract]
    struct MyDataStructure {
    
    [DataMember]
    int val0;
    
    [DataMember]
    int val1;
    
    [DataMember]
    int val2;
    
    }
    
    ...
    
    MyDataStructure Read();
    

    【讨论】:

    • 不,很遗憾,我不能。我得到一个例外“未设置所需的'类型'属性。”当我从 VBA 调用它时。实际上,如果我在接口的任何地方定义了数据协定,那么我就不能从 VBA 调用任何 WCF 函数。这是一个关于 stackoverflow.com/questions/8001926/… 的问题(他最终使用了 2 个不同的界面来解决这个问题)
    • 哦,但是当我去重读我使用的指南时,你只是给了我一个想法。它说:“我发现最好保留顶级原始类型和原始类型数组。数据协定似乎是不行的。”。我可以使用数组!我可以返回一个对象数组。我需要测试一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2018-02-11
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多