RPA俱乐部

 找回密码
 立即注册
查看: 986|回复: 2

在 UiPath 中运行 VBA(中)

[复制链接]

9

主题

17

帖子

86

积分

注册会员

Rank: 2

积分
86
发表于 2018-11-29 10:35 | 显示全部楼层 |阅读模式
本帖最后由 onepaopao 于 2018-11-29 10:37 编辑

在 UiPath 中运行 VBA(中)
上节的《在 UiPath 中运行 VBA(上)》介绍了 Executemacro 和 Invoke VBA 的基本特性和初级用法。这一节接着上一节的内容继续讲述进阶的用法,主要探讨如何将参数传递到 VBA 代码中处理,并返回结果。



一、为什么要与 VBA 脚本交互数据?

1 使代码更加紧凑、灵活 ,易于维护

如果能将工作流中的数据传递到 VBA 代码并接收返回结果,就能利用 VBA 脚本来处理数据,并将结果返回到工作流中。

这种情况下,可以利用 VBA 进行数据清洗之类的工作。解决同样的数据处理问题,VBA 脚本相比于UiPath 自带的流程分支更加紧凑和清晰。

这也避免了使用 UiPath 自带的活动处理数据的时候,分支过多会使项目变得难以维护的问题。

VBA 语言是一门图灵完备的语言,它具有一门编程语言应有的所有特性。因此VBA 脚本相比于UiPath 自带的活动也更加灵活,这种灵活性在处理 Excel 数据时尤为突出。这是使用 VBA 处理数据的又一亮点。

2 灵活配置 Excel 的功能
你可以传递像工作簿路径之类的参数到 VBA 脚本中,然后使用 VBA 脚本来处理指定的工作簿。有了参数的传递,你可以控制的参数更加多了,对Excel 的操控更加灵活了。

3 更好地返回执行结果
可以返回数据意味着你可以直接在脚本中调用 Excel 内置的函数库,运行并返回结果。你不必再为 sumif, VLookup 之类的函数造轮子。你可以用的资源更多了。

你还可以在程序结束的时候返回执行的状态,然后在程序结束的时候接收来自 VBA 代码段的返回数据,用来在工作流中判断脚本程序运行的状态。这样能更好地在工作流中控制 VBA 脚本的执行,如是否正常退出、是否发生某些错误等等。

4 更多好处
你还可以发掘向 VBA 脚本传递参数和返回数据的更多好处。总之,相比于没有数据传递的情况,可以向 VBA 传入和传出数据之后,我们编写 UiPath 流程可用的资源更多了,生活更加容易了。

下面,我们用示例来说明使用 Execute macro 时传递参数的具体细节和技巧。Invoke VBA 的数据交互方法依此类推,不再赘述。



二、往 Macro 传入参数

1 创建一个名为 MacroBook.xlsm 的工作簿

2 打开工作簿,在 Excel 的开发工具选项卡或者 F12 快捷方式打开 VBE

3 插入一个名为 MacroModule 的 VBA 模块

4 在模块中插入如下的 VBA 代码段

image001.png

5 保存并关闭 MacroBook.xlsm 工作簿,关闭 Excel。

至此, 你创建了一个工作簿,内部包含一段宏。只要你在调用宏的时候传递字符串参数,这个宏就会以消息框弹窗显示你所传递的字符串。

6 打开 UiPath Studio, 创建一个空白的工程,拖入 Excelapplication scope 活动和 Execute macro 活动。

7 在 Excel application scope的 Workbook Path 字段输入刚才创建的工作簿路径:"MacroBook.xlsm"。

8 在Executemacro 的 Macro Name 字段输入刚才创建的宏名"MacroInBookInParamater"。

9 这时的流程图看起来应该是这样的:

image003.png
10 (重点) 选中 Execute macro 活动,在 MacroParameters字段输入 {"Parameter from UiPath to Excel."}

"Parameter from UiPath to Excel. " 这个字符串就是我们这次向 MacroInBookInParamater传递的参数。这个字符串将会显示在消息弹框中。

image005.png
11 保存并运行工作流, 得到如下的弹框:
image007.png
这说明了在 UiPath 工作流中传入的参数被 Excel Macro 准确地接收,Excel Macro 通过消息框将接收到的数据呈现出来。一切都按照如期进行,你已经学会了如何向 Macro 传递参数。

