Header Mapping--应对 Report Headers 的变化

Author : Collin_PXY

背景

在 RPA工作中,稳定的规则非常重要,因为 RPA项目就是基于规则而进行的,但规则有时候也会发生变化,而且有时候这种变化是在开发阶段无法预料的,此时,对于我们已经在使用当中的 Robots来说,就有可能会导致 Robots运行失败。因此,在维护阶段需要对变化的规则进行补救性应对,尤其是当变化的规则影响面很大的时候,就要采用一种代价最小,风险最低的方案来。

案例

该案例启发于真实项目,业务逻辑中所需要的一个重要的 report的headers发生了重大变化,headers的名称及位置都发生了变化,此时对业务逻辑来讲是灾难性的,此时负责维护的团队需要在较短的时间内来解决这个问题。Header Mapping 就是一种解决方案:

1-设计阶段的 report headers layout:

2-发生变化之后的 report headers layout:

3-需求:

业务中不需要的headers不需要改动,没有发生变化的headers也不需要改动,业务中需要的且发生变化的headers要把名称及位置转化为 report变化之前的样子。

4-方案设计:

1)Header Mapping表的设计:(根据业务需要设计)



2)代码设计:

Option Explicit
Option Base 1 Sub HeaderMapping()
On Error GoTo errorhandling
Dim wb As Workbook
Dim wb_output As Workbook
Dim rng As Range
Dim usedrows As Integer
Dim usedcolumns As String
Dim report_path As String
Dim output_report_path As String
Dim headers_dict As Object
Dim sht_temp As Worksheet displayOFF
Set headers_dict = CreateObject("Scripting.Dictionary") report_path = "C:\Users\12078\Desktop\UIPATH_test\header mapping\report.xlsx"
output_report_path = "C:\Users\12078\Desktop\UIPATH_test\header mapping\output_report.xlsx" 'Get a copy of report and saved as a new one.
FileCopy report_path, output_report_path Set wb = checkAndAttachWorkbook(report_path)
Set wb_output = checkAndAttachWorkbook(output_report_path)
wb_output.Worksheets.Add(After:=Worksheets(1)).Name = "Temp"
Set sht_temp = wb_output.Worksheets("Temp") usedrows = getLastValidRow(ThisWorkbook.Worksheets("Header Mapping"), "A")
For Each rng In ThisWorkbook.Worksheets("Header Mapping").Range("A2", "A" & usedrows)
If Not headers_dict.exists(rng.Offset(0, 2).Value) Then
headers_dict.Add rng.Offset(0, 2).Value, rng.Value
End If
Next rng 'Rename the headers
usedcolumns = getLastValidColumn(wb_output.Worksheets(1), 1)
For Each rng In wb_output.Worksheets(1).Range("A1", usedcolumns & 1)
If headers_dict.exists(rng.Value) Then
rng.Value = headers_dict(rng.Value)
End If
Next 'Sort the headers
For Each rng In ThisWorkbook.Worksheets("Header Mapping").Range("B2", "B" & usedrows)
If VBA.Trim(rng.Value) <> VBA.Trim(rng.Offset(0, 2).Value) Then
Call sortHeaders(wb_output.Worksheets(1), sht_temp, Convertcolumntonumber(VBA.Trim(rng.Value)), _
Convertcolumntonumber(VBA.Trim(rng.Offset(0, 2).Value)))
End If
Next rng sht_temp.Delete
checkAndCloseWorkbook report_path, False
checkAndCloseWorkbook output_report_path, True Exit Sub
errorhandling:
checkAndCloseWorkbook report_path, False
checkAndCloseWorkbook output_report_path, False
End Sub Function sortHeaders(sht As Worksheet, temp_sht As Worksheet, ByVal right_col_index As Byte, ByVal to_be_sorted_col_index As Byte) sht.Activate
sht.Columns(right_col_index).Select
Selection.Cut
temp_sht.Activate
temp_sht.Columns(1).Select
ActiveSheet.Paste sht.Activate
sht.Columns(to_be_sorted_col_index).Select
Selection.Cut
sht.Columns(right_col_index).Select
ActiveSheet.Paste temp_sht.Activate
temp_sht.Columns(1).Select
Selection.Cut
sht.Activate
sht.Columns(to_be_sorted_col_index).Select
ActiveSheet.Paste temp_sht.Columns(1).ClearContents End Function '辅助函数
Function getLastValidColumn(in_ws As Worksheet, in_row As Integer) As String
Dim i As Integer
i = in_ws.Cells(in_row, Columns.count).End(xlToLeft).Column
getLastValidColumn = ConvertColumnToAlpha(i)
End Function 'Convert column number to alpha. e.g:column 2 -> column B.
Function ConvertColumnToAlpha(ByVal num As Integer) As String
ConvertColumnToAlpha = Replace(Cells(1, num).Address(False, False), "1", "")
End Function 'Convert column to number
Function Convertcolumntonumber(ByVal col As String) As Long
Convertcolumntonumber = Range("a1:" & col & "1").Cells.count
End Function 'Get last row of Column N in a Worksheet
Function getLastValidRow(in_ws As Worksheet, in_col As String)
getLastValidRow = in_ws.Cells(in_ws.Rows.count, in_col).End(xlUp).Row
End Function Function checkAndAttachWorkbook(in_wb_path As String) As Workbook
Dim wb As Workbook
Dim mywb As String
mywb = in_wb_path For Each wb In Workbooks
If LCase(wb.FullName) = LCase(mywb) Then
Set checkAndAttachWorkbook = wb
Exit Function
End If
Next Set wb = Workbooks.Open(in_wb_path, UpdateLinks:=0)
Set checkAndAttachWorkbook = wb End Function Function checkAndCloseWorkbook(in_wb_path As String, in_saved As Boolean)
Dim wb As Workbook
Dim mywb As String
mywb = in_wb_path
For Each wb In Workbooks
If LCase(wb.FullName) = LCase(mywb) Then
wb.Close Savechanges:=in_saved
Exit Function
End If
Next
End Function 'don't allow alerts window display, or update screen
Function displayOFF()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
End Function
5-结果:

