2012-04-02 58 views
4

我已經用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); 
} 

在此先感謝

回答

3

更新答:而不是返回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 PostcodeFinder 
Dim results 
Set c = New PostcodeFinder 

results = c.SearchPostcodes(postcodeToSearch) 
+0

啊謝謝你。現在這個運行沒有錯誤,但我仍然不明白如何處理結果字符串數組。另外,如果我在下面放置了一些虛擬代碼以允許我放置斷點,那麼使用立即窗口鍵入'?results'我得到'運行時錯誤'13',類型不匹配。 – JMK 2012-04-02 18:20:19

+1

問題是,當您需要返回一個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

+0

用您的其他問題的解決方案更新了我的答案。雖然我不確定這是否是最好的解決方案,但它提供了預期的功能。 – countfromzero 2012-04-02 20:12:37

2

在VBA,在一個元素For Each循環必須循環通時是變體:

Dim c As New PostcodeFinder 
Dim results 

results = c.SearchPostcodes(postcodeToSearch) 

或者,你可以聲明從實例作爲單獨的數組。

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, ",")