Как мне обработать массив строк, возвращенный из метода C # в VBA - PullRequest
3 голосов
/ 02 апреля 2012

Я написал сборку в C #, которая возвращает строковый массив, код C # приведен ниже:

[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

Редактировать: Это выполняется без ошибок, однако, когда я запрашиваю окно Immediate с помощью ?results после добавления некоторого фиктивного кода ниже, чтобы позволить мнепоместив точку останова, я получаю следующую ошибку:

Ошибка времени выполнения '13' - Несоответствие типов

По сути, я хочу переписать следующий код C # в VBA:

var results = c.SearchPostcodes(postcodeToSearch);

foreach(var x in results)
{
    lstResults.Items.Add(x);
}

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

Обновленный ответ : Вместо возврата 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)
2 голосов
/ 03 апреля 2012

В 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 в Immediate Window приводит к ошибке, потому что VBA не может автоматически преобразовать массив в строку. Вы должны либо указать ему, какую часть массива вы хотите, ?results(2), либо использовать Join(sourcearray, delimiter), чтобы указать, как преобразовать массив, ?Join(results, ",").

...