我已經用C#編寫的組件,它返回一個字符串數組,在C#代碼如下:如何處理字符串數組從C#方法返回在VBA
[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;
}
}
然後我建立這個組件,確保在屬性中勾選Register for COM interop
框。然後在Microsoft Access中,我將.tlb
文件添加到引用中,並創建了一個帶有幾個控件(其中一個是Listbox
控件名爲lstResults
)的窗體。在主按鈕控制,我有以下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
立即窗口下面,讓我把一個斷點,我得到以下錯誤:
Run-time error '13' - Type mismatch
有效我想重寫VBA下面的C#代碼:
var results = c.SearchPostcodes(postcodeToSearch);
foreach(var x in results)
{
lstResults.Items.Add(x);
}
在此先感謝
啊謝謝你。現在這個運行沒有錯誤,但我仍然不明白如何處理結果字符串數組。另外,如果我在下面放置了一些虛擬代碼以允許我放置斷點,那麼使用立即窗口鍵入'?results'我得到'運行時錯誤'13',類型不匹配。 – JMK 2012-04-02 18:20:19
問題是,當您需要返回一個COM對象時,您從SearchPostcodes方法返回一個字符串數組。這是另一個SO線程詳細解決這個問題:http://stackoverflow.com/questions/948712/how-to-pass-an-array-from-c-sharp-function-to-vba。 – countfromzero 2012-04-02 18:42:13
用您的其他問題的解決方案更新了我的答案。雖然我不確定這是否是最好的解決方案,但它提供了預期的功能。 – countfromzero 2012-04-02 20:12:37