在Excel中引用Visual Studio.NET 2008编写的COM组件

最近在研究Office编程,发现了这个领域也是非常非常的有趣,而且,市场也是大大的有.今天遇到的一个课题是:用VS2008编写一个COM组件,并在Excel中用VBA调用这个COM组件实现一些功能.以下是示例代码:

1,创建一个Class Library Project.并编写如下代码(如果选择[New Item]->[Com Class],则不需要定义接口,可以直接对类进行编程,这个类是COM可见的)

ContractedBlock.gif ExpandedBlockStart.gif .NET Code
Imports System
Imports System.Runtime.InteropServices

<Guid("b9c7ce7b-86f4-4406-9f0d-9b2e2c844859")> <ComVisible(True)> Public Interface ITest
    
Function GetTest() As Integer
End Interface


<Guid("ca1bd88b-4211-49cb-9211-70f6e1d414db")> <ComVisible(True)> Public Class TestClass
    
Implements ITest

    
Public Sub New()

    
End Sub

    
Public Function GetTest() As Integer Implements ITest.GetTest
        
Return 100
    
End Function
End Class

 

2,编译,使用签名为程序集构建强命名,在项目属性[signing]节,选中[Sign the assembly]复选框,你可以新建key file,也可以使用现有的.强命名对Excel 2007调用来讲,似乎不是必须的,这个可以理解,因为Excel 2007已经内置了对.NET的很多支持.但是如果针对Excel 2000,如果不使用强命名的程序集,你将会看到"自动化错误"(Excel 2003应该也是一样,不过我没有测试过).

3,使用regasm工具对程序集(这里是ClassLibrary1.dll)进行COM组件的注册.如果是Excel 2000/2003的应用,务必使用"/tlb"和"/codebase"选项,有关这两个选项的说明,MSDN上都有,非常详细.

4,对于Excel 2007来讲,这里就可以直接在VBA中使用了.但是如果是Excel 2000/Excel 2003,还需要编辑一个配置文件,内容如下,保存成"Excel.exe.config"文件,并copy到Excel执行文件目录.这是因为Excel 2000/Excel 2003默认支持的运行时不是2.0版.

ContractedBlock.gif ExpandedBlockStart.gif Config
<configuration>

<startup>

<supportedRuntime version="v2.0.50727" />

startup>

configuration>

 

5,打开Excel,按下[Alt]+[F11]开始编辑宏.在VBA界面选择[Tools]->[References],选择引用自己刚刚注册的COM组件ClassLibrary1.键入以下VBA代码,保存宏,并在Excel中选择一个单元格,可以看到显示结果.

ContractedBlock.gif ExpandedBlockStart.gif VBA Code
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim a As ClassLibrary2.ITest

Set a = New ClassLibrary2.TestClass

Sheet1.Cells(
11= a.GetTest

End Sub

 

结语:如果是Excel 2007的应用,网上资料很多,Google一下无数条.不过我恰好遇到的客户端是Excel 2000,花了很大力气才找到这个办法.特此记录,希望对自己对别人都有用.

转载于:https://www.cnblogs.com/makemelaugh/archive/2008/11/05/1327512.html

你可能感兴趣的:(在Excel中引用Visual Studio.NET 2008编写的COM组件)