C# 创建vba用的类库
C#创建VBA可调用的COM组件具体分为三个关键步骤:首先编写标记为COM可见的类并实现接口,然后编译为DLL文件,再通过regasm注册到系统注册表。之后VBA即可用CreateObject("ToolLib.ToolCom")调用其方法。核心在于代码标记、编译与注册这三个环节。
一. 需求
写VBA代码的时候,经常会遇到这样的场景:用CreateObject创建一个对象,然后调用它的方法。比如下面这个发GET请求的例子:
Sub SendGetRequest()
Const url = "https://api.github.com"
' 创建http请求对象
Dim http As Object
Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
' 发送get请求
http.Open "GET", url, False
http.Send
Debug.Print http.ResponseText
End Sub
现在,需求变了——要用CreateObject("ToolLib.ToolCom")创建一个对象,然后调用它的Hello和Add方法。就像这样:
Sub MainSub()
Dim obj As Object
Set obj = CreateObject("ToolLib.ToolCom")
MsgBox obj.Hello("World")
MsgBox obj.Add(3, 5)
End Sub
问题来了:怎么用C#写一个能被VBA调用的COM组件,把.NET类暴露成COM可见对象?核心步骤无非是:
- C#写一个类
- 标记为COM可见
- 编译成DLL
- 注册到系统(regasm)
- VBA通过
CreateObject调用
说白了,就是给VBA造一个“外设”组件。下面咱们一步步走通。
二. 初始化项目
先创建一个类库项目:
dotnet new classlib -n ToolLib
然后修改.csproj文件,配置要盯紧几个关键点:
net48 false false none
注意:目标框架用net48(.NET Framework 4.8)最稳,RegisterForComInterop设为false,因为我们后面手动注册。另外记得关闭自动生成AssemblyInfo,不然会冲突。
三. 项目代码
3.1 Tool.cs主类
直接上代码,核心是接口和实现类,全都打上COM可见的标记。
using System.Runtime.InteropServices;
namespace ToolLib
{
[ComVisible(true)]
[Guid("1D4C98EC-D988-4D6C-8DD6-189E238D7B4E")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IToolCom
{
int Add(int a, int b);
string Hello(string name);
}
[ComVisible(true)]
[Guid("6143FB0B-9C17-4859-860C-6DA4A466ECD1")]
// 显示声明ProgId, 便于vba通过 CreateObject("ToolLib.ToolCom") 创建对象
[ProgId("ToolLib.ToolCom")]
[ClassInterface(ClassInterfaceType.None)]
public class ToolCom : IToolCom
{
public int Add(int a, int b)
{
return a + b;
}
public string Hello(string name)
{
return $"Hello, {name}";
}
}
}
这里有几个要点:
[ComVisible(true)]:必须加,否则VBA看不见。[Guid("...")]:类库的唯一标识符,可以用Visual Studio的“工具→创建GUID”生成,或者用在线工具。[ProgId("ToolLib.ToolCom")]:显式声明ProgId,这样VBA里就能直接用CreateObject("ToolLib.ToolCom"),而不是依赖默认的命名规则。

3.2 AssemblyInfo.cs配置类
接下来是程序集信息,这部分对VBA的引用显示很重要:
using System.Reflection;
using System.Runtime.InteropServices;
// 文件→属性→详细信息→文件说明
[assembly: AssemblyTitle("ToolLib_Test")]
// vba→工具→引用 时显示的信息
[assembly: AssemblyDescription("FengYeHong VBA COM Library")]
[assembly: AssemblyCompany("FengYeHong-Company")]
// 文件→属性→详细信息→产品名称
[assembly: AssemblyProduct("ToolLib_for_vba")]
// 非常重要
// 类型库 GUID
[assembly: Guid("9F3E7D2C-1234-4A56-8888-ABCDEF123456")]
// 文件→属性→详细信息→产品版本
[assembly: AssemblyVersion("1.0.0.1")]
注意Guid是类型库的GUID,和接口/类的GUID不是一回事,别搞混了。这个GUID会在VBA的“工具→引用”对话框里显示。

四. 编译
工程是类库,直接编译生成.dll文件。在Visual Studio里按F6,或者命令行里dotnet build,搞定。

五. 将.dll类库注册到系统
这一步篇幅较长,不在此篇文章展开,详情请参考下面这篇文章。简单说就是用管理员权限打开PowerShell,执行regasm命令,把DLL注册到COM注册表中。注册成功后,VBA才能找到这个组件。
六. vba中使用
等DLL注册到系统之后,VBA就可以正常使用了。打开任意Office文档(比如Excel),按Alt+F11进入VBA编辑器,在“工具→引用”里勾选你的组件(名称就是AssemblyDescription里写的“FengYeHong VBA COM Library”),然后就可以写代码调用了。

整个过程走下来,你会发现:给VBA写一个C#的COM组件,核心就三点——代码加标记、编译成DLL、注册到系统。后面在VBA里用起来和调用原生对象一样顺手。
WPS Office是一款面向macOS用户的综合办公套件,将文字处理、电子表格、演示文稿、PDF工具、模板与云协作整合在同一应用中。它兼容常见Microsoft Office格式,支持Intel及Apple芯片Mac,基础功能可免费使用,
Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。
REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。
Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理工具,可在 Windows 上完成照片修饰、选区抠图、图层合成、文字排版、绘画及生成式编辑。软件采用订阅授权,由 Creative Cloud 管理安装、更新与许
Adobe InDesign 是面向印刷与数字出版的专业页面排版工具,可制作书籍、杂志、宣传册、海报、交互式 PDF 和电子书。它提供精细的文字样式、多页面管理、印前检查及多格式输出能力,并能与 Photoshop、Illustrator
Adobe Illustrator 是用于绘制矢量图形、插画、图标、徽标和版式的专业设计工具。它以路径和锚点为核心,作品放大后仍能保持清晰,并提供画板、文字、渐变、图像描摹及精确变换等功能,适合品牌视觉、印刷物料、数字界面和商业插画创作。













