【问题标题】:Using standard .Net libraries with VBA使用带有 VBA 的标准 .Net 库
【发布时间】:2011-05-11 05:02:36
【问题描述】:

按照Execute .NET 3.0 code from Office 2003此处发布的步骤,我已经成功地运行了我自己的 .Net 代码

有没有一种方法可以使用标准的 .Net 库而无需编写包装器?这样我们就可以避免在客户端机器上注册并安装自定义 DLL 到 GAC 中。

我已经在 C:\Windows\Microsof.NET\Framework 文件夹中找到了 tlb 文件,并且能够添加对 mscorlib.dll 的引用。查看RijndaelManaged 的文档,这个类似乎是COM 可见的。

我能够创建一个实例,但一旦我尝试使用它,就会出现错误(例如“类型不匹配”)。

Sub Macro1()
   Dim aesImplementation As New RijndaelManaged

   Set key = aesImplementation.GenerateKey()
   Set iv = aesImplementation.GenerateIV()
End Sub

我愿意接受你提供的任何技巧!

【问题讨论】:

  • 我没有答案:在没有包装器的情况下使用 .NET,但如果您是 VBA 新手,您需要知道将某些内容声明为“As New”实际上并不会实例化任何内容那时就像在.NET中一样。我不清楚您的错误是在实例化还是在“设置”上引发的。 (我假设您已将“键”变量声明为正确的类型等)请参阅stackoverflow.com/questions/2478097/…
  • 太疯狂了,如果没有实例化新对象,为什么还要将 As New 作为有效语法?!在这种情况下,它似乎确实创建了一个实例,但我至少会记得“As New”不是最佳实践。我没有明确声明关键对象的原因是因为如果我这样做,我会得到“无法分配给数组”错误。显然,当您尝试分配给不同类型的数组时会发生此错误。
  • 这不是很多工作来节省一些工作吗?我的意思是,如果您的用户允许您运行宏,为什么不运行实际的 .NET 应用程序呢? .NET 中的 Office 互操作性似乎相当不错,因此您可以同等或更好地操作文档!
  • Dim ... As New 确实创建了一个新对象,它只是根据需要在引用它的地方而不是在声明它的地方这样做。一个微妙的区别,与这个特定的代码示例完全无关。
  • 至于分配给一个数组,在 VBA 中你不会使用 'Set',只是普通的分配。但我不知道将 VBA 变体分配给 .NET 字节数组是否可行。

标签: .net vba


【解决方案1】:

目前还不可能。 VBA(用于应用程序的 VB)不是 VB,而是模仿旧版本 VB 的所有基本语法的单独交易。这几乎就像使用非常精简的常规旧 VB 版本。事实上,VBScript 是最接近 VBA 的匹配项。也许有一天,微软会构建直接与 GAC 合作的方法,但在那之前(我敢肯定,那一天可能意味着 COM 的消亡),您仍然无法使用 COM CreateObject() 方法,并添加对一个 COM 注册库到您的 Office 项目,或直接引用您的 Office 项目中的 VBA/COM 兼容的 DLL 或 TLB 文件。

默认 GAC 中有很多支持 COM 的库,但对于大多数人来说,您首先要在 VB.Net 或 C# 中创建 Com Callable Wrapper。

相反,几乎所有的 MS Office 应用程序都是 COM 可调用的,因此您可以通过 VB.Net 项目随意使用已安装的 Office 应用程序。

【讨论】:

  • 通过添加对mscorlib.dll 的引用,您可以在标准.net 库中创建具有无参数公共构造函数的任何类的对象。你会发现这是非常有限的。
  • “VBScript 是最接近 VBA 的匹配项” - VBA 比 VBScript 更接近经典 VB6:msdn.microsoft.com/en-us/library/ms970436.aspx
【解决方案2】:

您应该能够以这种方式使用ComVisible .NET 类。但是GenerateKeyGenerateIV 方法没有返回值。试试:

Sub Macro1()
   Dim aesImplementation As New RijndaelManaged

   aesImplementation.GenerateKey
   Key = aesImplementation.Key
   aesImplementation.GenerateIV
   IV = aesImplementation.IV
End Sub

或者更好,尤其是因为在调试时可以看到在构造过程中或调用方法时是否发生错误:

Sub Macro1()
   Dim aesImplementation As RijndaelManaged
   Set aesImplementation = New RijndaelManaged

   aesImplementation.GenerateKey
   Key = aesImplementation.Key
   aesImplementation.GenerateIV
   IV = aesImplementation.IV
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2016-08-07
    • 2020-09-14
    • 1970-01-01
    • 2017-12-31
    • 2019-06-18
    • 2018-03-29
    相关资源
    最近更新 更多