【问题标题】:How to decrease the runtime that Excel VBA takes when executed from a Visual Basic Net application?如何减少从 Visual Basic Net 应用程序执行时 Excel VBA 的运行时间?
【发布时间】:2018-04-08 15:06:54
【问题描述】:

使用的软件: Visual Basic 网络 2013 , Microsoft Excel 2016

与从 Visual Basic Net 代码执行相同 VBA 所需的时间相比,直接从 VBA Excel 编辑器执行代码时我遇到了问题。即使我编写了一个简单的代码

Sub myCode()
   MsgBox "Hello World!", vbOkOnly
End Sub

在 VBA 中,当我从 Visual Basic 代码执行时开始执行需要花费太多时间。

例如,当我在 VBA 编辑器中按“F5”键时,执行代码并显示 MsgBox 只需不到一秒钟的时间。当我从 Visual Basic .Net 运行完全相同的代码时,开始执行代码大约需要 30 秒。

我在 Visual Basic 中使用的代码如下:

Private Sub executeExcelMacro(ByVal filePath As String, ByVal macroName As String)
        Dim oExcel As Excel.Application
        Dim oBook As Excel.Workbook
        Dim oSheet As Excel.Worksheet

        oExcel = New Excel.Application
        oExcel = CType(System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"), Excel.Application)
        oBook = GetObject(filePath)
        oSheet = oBook.Worksheets("TestExcel")
        oSheet.Activate()
        oBook.RunAutoMacros(1)
        oExcel.Run(macroName)
End Sub

这个想法是在 Excel 2016 中打开一个 Excel 文件并使用 VBA 代码自动更新其内容,这样我就可以看到每次从 Visual Basic .Net 自动执行 VBA 代码时如何创建一个新行

【问题讨论】:

  • 但是你运行的代码并不完全相同。
  • 嗨 Storax,在这个问题中,我展示了我最终运行的代码。但是我已经直接从 VBA 和 VB.Net 运行 Hello World 代码,如果我尝试从 VB.Net 执行 Hello World 大约需要 30 秒才能运行。如果我从 VB.Net 启动它,我不知道是什么导致任何 VBA 代码的执行速度变慢。一旦 VBA 启动,完成任务需要相同的时间。问题在于 VB.Net 尝试执行 VBA 代码和 VBA 代码的执行开始之间。大约需要 30 秒,我不知道为什么。
  • 对不起,但是 IMO 您的代码根本无法运行,因为您启动了一个新的 excel 实例并尝试将其分配给自身,然后将 obook 分配给一个新实例。 oexcel.run 行应该会引发运行时错误。

标签: .net vb.net excel runtime vba


【解决方案1】:

以下 VB.NET 代码在我的计算机上运行良好且快速

Private Sub executeExcelMacro(ByVal filePath As String, ByVal macroName As String)
    Dim oExcel As Excel.Application
    Dim oBook As Excel.Workbook
    Dim oSheet As Excel.Worksheet

    oExcel = New Excel.Application
    oExcel.Visible = True
    'oExcel = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application")
    'oBook = GetObject(filePath)
    oBook = oExcel.Workbooks.Open(filePath)
    oSheet = oBook.Worksheets("TestExcel")
    'oSheet.Activate()
    'oBook.RunAutoMacros(1)
    oExcel.Run(macroName)
    oBook.Close(False)
    oExcel.Quit()
End Sub

【讨论】:

  • 感谢您的回复。执行一些测试,以下代码是我发现的最快的: Dim ExcelAPP As Excel.Application ExcelApplication = CType(System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"), Excel.Application) ExcelApplication.Run(macroName )
猜你喜欢
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多