【问题标题】:Calling VB.Net from VBA in Excel在 Excel 中从 VBA 调用 VB.Net
【发布时间】:2014-07-22 03:07:30
【问题描述】:

我正在尝试让一些代码在 Excel VBA 和 VB.Net 之间运行。我在 Visual Studio 的 VB.Net 中有以下代码..

Public Class ThisAddIn

    Private Sub ThisAddIn_Startup() Handles Me.Startup

    End Sub

    Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown

    End Sub

    Public Function Multiplication()
        Dim activeWorksheet As Excel.Worksheet = CType(Application.ActiveSheet, Excel.Worksheet)

        Dim Range1 As Excel.Range = activeWorksheet.Range("A1")
        Dim Range2 As Excel.Range = activeWorksheet.Range("A2")

        Dim x As Integer = Range1.Value
        Dim y As Integer = Range2.Value

        Return (x * y)

    End Function

End Class

我在 VBA 中也有这段代码,我正在尝试运行

Sub Macro1()

Dim x
x = ThisAddIn.Multiplication
MsgBox (x)

End Sub

在 Visual Studio 中,我点击开始,然后将此代码放入 Excel VBA 中以弹出新窗口。

我在 VBA 行“x = ThisAddIn.Multiplication”上收到错误“424 Object Required”。如何从 VBA 调用 VB.Net 函数?

编辑:我正在使用 Excel 2013,VB.Net 2013 版(VB12),我想我的目标是 .Net 4.5+ 版

编辑:我尝试添加以下代码:

Imports System
Imports System.Collections.Generic
Imports System.Text

Private Sub Test()
 Dim testClass As New ThisAddIn
 MsgBox testClass.Multiplication()
End Sub

基于此guide,但它仍然无法正常工作。我找不到将项目连接到步骤 3 中提到的 Excel 的选项,因为它是一个旧指南。也许这是我的问题?

【问题讨论】:

  • 您使用的是什么版本的 Excel 和 VB.NET,您的目标是什么版本的 .NET Framework?
  • 我编辑了我的问题以添加此信息
  • 有人有什么建议吗?..
  • 在您的问题中,您发布了 Richard Newman 的“从 Excel 调用 .NET 库的初学者指南”的链接。您是否完全按照上面列出的示例进行操作,如果是,您是否让它发挥作用?如果没有,它是如何失败的?本指南第 3 步中的那些步骤实质上是将组件注册到操作系统的 COM 系统中。您可能还想看看这个past SO question
  • 您可能还应该看到这个 SO 问题/答案:Calling a .NET Library Method from VBA。此外,这个 SO 问题看起来与您的情况有关。请看:Difference between : adding a tlb as reference to invoke function VS using 'Run'?.

标签: vb.net vba excel


【解决方案1】:

不使用 VSTO 制作 Excel 插件,另一种方法是使用 VB.NET 代码制作 Excel-DNA 插件。这些都很方便,因为您无需管理员权限即可加载和注册,而且您可以在单个插件中创建高性能 UDF 和 COM 服务器。

这将允许您在您的 VB.NET 中创建一个用户定义函数 (UDF),它可以直接在工作表中使用。您的 UDF 代码可能如下所示:

Public Module MyFunctions

    <ExcelFunction(Description:="Useful custom multiplication function")>
    Function MultiplyThem(val1 As Double, val2 As Double) As Double
        Return val1 * val2
    End Function

End Module

您可以在单元格中将其称为=MultiplyThem(A1, A2)

当然,您也可以制作宏 (Subs),自动生成 Excel 对象,制作自定义功能区选项卡等。

作为与 VBA 集成的简单开始,可以使用 Application.Run("MultiplyThem", 3, 5) 从 VBA 项目中直接调用加载项中的函数和宏。

更进一步,您可以将 Excel-DNA 加载项设置为 COM 服务器,这允许您Tools->Reference来自 VBA 项目的 .xll 加载项,然后从 VBA(即使使用 IntelliSense)访问加载项的导出对象模型。 Mikael Katajamäki 写了两篇关于使用 Excel-DNA 制作这样一个 COM 服务器的分步说明的好文章:

【讨论】:

    【解决方案2】:

    如果你想首先从 vb.net 调用一个函数,你必须将你的 dll 引用到 vba ftom tools->reference。 引用后,您必须将类中的对象定义到 dll 文件中。 如果您的 dll 文件名为 mydll,则下面的代码是用 vba 编写的,如下所示:

    dim x as mydll.ThisAddIn
    set x =new mydll.ThisAddIn
    dim y
    y=x.Multiplication
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多