如何处理VBA中C#方法返回的字符串数组
我用C编写了一个程序集,它返回一个字符串数组,C代码如下:如何处理VBA中C#方法返回的字符串数组,c#,vba,com,vb6,C#,Vba,Com,Vb6,我用C编写了一个程序集,它返回一个字符串数组,C代码如下: [ComVisible(true)] public class PostcodeFinder { public string[] SearchPostcodes(string postCode) { var searchService = new QuickAddress("http://x.x.x.x:xxxx/") {Engine = Q
[ComVisible(true)]
public class PostcodeFinder
{
public string[] SearchPostcodes(string postCode)
{
var searchService = new QuickAddress("http://x.x.x.x:xxxx/")
{Engine = QuickAddress.EngineTypes.Singleline, Flatten = true};
var mPicklist = searchService.Search("GBR", postCode, PromptSet.Types.OneLine);
var x = mPicklist.Picklist.Items.Count();
var resultsToReturn = new string[x];
for (var i = 0; i < x; i++)
{
resultsToReturn[i] = mPicklist.Picklist.Items[i].PartialAddress;
}
return resultsToReturn;
}
}
编辑:这运行时没有错误,但是当我用?results
查询即时窗口时,在下面放置一些伪代码以允许我放置断点后,我得到以下错误:
运行时错误“13”-类型不匹配
实际上,我想在VBA中重写以下C#代码:
var results = c.SearchPostcodes(postcodeToSearch);
foreach(var x in results)
{
lstResults.Items.Add(x);
}
提前感谢更新的答案:请尝试返回
对象,而不是返回字符串[]
:
[ComVisible(true)]
public class PostcodeFinder
{
public object SearchPostcodes(string postCode)
{
//Unchanged code
return (object)resultsToReturn;
}
}
执行?results
(您需要指定一个索引,例如?results(0)
)时,仍然会在即时窗口中出现类型不匹配错误,但是您可以通过以下方式迭代数组:
results = c.SearchPostcodes(postcodeToSearch)
Dim result As Variant
For Each result In results
MsgBox result
Next result
原始答案:您需要实例化PostcodeFinder类。在btnSearch_单击子例程中,尝试:
Dim c As New PostcodeFinder
Dim results
results = c.SearchPostcodes(postcodeToSearch)
或者,您可以将声明与实例化分开,如下所示:
Dim c As PostcodeFinder
Dim results
Set c = New PostcodeFinder
results = c.SearchPostcodes(postcodeToSearch)
在VBA中,通过数组循环时,For Each循环中的元素必须是变量
Dim v As Variant
For Each v In Array("value 1", "value 2", "value 3")
' do something with v
Next v
在即时窗口中键入?results
时出错,因为VBA无法将数组自动转换为字符串。您必须告诉它您想要数组的哪一部分,?结果(2)
,或者使用Join(sourcearray,delimiter)
告诉它如何转换数组,?Join(results,”)
谢谢。现在运行时没有错误,但是我仍然不知道如何处理结果字符串数组。另外,如果我在下面放置了一些伪代码以允许放置断点,那么使用即时窗口键入?results
我得到运行时错误'13',键入不匹配。问题是,当需要返回COM对象时,您正在从SearchPostcodes方法返回字符串数组。下面是另一个SO线程,该线程使用解决方案详细说明了此问题:。已使用其他问题的解决方案更新了我的答案。虽然我不确定这是否是最好的解决方案,但它提供了预期的功能。
Dim v As Variant
For Each v In Array("value 1", "value 2", "value 3")
' do something with v
Next v