在VB.NET中创建DLL文件并在Excel VBA中使用

在VB.NET中创建DLL文件并在Excel VBA中使用,vb.net,vba,excel,dll,Vb.net,Vba,Excel,Dll,我已经在VB.NET中创建了一个DLL文件,我想在Excel VBA中使用它。当我像函数一样使用它时,它工作得很好,但当我使用带有ByRef变量的sub时,它不工作,Excel会错误地重新启动 VB.NET中的代码是: Public Function distinctArr(ByVal arr As String()) As String() Return arr.ToList.Distinct.ToArray End Function Public Sub sortArr(B

我已经在VB.NET中创建了一个DLL文件,我想在Excel VBA中使用它。当我像函数一样使用它时,它工作得很好,但当我使用带有
ByRef
变量的sub时,它不工作,Excel会错误地重新启动

VB.NET中的代码是:

Public Function distinctArr(ByVal arr As String()) As String()
        Return arr.ToList.Distinct.ToArray
End Function

Public Sub sortArr(ByVal arr As String(), ByRef a As String())
    Dim tolist As List(Of String) = arr.ToList
    tolist.Sort()
    a = tolist.ToArray
End Sub
这是VBA中的代码:

Dim objMda As Excelcode.mda
Set objMda = New Excelcode.mda
Dim distinc_Item() As String
Dim all_Items() As String
all_Items = rng_to_string(rng_rizmetre)
distinc_Item = objMda.distinctArr(all_Items) '''This line is working perfect
Dim Sorted_Item() As String
objMda.sortArr distinc_Item, Sorted_Item

代码出了什么问题?

我终于找到了答案。 vb.net中的代码

Public Class MainClass
    Sub sortArr(ByVal arr As String(), ByRef sortedarr As String())
        sortedarr = arr
        Array.Sort(sortedarr)

    End Sub
End Class
和excel vba中的代码:

Sub aaa()
Dim Mycode As excelcode.MainClass
Set Mycode = New excelcode.MainClass
Dim arr(2) As String
arr(0) = "m"
arr(1) = "a"
arr(2) = "d"
Dim sortedArr() As String
ReDim sortedArr(0)
  Mycode.sortArr arr, sortedArr
End Sub

通过这段代码,我可以将数组byval传递给vb.net dll,然后vb.net传递排序数组。

错误是什么?“不行”没有任何意义。您是否在VBA中引用了类型库?
objMda
在何处以及如何声明和分配?VB.NET代码是否具有所需的类型和成员属性?您是否在VBA的对象浏览器中看到您的VB.NET API?您是否尝试过将数组
作为Object
ByRef
传递?您的VB.NET代码是否捕获任何异常?您是否尝试通过附加到EXCEL.EXE进程来调试VB.NET代码?您知道吗,您可以直接在VBA中使用
System.Collections.ArrayList
?错误是“Microsoft Excel停止工作”…当我在库中使用函数widout任何byref变量时,库工作正常,但当我在库Excel中使用byref变量时,停止工作并重新启动Excel。“Microsoft Excel停止工作”是因为DLL正在抛出异常而未捕获它。您需要将VS调试器附加到正在运行的EXCEL.EXE进程,并查看异常情况。考虑暴露<代码>函数< /> >,而不是用<代码> ByRef < /COD>参数> BTW返回结果,不需要将其转换为列表。只需
返回arr.Distinct.ToArray
a=arr.ToArray:Array.Sort(a)
是的,我们得到了那部分。当通过VBA使用VB.NET dll时,需要对其进行调试。为此,您需要将VB.NET/Visual Studio调试器附加到正在运行的EXCEL.EXE进程,在第一个可执行语句上放置断点,执行失败的VBA代码(调用dll),然后您可以单步执行VB.NET代码并检查VBA给您的内容。VB.NET代码正在抛出一个异常,在不知道该异常是什么的情况下,您正在盲目地工作。