C# 通过c自动添加对Excel VBA的引用

C# 通过c自动添加对Excel VBA的引用,c#,vba,excel,C#,Vba,Excel,我向Excel文件中添加了一个宏(使用c代码),用于运行存储过程并执行它,但由于它没有ActiveX Data Objects 2.5库的引用,因此出现错误: complie错误:用户定义的类型未定义 当我手动添加那个引用时,它是可以的,但我想通过代码添加它,因为用户不能引用它 然后,我需要以编程方式检查用户PC,以查看是否存在对 Microsoft ActiveX Data Objects 2.5库或更高版本存在,如果不存在,请在“我的宏”中使用C代码或VBA代码创建它。最简单的解决方案可能是

我向Excel文件中添加了一个宏(使用c代码),用于运行存储过程并执行它,但由于它没有ActiveX Data Objects 2.5库的引用,因此出现错误:

complie错误:用户定义的类型未定义

当我手动添加那个引用时,它是可以的,但我想通过代码添加它,因为用户不能引用它

然后,我需要以编程方式检查用户PC,以查看是否存在对
Microsoft ActiveX Data Objects 2.5库或更高版本存在,如果不存在,请在“我的宏”中使用C代码或VBA代码创建它。

最简单的解决方案可能是在VBA宏中使用后期绑定。例如,如果我在子程序中声明:

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
这需要引用Microsoft ActiveX数据对象X.X库才能运行。但是,通过将对象声明为:

Dim cn As Object, rs As object
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
您可以避免添加引用的问题。这里有一个完整的子例程(早期绑定与晚期绑定)的不错的讨论和示例

或者,可以通过VBA本身添加引用。在本例中,您可以使用C打开工作簿,然后调用一个宏,该宏将检查适当的引用,如果缺少引用,则添加该引用。下面的代码取自

唯一需要更改的是strGUID变量。您可以使用下面的小表格为您想要使用的任何版本获取适当的strGUID。您可能也希望删除消息框部分,具体取决于您使用Excel所做的操作

╔═════════════════════════╦════════════════════════════════════════╗
║ Microsoft ADODB Version ║                  GUID                  ║
╠═════════════════════════╬════════════════════════════════════════╣
║ 2.5                     ║ {00000205-0000-0010-8000-00AA006D2EA4} ║
║ 2.6                     ║ {00000206-0000-0010-8000-00AA006D2EA4} ║
║ 2.7                     ║ {EF53050B-882E-4776-B643-EDA472E8E3F2} ║
║ 2.8                     ║ {2A75196C-D9EB-4129-B803-931327F72D5C} ║
║ 6.1                     ║ {B691E011-1797-432E-907A-4D8C69339129} ║
╚═════════════════════════╩════════════════════════════════════════╝
为了找到这些GUID值,我使用了下面的代码


最简单的解决方案可能是在VBA宏中使用后期绑定。例如,如果我在子程序中声明:

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
这需要引用Microsoft ActiveX数据对象X.X库才能运行。但是,通过将对象声明为:

Dim cn As Object, rs As object
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
您可以避免添加引用的问题。这里有一个完整的子例程(早期绑定与晚期绑定)的不错的讨论和示例

或者,可以通过VBA本身添加引用。在本例中,您可以使用C打开工作簿,然后调用一个宏,该宏将检查适当的引用,如果缺少引用,则添加该引用。下面的代码取自

唯一需要更改的是strGUID变量。您可以使用下面的小表格为您想要使用的任何版本获取适当的strGUID。您可能也希望删除消息框部分,具体取决于您使用Excel所做的操作

╔═════════════════════════╦════════════════════════════════════════╗
║ Microsoft ADODB Version ║                  GUID                  ║
╠═════════════════════════╬════════════════════════════════════════╣
║ 2.5                     ║ {00000205-0000-0010-8000-00AA006D2EA4} ║
║ 2.6                     ║ {00000206-0000-0010-8000-00AA006D2EA4} ║
║ 2.7                     ║ {EF53050B-882E-4776-B643-EDA472E8E3F2} ║
║ 2.8                     ║ {2A75196C-D9EB-4129-B803-931327F72D5C} ║
║ 6.1                     ║ {B691E011-1797-432E-907A-4D8C69339129} ║
╚═════════════════════════╩════════════════════════════════════════╝
为了找到这些GUID值,我使用了下面的代码


您可以使用后期绑定吗?您可以使用后期绑定吗?谢谢您的回复,我应该在哪里添加上述代码?因为我的codeSub按钮的第一行1_Click得到complie error的错误:用户定义类型未定义,当我手动添加引用时,它将是正常的,我的代码中有错误吗?在我的代码主体中,我经常调用存储过程hanks。我的错误已解决,我声明我的变量使用后期绑定,很抱歉,现在我有一个错误参数类型错误,超出此行的可接受范围cmd.Parameters.Append cmd.CreateParameterShipperID,adInteger,adParamInput,1,1当我添加Microsoft ActiveX Data Objects 2.5库的引用时,会很好。谢谢您的回复,我在哪里添加上述代码?因为我的codeSub按钮的第一行1_Click得到complie error的错误:用户定义类型未定义,当我手动添加引用时,它将是正常的,我的代码中有错误吗?在我的代码主体中,我经常调用存储过程hanks。我的错误已解决,我声明我的变量使用后期绑定,很抱歉,现在我有一个错误参数类型错误,超出了此行的可接受范围cmd.Parameters.Append cmd.CreateParameterShipperID,adInteger,adParamInput,1,1,当我添加Microsoft ActiveX Data Objects 2.5库的引用时,一切正常