Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VBA中使用标准.Net库_.net_Vba - Fatal编程技术网

在VBA中使用标准.Net库

在VBA中使用标准.Net库,.net,vba,.net,Vba,通过遵循此处发布的步骤,我已经成功地运行了自己的.Net代码 有没有一种不用编写包装器就可以使用标准.Net库的方法?通过这种方式,我们可以避免在客户机的GAC中注册并安装自定义DLL 我已经在C:\Windows\Microsof.NET\Framework文件夹中找到了tlb文件,并且能够添加对mscorlib.dll的引用。查看的文档,该类似乎是COM可见的 我可以创建一个实例,但只要我尝试使用它,就会出现错误(例如“类型不匹配”) 我愿意接受你的任何攻击 还不可能。VBA(vbforap

通过遵循此处发布的步骤,我已经成功地运行了自己的.Net代码

有没有一种不用编写包装器就可以使用标准.Net库的方法?通过这种方式,我们可以避免在客户机的GAC中注册并安装自定义DLL

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

我可以创建一个实例,但只要我尝试使用它,就会出现错误(例如“类型不匹配”)


我愿意接受你的任何攻击

还不可能。VBA(vbforapplications)不是VB,而是一个单独的协议,它模仿了VB旧版本的所有基本语法。这几乎就像使用一个非常精简版本的常规老VB。事实上,VBScript与VBA最接近。也许有一天,微软会内置直接与GAC合作的方法,但在那之前(我相信那一天很可能意味着COM的死亡),你只能使用COM
CreateObject()
方法,将COM注册库的引用添加到你的Office项目中,或者直接引用Office项目中与VBA/COM兼容的DLL或TLB文件

默认的GAC中有相当多的启用COM的库,但对于大多数库,您必须首先在VB.Net或C#中创建COM可调用包装器


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

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

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

我没有答案:在没有包装器的情况下使用.NET,但是如果您是VBA新手,那么您需要知道,将某个东西声明为“新”并不像在.NET中那样实际实例化任何东西。我不清楚您的错误是在实例化时引发的还是在“集合”中引发的。(我假设您已经将'key'变量声明为正确的类型,等等)看,这太疯狂了,如果它没有实例化一个新对象,为什么会有新的和有效的语法?!不过,在这种情况下,它似乎确实创建了一个实例,至少我会记住,“作为新的”并不是最佳实践。我没有显式声明key对象的原因是,如果我这样做,就会出现“cannotassigntoarray”错误。显然,当您尝试分配给不同类型的数组时,会发生此错误。仅保存一些工作不是很费力吗?我的意思是,如果您的用户允许您运行宏,为什么不运行实际的.NET应用程序呢?NET中的Office interop看起来相当不错,因此您可以同样或更好地操作文档<代码>变暗。。。由于New确实创建了一个新对象,所以它只是根据需要在引用它的地方而不是在声明它的地方这样做。这是一个微妙的区别,对于这个特定的代码示例来说是完全不相关的。在VBA中,对于数组赋值,您不会使用“Set”,而只是普通赋值。但我不知道将VBA变量分配给.NET字节数组是否有效。通过添加对
mscorlib.dll
的引用,您可以在标准.NET库中创建具有无参数公共构造函数的任何类的对象。您会发现这一点非常有限。“VBScript与VBA最为匹配”-VBA与经典VB6比VBScript更为接近:
Sub Macro1()
   Dim aesImplementation As RijndaelManaged
   Set aesImplementation = New RijndaelManaged

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