我有一个调用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
答案 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
属性不会引发错误。
但是,如果您尝试访问无法加载的加载项的任何成员,则会引发错误。