符合预期,输出结果同设计阶段的样子,图1。

VBA_headers_mapping的更多相关文章

随机推荐

  1. (OK) Android内核(4.9)集成最新版MPTCP---成功

    Android内核(4.9)集成最新版MPTCP---成功

  2. rxjs入门4之rxjs模式设计

    观察者模式 (Observer Pattern) 观察者模式其实在日常编码中经常遇到,比如DOM的事件监听,代码如下 function clickHandler(event) { console.lo ...

  3. Go | Go 使用 consul 做服务发现

    Go 使用 consul 做服务发现 目录 Go 使用 consul 做服务发现 前言 一.目标 二.使用步骤 1. 安装 consul 2. 服务注册 定义接口 具体实现 测试用例 3. 服务发现 ...

  4. JVM系列【6】GC与调优1

    JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 GC基础知识 什么是垃圾 ​ 没有任何引用指向的一个对象或多个对象(循环引 ...

  5. 【不知道怎么分类】NOIP2016 蚯蚓

    题目大意 洛谷链接 给出\(n\)条蚯蚓,给出\(m\)秒,每一秒都把蚯蚓中最长的蚯蚓分成两段,一段是原来的\(p\)倍,剩下的就是\((1-p)\)倍.每一秒,除了刚刚产生的两条新蚯蚓,其余蚯蚓长度 ...

  6. 框架-设备与驱动的拆分及实现-I2C

    目录 前言 笔录草稿 概要 原理及实现方法 IIC 例子实战-驱动 1. 创建文件 2. 创建 I2C 驱动名字列表 3. 组建 I2C 驱动结构体 4. 编写-注册 I2C 驱动函数 5. 创建 I ...

  7. rabbitmq 交换机模式一 直连模式 direct

    代码 <?php require_once "./vendor/autoload.php"; use PhpAmqpLib\Connection\AMQPStreamConn ...

  8. docker19.03限制容器使用的内存资源

    一,指定内存大小的参数: [root@localhost liuhongdi]# docker run -idt --name kafka2 --hostname kafka2 -m 200M --m ...

  9. frp 内网穿透远程桌面(Windows 10)配置

    一.服务端配置 服务端需要公网环境,一般用一台云服务器就行了,我选择的是 Linux 服务器,Windows 服务器也是可以的. 下载 frp: wget https://github.com/fat ...

  10. mac 搭建 Robot Framework

    前提介绍,我的mac上python2和python3是都要有的,然后大家可以看看我其他的文章,这些文章虽然很多都是连接,是别人的博客或者资料,但都是自己试过没有问题的,只是比较懒然后就没有自己写. r ...