【问题标题】:Create DLL file in VB.NET and use in Excel VBA在 VB.NET 中创建 DLL 文件并在 Excel VBA 中使用
【发布时间】:2017-05-31 15:51:10
【问题描述】:

我在 VB.NET 中创建了一个 DLL 文件,我想在 Excel VBA 中使用它。当我像函数一样使用它时,它运行良好,但是当我将 sub 与 ByRef 变量一起使用时,它不起作用并且 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

代码有什么问题?

【问题讨论】:

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

标签: vb.net vba excel dll


【解决方案1】:

我终于可以找到我的答案了。 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 传递排序数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-26
    • 2016-07-03
    • 1970-01-01
    • 2016-06-10
    • 2011-09-14
    • 1970-01-01
    • 2017-12-04
    • 2011-02-17
    相关资源
    最近更新 更多