将列表从C#传递到VBA

本文关键字:VBA 列表 | 更新日期: 2023-09-27 18:29:08

我正在用C#编写一个DLL,用于VBA。我正在编写的一个方法将获得一个自定义类型的列表(PdfReaderPage)。我的问题是:我可以将自定义类型的列表传递到VB集合中吗?我想做

public Microsoft.VisualBasic.Collection GetPageByKeyWord(String keyword)
{
    //Do some code to find correct page list
    //Get List<PdfReaderPage> myList
    Microsoft.VisualBasic.Collection VbCollection = myList;
    return VbCollection;
}

但我不确定我是否能。A.)将列表转换为集合,或者B.)这是最好的方法。

将列表从C#传递到VBA

A)将列表转换为集合,可以完成:

[ClassInterface(ClassInterfaceType.AutoDual)]
public class PdfReaderPage
{        
    public int Foo;
}
[ClassInterface(ClassInterfaceType.AutoDual)]
public class AccessibleFromVBA
{
    public Microsoft.VisualBasic.Collection PdfReaderPages()
    {
        /* 1. make a List of PdfReaderPage elements */
        var csharp_list = new List<PdfReaderPage>()
        { 
            new PdfReaderPage() {Foo=1},
            new PdfReaderPage() {Foo=2},
            new PdfReaderPage() {Foo=3}
        };
        /* 2. convert it into a vb collection */
        var vb_coll = new Microsoft.VisualBasic.Collection();
        csharp_list.ForEach(x => vb_coll.Add(x));
        /* 3. deliver it */
        return vb_coll;
    }
}

有一件奇怪的事情需要观察:在C#中,Collection实例实际上会比Count报告多包含一个项,因为集合在C#中是基于0的,在VBA中是基于1的,所以索引[0]处的项总是包含静态本地化字符串"空占位符以调整基于1的数组"