在Excel VBA中使用COM加载项中的CLR类?

拉尔夫·斯托德

我有一个Excel VSTO COM加载项,可以在Excel VBA中成功加载引用。我可以交换基本类型(如字符串),但是我也可以在VBA中使用外接程序中的复杂类吗?

假设我在C#中有此类:

public class TestClass {
    public string GetTextFunc() => "check";
    public string TextProp => "doublecheck";
    public int RollDice() => 4; // chosen by fair dice roll
}

...并且我的插件将此类的对象提供给Excel:

[ComVisible(true)]
public interface IUtilities {
    string GetString();
    TestClass GetTestClass();
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class Utilities: IUtilities {
    public string GetString() => "Hello Excel";
    public TestClass GetTestClass() => new TestClass();
}

因此,除该类外,所有内容都是默认的VSTO-tutorial-stuff。

现在,当我在Excel VBA块中(例如在“ ThisWorksheet”中)使用插件时,通过定义如下函数:

Sub TestAddin()
    Dim addIn As COMAddIn
    Dim automationObject As Object
    Set addIn = Application.COMAddIns("MyExcelAddin")
    Set automationObject = addIn.Object
    
    ActiveSheet.Range("A1").Value2 = automationObject.GetString()
    
    Dim tc
    Set tc = automationObject.GetTestClass()
    ActiveSheet.Range("A2").Value2 = tc.GetTextFunc()
End Sub

...然后按预期正确设置了A1,并且我可以一直调试到最后一行(因此获取对象tc仍然有效!),但是在最后一行,我收到错误消息“ Object required”。我可以看到它tc是type Variant/Object,所以我认为VBA只是不知道该怎么做。有什么办法

  1. 告诉VBA此类的外观,以及
  2. 实际上有它的工作原理,以便tc在VBA中调用函数可以在我的.Net库中调用正确的代码?
德米特里·斯特雷布琴科

必须与您的实用程序类一样实现TestClass类-它必须实现公共IDispatch派生的接口。

[ComVisible(true)]
public interface ITestClass {
    string GetTextFunc();
    string TextProp ();
    int RollDice();
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class TestClass : ITestClass {
    public string GetTextFunc() => "check";
    public string TextProp => "doublecheck";
    public int RollDice() => 4;
}

现在,VBA调用对以下方法具有类接口GetTextFunc

Dim tc
Set tc = automationObject.GetTestClass()
ActiveSheet.Range("A2").Value2 = tc.GetTextFunc()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Powershell安装Excel COM加载项

来自分类Dev

从Python使用win32com加载Excel加载项

来自分类Dev

从VBA打开Excel时未加载Excel加载项

来自分类Dev

Excel - VBA - 加载项 - 工作表

来自分类Dev

使用类在Excel VBA中使用多个范围

来自分类Dev

如何在Excel VBA中使用c#类?

来自分类Dev

Excel加载项显示为COM加载项

来自分类Dev

在Excel VBA中使用“(全部)”

来自分类Dev

使用VBA在Excel中删除XML重复项

来自分类Dev

在Excel加载项中包含“ ThisWorkbook”代码

来自分类Dev

在C#中打开Excel加载项

来自分类Dev

在宏中调用Excel加载项功能

来自分类Dev

在新的VBA项目/新Excel实例中,*。xlam加载项和缺少的引用均已打开

来自分类Dev

VBA-MS Excel加载项中的自定义功能区选项卡

来自分类Dev

在Excel 2013中,Visual Basic(VBA),宏和加载项工具在哪里?

来自分类Dev

从其他 VBA 项目隐藏 Excel 加载项中的工作表

来自分类Dev

在VBA Excel中的SQL查询中使用表名

来自分类Dev

在VBA中的Excel中使用公式创建函数

来自分类Dev

在Excel 2013中使用VBA读取隐藏列的问题

来自分类Dev

在Excel中使用VBA更改PowerPoint中的SlideSize

来自分类Dev

如何部署Excel XLL加载项并在Excel中自动注册该加载项

来自分类Dev

Excel加载项和VBA引用的范围是什么?

来自分类Dev

从VBA运行第三方Excel加载项

来自分类Dev

Visual Studio 2019 C ++ dll Excel VBA加载项问题

来自分类Dev

Excel 2007 VBA错误#450-求解器加载项

来自分类Dev

在UserControl for Excel加载项(VB)中动态加载XAML

来自分类Dev

使用VBA在Excel中搜索

来自分类Dev

使用 Excel for iPad 更新旁加载加载项

来自分类Dev

Office 2013的Excel加载项

Related 相关文章

热门标签

归档