在 Excel VBA 中使用 C# 库函数
Posted
技术标签:
【中文标题】在 Excel VBA 中使用 C# 库函数【英文标题】:Using C# library function in Excel VBA 【发布时间】:2017-08-01 13:45:29 【问题描述】:我的 C# 库 (.net 4.5.2) 代码如下所示:
namespace HelloWorld
public class Hello
public string HelloUser(string name)
return "Hello, " + name;
我已使用以下代码使程序集 COM 在 AssemblyInfo.cs 文件中可见:
[assembly: ComVisible(true)]
我通过 Tools ->References 在 VBA 代码中添加了对 dll 的引用,当尝试在 excel vba 中使用它时,我收到运行时错误:429(ActiveX 组件无法创建对象)。我的代码/调用有什么问题:
Excel VBA (2013)
Option Explicit
Sub tester()
Dim message As String
Dim User As String
User = "Ronnie"
Dim obj As New HelloWorld.Hello
message = obj.HelloUser(User)
End Sub
更新 通过 Toos ->References 添加引用并使用 F2 检查状态后
更新 #3 更新了 VBA 代码,仍然没有成功。这次的错误是:
Run-time error: 429 (ActiveX component can't create object)
【问题讨论】:
从您的 VBA 项目中引用类型库 (.tlb),像使用 VBA 中的任何其他类型库一样使用它。不过,不确定static
对 COM 的友好程度如何,您可能想用适当的属性装饰 Hello
类。
@Mat'sMug 我为我的 dll 简化了代码,使其成为非静态的。我怀疑我没有在 VBA 中正确声明该函数。这是在类(Hello)和命名空间(HelloWorld)中声明函数的正确方法吗?
***.com/questions/24193183/…
你没有Declare
它,你去Tools > References... 然后浏览找到你添加为引用的类型库。然后按 F2 进入 VBE 的对象浏览器,查看是否加载了 HelloWorld
库,以及它是否包含带有 HelloUser
函数的 Hello
类。如果没有,你就有问题了。如果是这样,那么您在 VBA 中使用它就像任何其他引用的类型库一样。
@Mat'sMug 我使用建议的方法添加了它,现在我看到了 dll 和类,但在类下面什么都没有(你好)。
【参考方案1】:
您的类没有向 COM 公开接口。您需要使用[Guid("some guid")]
属性来装饰您的类,如果您希望能够将其与后期绑定一起使用,则需要给它一个[ProgId("Some.Id")]
,以及一个正式描述成员如何暴露的[ComDefaultInterface(typeof(IHelloWorld))]
:
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IHelloWorld
string HelloUser(string name);
[ComVisible(true)]
[ComDefaultInterface(typeof(IHelloWorld))]
public class HelloWorld : IHelloWorld
public string HelloUser(string name)
return $"Hello, name.";
【讨论】:
我认为这将是一个普通的图书馆项目,而不是任何特殊的办公室模板,对吧?我需要使用剪贴板,c# 似乎是一种无需摆弄系统 API 的简单方法。是否还建议选择任何特定的 .net 框架来减少潜在的兼容性问题? @t3chb0t 理论上最新的 .net 内核具有完整的 COM 互操作支持(对吗?),但我还没有测试过。但是,是的,它只是一个标准库项目;您需要注意将要引用库的主机应用程序的位数;可能需要单独的 x86 和 x64 构建。 奥奇!我刚刚尝试过,事实证明这需要将lib注册为管理员。他们永远不会允许我这样做嘿嘿,回到系统 api :-] 新想法...也许我可以创建一个插件并从 VBA 调用它。正在研究... @t3chb0t 如果您在系统级别注册 COM 内容,您只需要管理员权限; Rubberduck 的安装程序允许通过注册到 HKCU 来进行每个用户的 no-privs 安装(如果我记得的话……需要手动创建所有密钥)以上是关于在 Excel VBA 中使用 C# 库函数的主要内容,如果未能解决你的问题,请参考以下文章
是否有可以执行 Excel NORMINV 函数的 C# 库?
想用C#做一个类似于excel里的公式库以及公式的运算模块,可以自定义函数,并可以解析公式并运算