将集合字典数据从C#传递到宏

将集合字典数据从C#传递到宏,c#,excel,dictionary,vba,C#,Excel,Dictionary,Vba,我想将收集数据字典从C#代码传递到excel宏中。 我现在面临的问题是将字典传递到宏时出错 下面是我使用的excel模块中存在的宏代码的简单示例: Public Sub dictionaryTest1(dataku As Variant) Dim I As Integer For Each v In dataku.Keys MsgBox "Name: " & v & " Age: " & dataku.Item(v) Next End Sub 我 下面是我的c

我想将收集数据字典从C#代码传递到excel宏中。 我现在面临的问题是将字典传递到宏时出错

下面是我使用的excel模块中存在的宏代码的简单示例:

Public Sub dictionaryTest1(dataku As Variant)

Dim I As Integer
For Each v In dataku.Keys
    MsgBox "Name: " & v & " Age: " & dataku.Item(v)
Next
End Sub
我 下面是我的c代码:

使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用System.Windows.Forms;
使用Excel=Microsoft.Office.Interop.Excel;
使用Microsoft.Office.Core;
运用系统反思;
使用System.IO;
命名空间窗口宏
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
私有void RunMacro(对象oApp、对象[]或UNARGS)
{
oApp.GetType().InvokeMember(“运行”,
System.Reflection.BindingFlags.Default|
System.Reflection.BindingFlags.InvokeMethod,
null、oApp、oRunArgs);
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
字典dataku=新字典()
{
{“猫”,2},
{“狗”,1},
{“骆驼”,3},
{“鬣蜥”,5}
};
对象omising=System.Reflection.Missing.Value;
Excel.ApplicationClass oExcel=新的Excel.ApplicationClass();
oExcel.Visible=true;
Excel.Workbooks oBooks=oExcel.Workbooks;
Excel.\u ook=null;
//bin文件夹中excel文件的路径
string executableLocation=Path.GetDirectoryName(Assembly.GetExecutionGassembly().Location);
字符串xslpocation=Path.Combine(executableLocation,“File.xls”);
oBook=oBooks.Open(xslLocation、omising、omising、,
省略,省略,省略,省略,省略,省略,省略,省略,
省略,省略,省略,省略,省略,省略,省略,省略);
//通过传递字典数据“dataku”运行宏。
RunMacro(oExcel,新对象[]{“dictionaryTest1”,dataku});
//退出Excel并清理。
oBook.Close(假、省略、省略);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook);
oBook=null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks);
oBooks=null;
oExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel);
oExcel=null;
GC.Collect();//垃圾收集。
}
}
}

您应该更具体地说明您遇到的错误。无论如何,我认为您的问题在于您将宏传递给了错误类型的对象。即,您正在创建一个VBA不知道的
词典

您没有指定dictionaryTest1宏接受的类型,但我认为它是来自Microsoft脚本运行时的字典。如果是这种情况,您也应该在C#中创建此类对象。这意味着您必须将Microsoft脚本运行时添加到.NET项目的引用中,然后创建字典,该字典将以以下方式传递给宏:

        Scripting.Dictionary dataku = new Scripting.DictionaryClass();
        dataku.Add("cat", 2);
        dataku.Add("dog", 1);
        dataku.Add("llama", 3);
        dataku.Add("iguana", 5);

嗨,Francesco,我在运行c#脚本时在excel宏中收到错误消息。“运行时错误'424':需要对象”。知道如何创建对象字典数据并将其传递给它吗?如果我用你的方式,我会得到一些无效的参数,因为我无法从'string'转换为'ref object',这正是你在类型错误时得到的。我试图在excel文件中复制你的宏,在.NET项目中复制你的代码,这就是我得到的错误。然后我替换了字典的创建和初始化,一切都很好。从何处获得无效参数错误?我添加了引用Microsoft脚本运行时版本1.0。在中创建此词典。Scripting.Dictionary dataku=new Scripting.DictionaryClass();添加(“cat”,2);添加(“狗”,1);添加(“骆驼”,3);加上(“鬣蜥”,5);我收到消息“Scripting.IDictionary.Add(ref-object,ref-object)有一些无效参数。”另一条消息是相关的“无法从变量'string'/'int'转换为ref'object”。然后您可以尝试用这种代码替换
dataku.Add(“cat”,2);
(以及所有类似的行):
object k=“cat";             对象v=2;添加(参考k,参考v)
        Scripting.Dictionary dataku = new Scripting.DictionaryClass();
        dataku.Add("cat", 2);
        dataku.Add("dog", 1);
        dataku.Add("llama", 3);
        dataku.Add("iguana", 5);