Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Excel中的VBA代码调用WCF函数(通过引用参数)_Wcf_Excel_Pass By Reference_Vba - Fatal编程技术网

从Excel中的VBA代码调用WCF函数(通过引用参数)

从Excel中的VBA代码调用WCF函数(通过引用参数),wcf,excel,pass-by-reference,vba,Wcf,Excel,Pass By Reference,Vba,我已经开发了一个WCF服务,该服务正在成功运行。然后,我在Excel中编写了一些VBA代码,这些代码是根据本指南编写的- 它正在工作,我已经用带有参数和返回值的简单函数对它进行了测试——它正确地返回了结果。我现在需要的是通过引用传递几个参数,在函数中设置它们的值,然后返回。为此,我创建了此测试函数: // interface... [OperationContract] int Read(ref int val1, ref int val2); // implementation... pub

我已经开发了一个WCF服务,该服务正在成功运行。然后,我在Excel中编写了一些VBA代码,这些代码是根据本指南编写的-

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

// 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
// interface...
[OperationContract]
object[] Read();

// implementation...
public object[] Read()
{
    return new object[4] { 10, 20, "hello world", DateTime.Now };
}
我最后得到的值是20和0,而不是10和20

是否不支持超过1个“byref”参数,或者我在这里做错了什么

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


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

val1 = 0
val2 = 0

Call service1.Read(val1, val2)
MsgBox val1
MsgBox val2
// 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方法返回吗?我是说,而不是

int Read(ref int val1, ref int val2);
做点像

[DataContract]
struct MyDataStructure {

[DataMember]
int val0;

[DataMember]
int val1;

[DataMember]
int val2;

}

...

MyDataStructure Read();

不,不幸的是,我不能。当我从VBA调用它时,我得到一个异常“未设置必需的'Type'属性”。实际上,如果我在接口的任何地方定义了数据约定,那么我就不能从VBA调用任何WCF函数。这里有一个关于这个问题的问题(他最终使用了两个不同的接口来解决这个问题)哦,但是当我去重新阅读我使用的指南时,你给了我一个想法。它说:“我发现最好保留顶级的基元类型和基元类型的数组。数据契约似乎是不可能的。”。我可以使用数组!我可以返回一个对象数组。我需要测试一下