Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL

注:本文在翻译过程中,图片会与原文章有些差异,主要是我为了更好的让大家看清楚做了一个图文诠释。

原文地址:http://www.geeksengine.com/article/create-dll.html 感谢原作者的文章。

我正在更新我在访问VBA创建和跨越,我需要一些封装的功能在DLL中的场景来了一个应用程序。我以前用VB(Visual Basic中5和6)多年前创建的DLL。最好的办法是使用C#或VB.Net创建DLL来实现。

创建在C#或VB.Net一个DLL并不难,只要你有面向对象编程经验或知识。创建DLL后,我试图从Access VBA编辑引用它,但一直得到消息“无法添加到指定文件的引用。”在这个问题上经过一番研究,我了解需要以下操作:

(1)如何正确地创建Access或Excel中的DLL(或在任何Microsoft Office应用程序或VB6中使用)http://blog.csdn.net/kongwei521/article/details/77921436

(2)如何正确地将C#或VB.Net的DLL在开发机器或者生成环境机器中注册 http://blog.csdn.net/kongwei521/article/details/77929273

(3)如何正确地在Access VBA或Excel VBA内引用访问C#或VB.Net写的DLL http://blog.csdn.net/kongwei521/article/details/77929277

在本文中,我将向你展示如何正确地在Visual Studio中创建一个C#或VB.Net DLL和使用它的MS Access,Excel的VBA或VB6应用程序内。希望提示可以为您节省几个小时或头痛的日子。

1. 必须以管理员身份运行 Visual Studio(你需要管理员权限来让 Visual Studio 正确注册 DLL。您可以使用 regasm 命令去注册,不过如果使用 Visual Studio 会容易些)。创建一个新的C#(或VB.Net)项目,然后选择类库作为项目 ,命名为:SimpleCalc


下面我创建了一个简单的计算类测试。这个类有两个可变构件以及一个Add()方法。该方法将两个整数计算并返回结果。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleCalc
{
    public class Calc
    {
        private int numberOne = 0;
        private int numberTwo = 0;

        public void SetNumberOne(int number)
        {
            numberOne = number;
        }

        public void SetNumberTwo(int number)
        {
            numberTwo = number;
        }

        // Add two integers
        public int Add()
        {
            return numberOne + numberTwo;
        }
    }
}



2:配置项目属性,使其COM可见。鼠标右键点击项目SimpleCalc的属性打开项目属性的对话窗口。


当打开项目属性窗口中后,点击应用程序选项卡,然后单击【程序集信息】按钮。



【程序集信息】打开的窗口,选中使程序集COM可见(M)

在VB或VBA创建的应用程序是基于COM的应用程序。所以,你在C#或VB.Net创建的类库必须作为一个COM可见组件来创建。这使得基于COM的应用程序调用类库的成员变量和方法。



3.注册为COM互操作。

除了使DLL的使程序集COM可见(M),我们还需要将此DLL在Windows中注册为COM组件。根据你的的情况下有几种方法可以做到这一点。

对于开发的电脑,我们可以在 Visual Studio 中勾选 "【为COM互操作注册(C)】" 选项。在项目属性窗口,单击生成选项卡。然后勾选【为COM互操作注册(C)】(根据您的Visual Studio版本,它可能是在一个不同的选项卡上)。这使得Visual Studio中自动执行两件事情,当项目完成编译。首先,它会生成一个.TLB类型库文件。其次,它将在 Windows 注册表中注册 COM 组件的类信息。

【为COM互操作注册(C)】属性指定应用程序是否会否将 com 对象公开给客户端应用程序, 以便它们可以透明地与 com 对象进行交互。


下面是在 Windows 注册表中显示已编译后的程序集注册内容, 以便 COM 客户端可以透明地使用. NET 类。请注意, DLL 的路径存储在CodeBase属性中。

下图需要打开 控制面板=组件服务=》com+组件


要注册其他计算机上,如生产环境中的电脑,您可以通过使用RegAsm.exe注册程序集。请参见另外一篇文章的详细信息。