上述的例子仅仅是演示了传递一个字符串参数的情况,你还可以同时传递多个不同数据类型的参数到 Macro 中。后面的例子会说明这一点。

第10 步的关键在于正确地组织参数。在这里,数据的格式很重要,要点包括:

1 数据列表必须以花括号括起来;

2 字符串类型的数据必须以包含在英文双引号内部;

3 如果有多个参数的情况下,需用英文逗号分隔开来;

4 参数的位置和函数的参数列表顺序保持一致;

上述的例子仅仅是演示了传递一个字符串参数的情况,后面的例子你还可以看到同时传递多个不同的数据类型的情况。




回复

使用道具 举报

9

主题

17

帖子

86

积分

注册会员

Rank: 2

积分
86
 楼主| 发表于 2018-11-29 10:39 | 显示全部楼层
三、 接收 Macro 返回的数据
我们一步一步来构建一个自动化程序,在工作流中接收从 Macro 中返回的数据。

1 创建一个名为 MacroBook.xlsm 的工作簿

2 打开工作簿,在 Excel 的开发工具选项卡或者 F12 快捷方式打开 VBE

3 插入一个名为 MacroModule 的VBA 模块

4 在模块中插入如下的 VBA 代码段
image009.png
5 保存并关闭 MacroBook.xlsm 工作簿,关闭 Excel。

至此, 你创建了一个工作簿,内部包含一段宏。这个宏运行之后会返回一段字符串。下面我们来创建一个自动化程序调用这个宏,并接收从宏中返回的数据。

6 打开 UiPath Studio, 创建一个空白的工程,拖入 Excelapplication scope 活动和 Execute macro 活动。

7 在 Excel application scope 的 WorkbookPath 字段输入刚才创建的工作簿路径:"MacroBook.xlsm"。

8 在Executemacro 的Macro Name字段输入刚才创建的宏名 "MacroInBookDataOut"。

9 这时的流程图看起来应该是这样的:

image011.png
10 创建一个类型为 Object 的变量,并将其命名为 OutputValue.

11 选中 Execute macro 活动,在属性面板中的 Macro Output 字段中输入变量名OutputValue。
image013.png
12 在 Execute Macro 活动后面放置一个 LogMessage 活动。

13 在 Log Message 活动的 Message 属性输入 OutputValue.String 。

最终的程序框图看起来像这样:
image015.png
14 运行自动化程序。

你可以在 Ouput 面板中看到从 Macro 返回的数据 "I am the data from Excel !" 被打印出来了。

image017.png

至此,你已经成功地接收到来自 Macro 的返回数据,并在 WorkFlow 中使用这些数据。



回复

使用道具 举报

9

主题

17

帖子

86

积分

注册会员

Rank: 2

积分
86
 楼主| 发表于 2018-11-29 10:40 | 显示全部楼层
四、 同时传入参数和返回数据

你还可以同时向 Macro 传入多个参数并接收来自 Macro的数据返回。具体的操作步骤可以参考上述的两个例子,我就不再详细描述了。

我还做了一个例程,程序框图如下:

image019.png
Execute Macro 同时接收两个参数和返回数据,它的属性设置如下:
image021.png
这个例程它实现了前面提到的多个不同数据类型的参数传递。由属性可以看到,它传递一个字符串和一个数值到命名为MacroInBookDataInAndOut 的 Macro 中,并将结果返回到OutPutString 这个对象类型的变量中。

Excel Macro 的代码如下:
image023.png
紧接着的 Log Message 将数据进行加工并打印出来。

Log Message 的Message 属性填入的是:"The data from macro: " + OutPutString.ToString。

程序运行后,你可以在 Output 面板中看到:
image025.png

这说明了从 WorkFlow 中传入的数据被 Macro 加工之后,Macro 将加工结果传递到 WorkFlow, WorkFlow 接收到返回结果后将来自 Macro 的返回结果打印出来。

一切都按照预期的执行着,这也意味着你已经掌握了 Execute Macro 参数传递,返回值接收的所有细节。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

手机版|小黑屋|RPA俱乐部 ( 闽ICP备15006840号-20 )

GMT+8, 2019-1-24 04:08 , Processed in 0.050636 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表