通过C#类库(DLL)操纵VBA对象

时间:2019-04-03 11:11:58

标签: c# excel vba dll

我正在一个小型POC上工作,在那里我创建了一个C#类库(DLL),我想在Excel中使用该库来获取工作簿中需要的一些数据。因为这是我第一次创建DLL,所以我遵循了this guide。我目前正在寻找的是一种从DLL返回Object或类似String []之类的方式到我的VBA脚本的方法。我能够处理来自VBA中DLL代码的原始类型,例如integerstringboolean,但是我需要更复杂的东西。理想情况下,我希望能够从DLL返回并使用任何Object,但是String[]也足够。这正是我所追求的-我需要一种方法来通过/返回我的VBA和DLL代码更复杂的数据类型。根据{{​​3}},这可能不是完全可能的,但是作为一种选择,OP通过引用传递对象来设法用其DLL操作VBA对象。我想实现同样的目标,但是他们的方法对我不起作用。我不断收到运行时错误453。不幸的是,我对如何解决此问题没有足够的想法,所以我决定寻求一些指导。如果能帮助我解决问题,我将不胜感激。如果可以使用VBA中DLL类返回的对象,请赐教!

这是我的代码:

DLL(C#)

namespace ClassLibraryCSharp
{
  public class BW
  {
     public void getStrArray(ref object ar)
     {
        ar = new String[] { "test string" , "str2"};
        return (string[]) ar;
     }
   }
}

VBA

Dim clib As New ClassLibraryCSharp.BW

'Public Declare PtrSafe Function getStrArray Lib 
"C:\Users\...\bin\x86\Debug\ClassLibraryCSharp.dll" (ByRef ar)


Sub executeFM()

  Dim str(2) As String
  str(0) = "str1"
  str(1) = "str2"
  clib.getStrArray (str)
  'getStrArray (str) this line results in error 453 - Can't find DLL entry 
  point getStrArray (using the function declaration of course)
  Debug.Print str(0) 'output is always "str1" => array wasn't manipulated 
  by the DLL code

 End Sub

谢谢!

0 个答案:

没有答案