4.编译该项目。

生成解决方案。然后进入bin文件夹。取决于您的勾选是否是调试或发布版本,你可以在Bin目录下找到的编译后的DLL和任何调试.TLB类型库文件。

在我们的例子中,它发布的路径是D:\ CSHARP \ SimpleCalc \ SimpleCalc \ BIN \


5.将生成类型库文件复制到Windows系统文件夹目录下。

Windows系统文件夹目录【C:\Windows\System32】是DLL和类型库的默认位置,让我们的类型库生成后的SimpleCalc.tlb复制到此目录下

OK至此已经生成在VBA中要调研的tld了

6.从Access 、Excel、Word 等按Ctrl+F11进入VBA 编辑器进行引用生成的类库文件。

注:我这里是创建的excel文件进行测试的,原文中用的是access文件

首先,创建一个新的 Access 数据库,打开 Visual Basic 代码编辑器。在菜单中点工具-> 引用



点击引用窗口时,单击浏览按钮。


然后点击浏览(B),打开 C:\Windows\System32文件夹目录后选择 SimpleCalc.tlb打开。



点击打开完成后,SimpleCalc将会显示在你的参照引用列表中,你需要向下移动并在参照引用列表中找到并勾选中。然后单击确定关闭引用窗口。或者你可以选择进行上移

您可以在注册表中的截图记得上面有在Codebase项一个DLL路径值。VBA将使用此注册表信息来查找调用的DLL。在我们例子中,它是D:\ CSHARP \ SimpleCalc \ SimpleCalc \ BIN \发布\ SimpleCalc.dll


7.在 VBA 代码中使用SimpleCalc生成的DLL。

若要使用 C# DLL 中的变量和方法,我们需要调用 VBA 里面的参照引用 DLL。将一个按钮添加到 Access 窗体,然后向其添加一个 click 事件。在 click 事件中我们调用在 VBA 模块中创建的 test()方法


下面是一个示例: 在VBA 调用 SimpleCalc.dll。test() 函数调用.Net DLL 通过从 Calc 类创建一个新的对象,然后调用其方法。




Private Sub CommandButton1_Click()
Call test
End Sub
Public Function test()
    Dim lngResult As Long
    
    Dim objCalc As SimpleCalc.Calc
    Set objCalc = New SimpleCalc.Calc
    
    objCalc.SetNumberOne (3)
    objCalc.SetNumberTwo (6)
    
    lngResult = objCalc.Add()
        
End Function

如果我们调试并单步调试并监视lngResult变量 ,我们将会看到,执行调用 C# DLL 内部计算后并把结果值9返回到 VBA变量中。你可以看到在即时监视窗口或鼠标移动到变量lngResult 上就会显示结果值。

Excel:


Access:


在这篇文章中,我们经历了创建.Net C# DLL,然后使用它 在VBA调用访问的步骤。它带来.Net 的力量到 Microsoft Office 应用程序。在这篇文章的局限性是 Visual Studio在我们的开发机器只自动注册了 DLL 和类型库。我们没有介绍如何将 DLL 部署到生成环境的电脑上。在这种情况下,查阅有关如何使用 Regasm.exe (程序集注册工具) 在目标机器上注册 DLL 请参另外一篇文章注意您也可以为您的应用程序创建安装程序包和 regasm.exe 作为自定义命令添加到安装程序包中。


您编码愉快 !

其他文章系列:

(1)如何正确地创建Access或Excel中的DLL(或在任何Microsoft Office应用程序或VB6中使用)http://blog.csdn.net/kongwei521/article/details/77921436

(2)如何正确地将C#或VB.Net的DLL在开发机器或者生成环境机器中注册 http://blog.csdn.net/kongwei521/article/details/77929273

(3)如何正确地在Access VBA或Excel VBA内引用访问C#或VB.Net写的DLL http://blog.csdn.net/kongwei521/article/details/77929277




  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
