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. shell-脚本开发基本规范及习惯

    1.shell-脚本开发基本规范及习惯 1.开头指定脚本解析器 #!/bin/sh 或#!/bin/bash 2.开头加版本版权等信息 #Date: 2018/3/26 #Author: zhangs ...

  2. C# 中 System.Range 结构体

    翻译自 John Demetriou 2020年4月6日 的文章 <C# 8 Is Introducing Ranges> 我们之前讨论过的 C# 中的一个特性 System.Index ...

  3. 解决SpringBoot 定时计划 quartz job 任务重复执行多次(10次)

    上一篇:SpringBoot多任务Quartz动态管理Scheduler,时间配置,页面+源 设置了多个 任务,本应该是各司其职的,任务调用多线程处理任务,but这个定时任务竟然同时跑了10次???如 ...

  4. widows安装ffmpeg

    首先下载ffmpeg的windows版本https://ffmpeg.zeranoe.com/builds/ 解压到d盘 win+r cmd 说明成功了

  5. kinaba 安装踩坑: FATAL Error: [elasticsearch.url]: definition for this key is missing 转

     安装  https://www.jianshu.com/p/875457cb8da6   操作系统:Linux kibana 版本: 7.4.0 1. 在/etc/yum.repos.d/ 下新建 ...

  6. linux 压缩 tar命令

    linux中tar命令用法    总结 *.tar 用 tar –xvf 解压 *.gz 用 gzip -d或者gunzip 解压 *.tar.gz和*.tgz 用 tar –xzf 解压 *.bz2 ...

  7. 自动识别PC端、移动端,并跳转

    PC端和移动端代码是分开的,各有一套代码的情况下: 在PC端的HTML文件head标签中间添加一段自动识别移动端的JavaScript代码: <script type="text/ja ...

  8. Postman测试数据

    一.新增 在controller中编写新增的方法,加上@RequestBody注解,以json格式获取数据 在Postman中,有两种方法新增数据 直接新增参数,如: 以json格式新增 二.删除 根 ...

  9. MongoDB简介---MongoDB基础用法(一)

    Mongo MongoDB是一个基于分布式文件存储的数据库.MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. MongoDB 将数据存储为一 ...

  10. 【总结】IP

    一. IP基本认识 1.IP 在 TCP/IP 参考模型中处于第三层,也就是网络层. 网络层的主要作用是:实现主机与主机之间的通信,也叫点对点(end to end)通信 2.网络层与数据链路层有什么 ...