C#?創(chuàng)建vba用的類庫(kù)
一. 需求
??寫(xiě)vba代碼的時(shí)候,會(huì)想下面這樣使用CreateObject創(chuàng)建一個(gè)對(duì)象,然后使用其中的方法
Sub SendGetRequest()
Const url = "https://api.github.com"
' 創(chuàng)建http請(qǐng)求對(duì)象
Dim http As Object
Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
' 發(fā)送get請(qǐng)求
http.Open "GET", url, False
http.Send
Debug.Print http.ResponseText
End Sub??先要求在vba中使用CreateObject("ToolLib.ToolCom")創(chuàng)建一個(gè)對(duì)象,然后使用其中的方式。
Sub MainSub()
Dim obj As Object
Set obj = CreateObject("ToolLib.ToolCom")
MsgBox obj.Hello("World")
MsgBox obj.Add(3, 5)
End Sub??用C# 寫(xiě)一個(gè)能被VBA調(diào)用的COM組件,把.NET類暴露成COM可見(jiàn)對(duì)象。
C#寫(xiě)類- 標(biāo)記為
COM可見(jiàn) - 編譯成
DLL - 注冊(cè)到系統(tǒng)(regasm)
- VBA 通過(guò)
CreateObject調(diào)用
二. 初始化項(xiàng)目
??創(chuàng)建一個(gè)類庫(kù)
dotnet new classlib -n ToolLib
??修改.csproj文件如下所示
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- 推薦用 .NET Framework -->
<TargetFramework>net48</TargetFramework>
<!-- 關(guān)閉自動(dòng)注冊(cè) -->
<RegisterForComInterop>false</RegisterForComInterop>
<!-- 關(guān)閉自動(dòng)生成AssemblyInfo -->
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<!-- 不輸出調(diào)試信息 -->
<DebugType>none</DebugType>
</PropertyGroup>
</Project>三. 項(xiàng)目代碼
3.1Tool.cs主類
??Tool.cs
[ComVisible(true)]:設(shè)置Com可見(jiàn), 否則vba無(wú)法使用[Guid("xxxxx-xxxx-xxxx-xxxxxxx")]:類庫(kù)的唯一標(biāo)識(shí)符,可以使用 Visual Studio 生成。
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通過(guò) CreateObject("ToolLib.ToolCom") 創(chuàng)建對(duì)象
[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}";
}
}
}??生成GUID的方法

3.2AssemblyInfo.cs配置類
using System.Reflection;
using System.Runtime.InteropServices;
// 文件→屬性→詳細(xì)信息→文件說(shuō)明
[assembly: AssemblyTitle("ToolLib_Test")]
// vba→工具→引用 時(shí)顯示的信息
[assembly: AssemblyDescription("FengYeHong VBA COM Library")]
[assembly: AssemblyCompany("FengYeHong-Company")]
// 文件→屬性→詳細(xì)信息→產(chǎn)品名稱
[assembly: AssemblyProduct("ToolLib_for_vba")]
// 非常重要
// 類型庫(kù) GUID
[assembly: Guid("9F3E7D2C-1234-4A56-8888-ABCDEF123456")]
// 文件→屬性→詳細(xì)信息→產(chǎn)品版本
[assembly: AssemblyVersion("1.0.0.1")]
四. 編譯
??該工程要生成的是一個(gè)類庫(kù),因此需要通過(guò)編譯生成所需的.dll文件

五. 將.dll類庫(kù)注冊(cè)到系統(tǒng)
??篇幅較長(zhǎng),不在此篇文章展開(kāi),詳情請(qǐng)參考下面這篇文章。
Powershell 注冊(cè).dll類庫(kù)到系統(tǒng)
六. vba中使用
??當(dāng).dll類庫(kù)注冊(cè)到系統(tǒng)之后,vba就可以正常使用該類庫(kù)了。

到此這篇關(guān)于C# 創(chuàng)建vba用的類庫(kù)的文章就介紹到這了,更多相關(guān)C# 創(chuàng)建vba類庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c#后臺(tái)線程訪問(wèn)前臺(tái)控件并顯示信息示例
這篇文章主要介紹了c#后臺(tái)線程訪問(wèn)前臺(tái)控件并顯示信息示例,需要的朋友可以參考下2014-03-03
C#實(shí)現(xiàn)程序最小化后重新拉起并強(qiáng)制置頂顯示的技術(shù)指南
本文詳細(xì)講解了程序在最小化后重新拉起的并置頂?shù)膶?shí)現(xiàn)方法,首先分析了該場(chǎng)景與普通重啟的不同之處,接著闡述了單實(shí)例檢測(cè)的方法、窗口狀態(tài)恢復(fù)的技術(shù)路徑、突破前臺(tái)限制的核心思路,需要的朋友可以參考下2026-05-05
C# System.Text.Encoding使用小結(jié)
System.Text.Encoding類及其派生類提供了豐富的功能,幫助開(kāi)發(fā)者實(shí)現(xiàn)不同字符編碼之間的轉(zhuǎn)換,本文就來(lái)介紹一下C# System.Text.Encoding使用,感興趣的可以了解一下2025-07-07
C#實(shí)現(xiàn)Markdown內(nèi)容轉(zhuǎn)為Word或PDF
Markdown作為一種輕量級(jí)的標(biāo)記語(yǔ)言,因其簡(jiǎn)潔易讀、語(yǔ)法清晰的特點(diǎn)被廣大程序員和技術(shù)文檔編寫(xiě)者所青睞,本文主要介紹了如何使用C#實(shí)現(xiàn)Markdown內(nèi)容轉(zhuǎn)為Word或PDF,需要的可以參考下2024-03-03
Unity中的PostProcessScene實(shí)用案例深入解析
這篇文章主要為大家介紹了Unity中的PostProcessScene實(shí)用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
c# wpf使用GMap.NET類庫(kù),實(shí)現(xiàn)地圖軌跡回放
這篇文章主要介紹了c# wpf使用GMap.NET類庫(kù),實(shí)現(xiàn)地圖軌跡回放的方法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03
在WinForm中發(fā)送HTTP請(qǐng)求的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇在WinForm中發(fā)送HTTP請(qǐng)求的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06

