【问题标题】:How do I handle a string array returned from a C# Method in VBA如何处理从 VBA 中的 C# 方法返回的字符串数组
【发布时间】:2012-04-16 09:46:08
【问题描述】:

我用 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 文件添加到引用中,并创建了一个带有几个控件的表单(其中一个是名为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);
}

提前致谢

【问题讨论】:

    标签: c# vba com vb6


    【解决方案1】:

    更新答案:不要返回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)
    

    【讨论】:

    • 啊,谢谢。现在它运行没有错误,但是我仍然不明白如何处理生成的字符串数组。另外,如果我在下面放了一些虚拟代码来放置断点,然后使用即时窗口输入?results 我得到Run-time error '13', Type mismatch
    • 问题是当您需要返回一个 COM 对象时,您从 SearchPostcodes 方法返回一个字符串数组。这是另一个 SO 线程,详细说明了此问题的解决方案:stackoverflow.com/questions/948712/…
    • 用您其他问题的解决方案更新了我的答案。虽然我不确定这是否是最佳解决方案,但它提供了预期的功能。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-05
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2015-06-09
      • 1970-01-01
      • 2015-03-29
      相关资源
      最近更新 更多