是的,VB.NET 提供了多种方法将 Excel 文件转换为 Access 数据库,以下是其的两种方法: 1. 使用 OleDb 连接器 你可以使用 OleDb 连接器连接 Excel 文件和 Access 数据库,并将数据从 Excel 文件读取到 DataSet 对象,然后将 DataSet 对象写入 Access 数据库。以下是代码示例: ```vb.net Dim excelConnectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\myFolder\myExcelFile.xlsx;Extended Properties='Excel 12.0 Xml;HDR=YES;'" Dim accessConnectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\myFolder\myAccessFile.accdb;Persist Security Info=False;" Dim excelConnection As OleDbConnection = New OleDbConnection(excelConnectionString) Dim accessConnection As OleDbConnection = New OleDbConnection(accessConnectionString) Dim adapter As OleDbDataAdapter = New OleDbDataAdapter("SELECT * FROM [Sheet1$]", excelConnection) Dim dataSet As DataSet = New DataSet() adapter.Fill(dataSet, "ExcelData") Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(adapter) builder.QuotePrefix = "[" builder.QuoteSuffix = "]" adapter.UpdateCommand = builder.GetUpdateCommand() adapter.InsertCommand = builder.GetInsertCommand() adapter.DeleteCommand = builder.GetDeleteCommand() accessConnection.Open() adapter.Update(dataSet.Tables("ExcelData")) accessConnection.Close() ``` 在上面的代码,我们首先创建了两个 OleDbConnection 对象,一个用于连接 Excel 文件,一个用于连接 Access 数据库。然后,我们使用 OleDbDataAdapter 对象读取 Excel 文件的数据,并将数据填充到 DataSet 对象。接下来,我们创建了一个 OleDbCommandBuilder 对象,用于自动生成更新、插入和删除命令。最后,我们使用 OleDbDataAdapter 对象将 DataSet 对象的数据写入 Access 数据库。 2. 使用 COM 对象 你也可以使用 COM 对象来读取 Excel 文件,然后使用 ADO.NET 连接器将数据写入 Access 数据库。以下是代码示例: ```vb.net Dim excelApplication As Object = CreateObject("Excel.Application") Dim excelWorkbook As Object = excelApplication.Workbooks.Open("C:\myFolder\myExcelFile.xlsx") Dim excelWorksheet As Object = excelWorkbook.Worksheets("Sheet1") Dim accessConnectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\myFolder\myAccessFile.accdb;Persist Security Info=False;" Dim accessConnection As OleDbConnection = New OleDbConnection(accessConnectionString) Dim adapter As OleDbDataAdapter = New OleDbDataAdapter("SELECT * FROM [Sheet1$]", accessConnection) Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(adapter) builder.QuotePrefix = "[" builder.QuoteSuffix = "]" Dim dataSet As DataSet = New DataSet() adapter.Fill(dataSet, "AccessData") Dim table As DataTable = dataSet.Tables("AccessData") For rowIndex As Integer = 2 To excelWorksheet.UsedRange.Rows.Count Dim row As DataRow = table.NewRow() For columnIndex As Integer = 1 To excelWorksheet.UsedRange.Columns.Count row(columnIndex - 1) = excelWorksheet.Cells(rowIndex, columnIndex).Value Next table.Rows.Add(row) Next accessConnection.Open() adapter.Update(dataSet.Tables("AccessData")) accessConnection.Close() excelWorkbook.Close(False) excelApplication.Quit() ``` 在上面的代码,我们首先使用 CreateObject 函数创建了一个 Excel.Application 对象,并打开了 Excel 文件和工作表。然后,我们创建了一个 OleDbDataAdapter 对象,并使用 OleDbCommandBuilder 对象自动生成更新、插入和删除命令。接下来,我们使用 ADO.NET 连接器将数据从 Access 数据库读取到 DataSet 对象。然后,我们遍历 Excel 工作表的数据,将数据填充到 DataTable 对象。最后,我们使用 OleDbDataAdapter 对象将 DataTable 对象的数据写入 Access 数据库。注意,我们需要手动关闭 Excel 应用程序和工作簿。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值