【问题标题】:Unable to pass excel objects as parameters from VBA to .NET when using NetOffice interop使用 NetOffice 互操作时,无法将 excel 对象作为参数从 VBA 传递到 .NET
【发布时间】:2014-09-06 09:55:06
【问题描述】:

当引用 Microsoft 的互操作程序集时,可以将 Excel 对象(如 Worksheet、Workbook、Range 等)作为参数从 VBA 传递到 .net:

.NET 类:

using Excel = Microsoft.Office.Interop.Excel;

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class MyExcelLib
{
    public MyExcelLib() {}  // default constructor

    public void InsertTable(Excel.Workbook wbook, string TableName, ...)
    {
       ...
    }
}

..使用 Visual Studio 中的 Register for COM Interop 选项或 Regasm 实用程序编译(请参阅Newman's article 以获得很好的概述)。

VBA 脚本(excel 宏)调用 .net 方法InsertTable()

Dim xLib As New MyExcelLib
Call xLib.InsertTable(ThisWorkbook, "Price", ..)

这行得通;工作簿对象可以作为参数从 VBA 传递到 .NET。但相同的架构不适用于 NetOffice 程序集:

using Excel = NetOffice.ExcelApi;
using NetOffice.ExcelApi.GlobalHelperModules;
using NetOffice.ExcelApi.Enums;

据我了解,这些程序集的 Embed Interop Types 属性不能设置为 true,因为这会导致编译错误。显然,无法使用 NetOffice 将 excel 对象作为参数传递。这是真的吗,还是有办法用 NetOffice 做到这一点?

【问题讨论】:

    标签: .net excel excel-interop netoffice vba


    【解决方案1】:

    使用本机代理而不是 NO 包装器作为库方法中的第一个参数。像这样的:

    public void InsertTable(object wbook, string TableName, ...)
    {
        Excel.Workbook myBook = new Excel.Workbook(null, wbook);
    
        myBook.Dispose();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-28
      • 2021-07-29
      • 2011-12-21
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      相关资源
      最近更新 更多