如何在c#中创建VBA.Collection()对象

时间:2010-12-15 04:41:04

标签: .net vba c#-4.0 excel-vba excel

我需要从C#代码中创建Interop VBA.Collection对象 我在我的项目中引用了Interop.VBA

当我打电话给他时:

var col = new VBA.Collection()

在运行时我遇到一个错误,说dll没有注册...
我发现:http://support.microsoft.com/kb/323737/en-us

它可能有效,但我的盒子上没有VB6编译器 我想知道你知道其他的解决方法(或者有人可以编译这个ActiveX给我?)

2 个答案:

答案 0 :(得分:4)

我没试过这个,但它可能有用。

为VB6的VBA6.dll创建导入库。创建自己的_Collection接口实现。使用此实现代替VBA.Collection类。

class MyCollection : VBA._Collection
{
    private Dictionary<object, object> _items = new Dictionary<object, object>();

    public void Add(ref object Item, [System.Runtime.InteropServices.OptionalAttribute]ref object Key, [System.Runtime.InteropServices.OptionalAttribute]ref object Before, [System.Runtime.InteropServices.OptionalAttribute]ref object After)
    {
        // Ignoring the Before and After params for simplicity
        _items.Add(Key, Item);
    }

    public int Count()
    {
        return _items.Count;
    }

    public System.Collections.IEnumerator GetEnumerator()
    {
        return _items.Values.GetEnumerator();
    }

    public dynamic Item(ref object Index)
    {
        return _items[Index];
    }

    public void Remove(ref object Index)
    {
        _items.Remove(Index);
    }
}

答案 1 :(得分:0)

我已经为vb.net改编了这个,并且必须修复添加的密钥,因为它在丢失时为空。

我测试后会编辑这篇文章。我需要确保它在VB6调用.Net dll时工作,将vba集合作为参数传递给它,然后.Net dll将另一个vba集合作为返回值传递回去。男人,如果它有效,这将为我省下这么多麻烦!

Public Class VBACollection
  Implements VBA._Collection

  Private _items As New Dictionary(Of Object, Object)

  Public Sub Add(ByRef Item As Object, Optional ByRef Key As Object = Nothing, Optional ByRef Before As Object = Nothing, Optional ByRef After As Object = Nothing) Implements VBA._Collection.Add
    ' Ignoring the Before and After params for simplicity
    Key = If(Key, Item)
    _items.Add(Key, Item)
  End Sub

  Public Function Count() As Integer Implements VBA._Collection.Count
    Return _items.Count
  End Function

  Public Function GetEnumerator() As System.Collections.IEnumerator Implements VBA._Collection.GetEnumerator, System.Collections.IEnumerable.GetEnumerator
    Return _items.Values.GetEnumerator()
  End Function

  Public Function Item(ByRef Index As Object) As Object Implements VBA._Collection.Item
    Return _items(Index)
  End Function

  Public Sub Remove(ByRef Index As Object) Implements VBA._Collection.Remove
    _items.Remove(Index)
  End Sub
End Class

修改

不,这不适用于VB6。 VB6说:

  

&#34; Class不支持自动化或不支持预期   接口&#34;

这里讨论的类是我的类,它使用VBACollection而不是VBA.Collection。 VBACollection与VBA.Collection不是一个相同的替身。我想找出原因并尝试假装COM接受它。