【发布时间】:2019-02-21 01:19:09
【问题描述】:
在 BluePrism 中工作时,我在运行打开另一个工作簿的 Excel 宏时遇到问题。
Excel-VBA 例程
我在启用宏的 Excel 工作簿 \\myCompany\myFolder\myMasterbook.xlsm 中有一个 Sub,它会打开另一个工作簿
Public Sub OpenMyFile(Optional book2open As String = "")
Dim openedBook As Workbook
Debug.Print "About to open", book2open
Set openedBook = Application.Workbooks.Open(book2open)
If openedBook Is Nothing Then
Debug.Print "Could not open it"
Else
Debug.Print "I found", openedBook.Worksheets(1).Cells(1, 1).Value
' Actually, I do a lot more with that workbook, of course
openedBook.Close
End If
End Sub
当我在即时窗口(使用Ctrl-G 打开)中输入
call OpenMyFile ("\\myCompany\myFolder\myWorkbook.xlsx")
我看到工作簿打开和关闭,并在立即窗口中得到响应
About to open \\myCompany\myFolder\myWorkbook.xlsx
I found Cell A1 content
从 BluePrism 调用 VBA
在机器人自动化流程 (RPA) 中,我需要使用 BluePrism 打开包含此 VBA Sub 的工作簿并运行它。
在即时窗口中,我现在得到
About to open \\myCompany\myFolder\myWorkbook.xlsx
Could not open it
我尝试了两件事来解决它
不带参数调用
如果我在 VBA 中将 Sub 定义为
Public Sub OpenMyFile(Optional book2open As String = "\\myCompany\myFolder\myWorkbook.xlsx")
并使用OpenMyFile 调用它,但这并不能解决我的问题,因为我需要将book2open 传递给VBA。
强制参数
如果我在 VBA 中将我的 Sub 定义为 Public Sub OpenMyFile(book2open As String'),我会收到此错误:`内部:无法执行代码阶段,因为代码阶段抛出异常:无法运行宏
'OpenMyFile("C:\Users\P01549\Documents\TestHorsten.xlsx", -1)'。该工作簿中的宏可能不可用,或者所有宏都可能被禁用。`
MS Excel VBO - Extended 对象使用互操作
部分 dot.net 代码可以在 BluePrisms Object Studio 中找到。我运行此对象的以下“操作”
创建实例
Dim excel as Object = CreateObject("Excel.Application")
' Create a GUID with which we can kill the instance later
' if we have to play hardball to get rid of it.
excel.Caption = System.Guid.NewGuid().ToString().ToUpper()
handle = GetHandle(excel)
打开工作簿
Dim wb as Object = GetInstance(handle).Workbooks.Open(filename)
name = wb.Name
wb.Activate()
与
-
handle: 创建实例返回的句柄 -
filename:\\myCompany\myFolder\myMasterbook.xlsm
运行宏
GetInstance(Handle).Run(Macro_Name)
与
-
handle: 创建实例返回的句柄 -
Macro_Name:OpenMyFile("\\myCompany\myFolder\myWorkbook.xlsx")
有人有解释或解决办法吗?
【问题讨论】:
-
它是 Excel 应用程序,它显然可以,因为它在从即时窗口调用时会这样做
-
很可能。这就是为什么它不在标题中。
-
我首先从 BluePrism 实例化 Excel,然后打开启用宏的工作簿。 (实际上我打开了一个启用宏的模板。)所有这些都运行了一些 C# 代码的 sn-ps,包括
GetInstance(Handle).Run(Macro_Name) -
问题可能与您的 Macro_Name 输入格式有关。如果您想在宏名称字符串参数中将路径作为字符串参数传递,那么它应该如下所示:"OpenMyFile(""\\myCompany\myFolder\myWorkbook.xlsx"")"。
-
我不知道为什么它不起作用,但是您可以尝试一些解决方法来提供路径。不是通过子参数传递路径,而是使用“设置单元格值”操作将其传递到带有宏的 Excel 文件(例如,传递到第一张工作表的第一个单元格),然后从宏中的单元格获取路径(book2open = ThisWorkbook.Sheets(1)。 Cells(1, 1).Value) 并使用它打开目标工作簿。
标签: .net excel vba excel-interop blueprism