如何处理从VBA中的C#方法返回的字符串数组

我在C#中编写了一个返回字符串数组的程序集,C#代码如下:

[ComVisible(true)] public class PostcodeFinder { public string[] SearchPostcodes(string postCode) { var searchService = new QuickAddress("http://xxxx: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; } } 

然后我构建了这个程序集,确保在属性中勾选Register for COM interop box。 然后在Microsoft Access中,我将.tlb文件添加到引用中,并创建了一个带有几个控件的表单(其中一个是名为lstResultsListbox控件)。 在主按钮控件下,我有以下VBA代码:

 Private Sub btnSearch_Click() Dim postcodeToSearch As String postcodeToSearch = Me.txtPostcode Dim c As New PostcodeFinder Dim results results = c.SearchPostcodes(postcodeToSearch) End Sub 

编辑:这运行没有错误,但是当我在下面放一些虚拟代码以允许我放置断点后查询立即窗口的?results ,我收到以下错误:

运行时错误’13’ – 类型不匹配

实际上我想在VBA中重写以下C#代码:

 var results = c.SearchPostcodes(postcodeToSearch); foreach(var x in results) { lstResults.Items.Add(x); } 

提前致谢

更新的答案 :而不是返回string[] ,尝试返回object

 [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_Click子例程中,尝试:

 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循环中的元素在循环到数组时必须是Variant。

 Dim v As Variant For Each v In Array("value 1", "value 2", "value 3") ' do something with v Next v 

在立即窗口中键入?results出错,因为VBA无法将数组自动转换为字符串。 你必须告诉它你想要的数组的哪一部分, ?results(2) ,或者使用Join(sourcearray, delimiter)告诉它如何转换数组, ?Join(results, ",")