SSIS脚本任务未使用AddIn运行Excel宏

时间:2018-02-09 17:53:02

标签: excel vb.net ssis

我有一个调用Excel工作簿宏的SSIS脚本任务。此Excel宏使用Excel AddIn(xlam)进行日志记录。当代码运行时它会爆炸,除非在调试过程中,我在工作簿中放置一个断点,然后单步执行Excel部分。如果我单步执行一次,那么我的进程可以通过SQL Server代理运行,然后再自动运行。知道为什么我需要设置一个断点来修复这个过程吗?

以下是我的示例SSIS脚本任务代码:

        Dim xlApp As Excel.Application = Nothing
    '
    Try
        xlApp = New Excel.Application
        xlApp.Visible = True
        xlApp.Application.DisplayAlerts = False
        xlApp.Workbooks.Open(strExcelDriverFile)
        xlApp.Run("CreateReport")
        Dts.TaskResult = ScriptResults.Success
        xlApp.Workbooks.Close()
        xlApp.Quit()
    Catch ex As Exception
        xlApp.Quit()
        Dts.TaskResult = ScriptResults.Failure
    End Try

以下是我的示例Excel代码:

Sub CreateReport
'Log using the addin
LogHWMsg Replace(Replace("Starting Macro", "'", ""), """", ""), GExecGuid, 0, 1, ThisWorkbook.Path, ThisWorkbook.Name, _
                ActiveWorkbook.Path + "\" + ActiveWorkbook.Name, Environ("UserName")
'Do some stuff...

End Sub

1 个答案:

答案 0 :(得分:1)

Excel Automation会自动加载加载项。您需要通过代码专门加载它们。

以下示例来自Loading Excel Add-Ins at Runtime(作者:Jeremy Espenshade)

  

如果您想这样做,可以使用以下选项。

     

1。)Application.RegisterXLL

     

一个。这是一种可以从VBA调用的方法,它在特定位置加载XLL并注册XLL中包含的函数和命令。

     

2。)AddIns.Add

     

一个。这是一种可以从VBA调用的方法,它可以加载任何类型的加载项(XLL,XLA或XLAM)。加载加载项后,执行步骤3将其打开。

     

3.)AddIn.Installed = true

     

一个。获得对加载的加载项的引用后,设置AddIn.Installed = true以使加载项打开。

     

湾请注意,使用/ automation开关启动Excel时已知的加载项已标记为"已安装",但它们未打开。在这种情况下,在设置Installed = true

之前,Set Installed = false
Private Sub Workbook_Open()
    Dim success As Boolean
    Dim myAddIn As AddIn

    ' Load XLL
    success = Application.RegisterXLL("c:\myaddins\myxll.xll")

    ' Load and install new XLAM
    Set myAddIn = Application.AddIns.Add("c:\myaddins\myxlam.xlam")
    myAddIn.Installed = True

    ' Load known XLAM
    For Each myAddIn In AddIns
        If myAddIn.Name = "myknownaddin.xlam" Then
            myAddIn.Installed = False
            myAddIn.Installed = True
        End If
    Next
End Sub

编辑: OP已经要求我加入适合他的技术;即激活正在执行Excel的用户帐户可用的加载项。

AddIns对象是Excel.Application对象的属性。使用Excel自动化时,Excel应用程序不会自动加载将在交互式会话中加载的AddIns。因此,您需要使用上面演示的适当技术根据其类型加载加载项。

激活已知地址的示例:

xlApp = New Excel.Application
For Each addin As Excel.AddIn In xlApp.AddIns
    If Not String.IsNullOrWhiteSpace(addin.Path) Then
        addin.Installed = True
    End If
Next

请注意,代码不会验证Path属性是否为空。这可能是由卸载的加载项引起的。

Excel也很难​​维护以前加载的加载项的链接。实际上,从列表中删除的唯一方法是使文件从最初加载的路径中不可用,并特别要求Excel在Excel无法找到加载项时通过对话框窗口将其删除。因此,可能无法访问已知加载项。更糟糕的是,在不可访问的加载项上设置Installed属性不会引发错误。

但是,如果您尝试访问无法加载的加载项的任何成员,则会引发错误。