【问题标题】:parser to convert .net dictionary or list to VBA's equivalent dictionary or collection解析器将 .net 字典或列表转换为 VBA 的等效字典或集合
【发布时间】:2012-10-01 00:10:28
【问题描述】:

我必须将 .net 字典或列表类型的对象传递给 VBA。 但是当我在 VBA 端传递 .net 字典时,我无法在 .net 端看到字典的元素。

我的 C# 代码

Dictionary<string,object> dict = new Dictionary<string,object>();
dict.Add("First", "1");
dict.Add("Second", "2");
dict.Add("third", "3");
dict.Add("Forth", "4");

我从 C# 调用 VBA 宏

Application.Run("MyVBAMacro", dict);

在 VBA 端我的宏是

public Sub MyVBAMacro(var as variant)

end Sub

我也试过

public Sub MyVBAMacro(var as Scripting.Dictionary)

end Sub

但对我不起作用。

在 VBA 的 WATCH 窗口中,我没有得到字典元素。

所以我认为 .net 和 VBA 对象不一样。 那么是否有任何解析类可以将我的 .net 对象转换为等效的 VBA 对象?

.net List 对象也有问题。 .net 数组工作正常,但我想将对象的字典或集合类型传递给 VBA。

如果有解决办法,请告诉我。

谢谢, 莫尼尔甘加尔

【问题讨论】:

  • 嗨 Monil,this 有帮助吗?

标签: c# vba excel vsto c#-to-vb.net


【解决方案1】:

在 VBA 和 .NET 之间进行互操作时需要使用 COM 这是一个简单的开始:COM Interop

但它很快就会变得更加复杂,我建议在执行此类任务时阅读通用 COM、编组、引用计数和类型库的主题。

使字典 COM 可见的简单示例

[ComVisible(true)]
public interface IDictWrapper
{
    object GetByKey(string key);
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IDictWrapper))]
public class DictWrapper: Dictionary<string,object>, IDictWrapper
{
    public object GetByKey(string key)
    {
        return base[key];
    }
}

【讨论】:

  • 嗨,我已经创建了您上面提到的 comVisible 接口和类。问题是当我将 .net 数组数据结构传递给 VBA 时,我能够在 VBA 端获得它。但我无法在 VBA 端获得 .net 字典类型的数据结构。在这种情况下你能帮我吗?
  • 数组默认编组msdn.microsoft.com/en-us/library/z6cfh6e6(v=vs.71).aspx。当你这样做时,引擎盖下会发生很多事情,按原样使用它可能会变得有点危险。
  • 那么是否有任何解析器可以将 .net 对象转换为 COM 或 VBA 类型的对象?我现在在 .net 端添加了 Scripting.Dictionary 的 dll,我正在向该 VBA 字典添加数据并将该字典传递到 VBA 端及其工作,但它需要大量时间,因为我的数据用于转换.net 字典到 VBA 字典。
  • 您将需要实现一个类似于我发布的 COM 可访问接口。我只能重复一遍,疯狂地尝试来回传递类型,直到它神奇地似乎工作会导致 COM 非常糟糕的事情。除非您确切知道自己在做什么,否则请自行控制。
  • 好的,但是我如何将我的 .net 字典转换为那个 VBA 字典。我有一个字符串形式的 json 结构,我在 JavaScriptSerializer 类的帮助下反序列化它。所以它创建了一些由字典和列表组成的嵌套对象。所以现在我想将这个嵌套结构传递给 VBA。那么我将如何实现呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 2022-11-12
  • 1970-01-01
  • 2012-08-11
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多