解决excel两表之间数据关联关系,知道这几招就够了
用过SAP的凭证批量录入模板(Excel文件)的都知道,一个凭证由【抬头】和多个【行项目】组成,这是一个关于excel两表信息关联的典型场景。
这里头蕴藏着一个麻烦:当我们需要一次性录入多个凭证时,如何将每个凭证的抬头与行项目关联起来呢?
假定这是一个SAP凭证的excel录入模板,包含多个待录入的凭证:
【抬头】表:
【行项目】表:
看了表结构,如果实际业务中【抬头】文本跟【行项目】文本要求有一定差异,那么能将两张表关联起来的就剩【号码】字段了。此处【抬头】号码1跟【行项目】号码1说的都是第1个待录入凭证。
当我们第一层循环是遍历【抬头】表的每一行时,第二层内循环便是遍历该凭证行项目对应的每一行。进一步分解需求,比如号码1,我们需要动态计算号码1在【行项目】的起始和终止行号。小爬能想到的思路有以下三个。
①利用excel公式来动态计算;
②利用两个字典分别存储某个号码在【行项目】中的首尾行号;
③建立个临时表temp,利用sql或Excel自带筛选功能快速筛选出号码等于特定数字(比如1)的数据,写入临时表。
先说方法一:使用match结合countif分别得到首尾行号。
如下图所示:
接着说说方法二:使用字典来得到某个凭证行项目的首尾行号
我们从上至下遍历【行项目】每一行,用字典(key,value)分别存储号码和对应的行号,由于字典【key】的唯一性和可覆盖性,我们永远key对应【号码】,则value永远对应的该key最后一次出现的位置(行号),因为该key第一次存入字典的value(起始行号),随着逐行往下遍历,被不停用新的value(行号)覆盖。
此时我们只需要掌握一个trick,先定义个字典,从上至下遍历,最终存储key(号码)和value(结束行号);紧接着再定义个字典,从下至上遍历,便可存储key(号码)和value(起始行号),你get到这一点了吗?
完整实现的代码示例(VBA)如下:
1 Sub voucherEntry()
2 Dim headerSht As Worksheet, itemSht As Worksheet, numberStr As String, startNum As Integer, endNum As Integer, headerMaxRow As Long, itemMaxRow As Long, i As Integer, j As Integer
3 Dim startDic As Object, endDic As Object
4 Set startDic = CreateObject("scripting.dictionary")
5 Set endDic = CreateObject("scripting.dictionary")
6
7 Set headerSht = ThisWorkbook.Sheets("抬头")
8 Set itemSht = ThisWorkbook.Sheets("行项目")
9 headerMaxRow = headerSht.Cells(Rows.Count, 1).End(xlUp) '[抬头]表的最后一行行号
10 itemMaxRow = itemSht.Cells(Rows.Count, 1).End(xlUp) '[行项目]表的最后一行行号
11 For i = 2 To itemMaxRow
12 endDic.Add CStr(itemSht.Range("A" & i).Value), i '将号码与对应行号的关系存入字典,思考下,为啥要转为字符串格式
13 Next
14
15 For i = itemMaxRow To 2 Step -1
16 startDic.Add CStr(itemSht.Range("A" & i).Value), i '将号码与对应行号的关系存入字典,思考下,为啥要转为字符串格式
17 Next
18
19 For i = 2 To headerMaxRow '遍历【抬头】表每一个抬头行
20 numberStr = CStr(headerSht.Range("A" & i).Value) '【号码】,思考下,为啥要转为字符串格式
21 startNum = startDic(numberStr) '凭证对应的起始行号
22 endNum = endDic(numberStr) '凭证对应的结束行号
23 For j = startNum To endNum '遍历该凭证行项目的每一行
24 【代码块】
25 Next
26
27 Next
28
29 End Sub
至于方法三,小爬就暂时不对此进行具体实现了,感兴趣的同学不妨自己动手尝试一波~
快来扫码关注我的公众号 获取更多爬虫、数据分析的知识!
解决excel两表之间数据关联关系,知道这几招就够了的更多相关文章
- EF Core中如何正确地设置两张表之间的关联关系
数据库 假设现在我们在SQL Server数据库中有下面两张表: Person表,代表的是一个人: CREATE TABLE [dbo].[Person]( ,) NOT NULL, ) NULL, ...
- JS之document例题讲解1(两张表之间数据转移、日期时间选择、子菜单下拉、用div做下拉菜单、事件总结)
作业一:两个列表之间数据从一个列表移动到另一个列表 <div style="width:600px; height:500px; margin-top:20px"> & ...
- Kettle 实现mysql数据库不同表之间数据同步——实验过程
下面是试验的主要步骤: 在上一篇文章中LZ已经介绍了,实验的环境和实验目的. 在本篇文章中主要介绍侧重于对Kettle ETL的相应使用方法, 在这里LZ需要说明一下,LZ成为了避免涉及索引和表连接等 ...
- 一条sql解决.一张表的数据复制到另外一张表
如何把一个表的数组复制到一张表?也许很多人会把这个表查出来的数据再插入到另外一张表里面,这样很麻烦又要写代码逻辑去处理,其实一条sql语句就可以把一张表的数据复制到另外一张表,或者一张表的某一条数据复 ...
- EXCEL批量导入到Sqlserver数据库并进行两表间数据的批量修改
Excel 大量数据导入到sqlserver生成临时表并将临时表某字段的数据批量更新的原表中的某个字段 1:首先要对EXCEL进行处理 列名改成英文,不要有多余的列和行(通过ctrl+shift 左或 ...
- Oracle 通过dblink和job方式实现两个数据库表之间数据同步
需求是需要将Database_A中的dev_test表中的数据同步到Database_B中的dev_test表中. 因为是通过Database_B去同步Database_A库中的数据,所以操作都建立在 ...
- 5月9日 python学习总结 外键、表之间的关联关系、修改表、清空表内容、复制表
一.外键foreign key 外键约束: 1.必须先创建被关联表才能创建关联表 2.插入记录时,必须先插入被关联表的记录,才能插入关联表(要用到被关联表)的记录 3.若不设置同步更新和同步删除 ...
- EXCEL 跨表比较数据
Public Sub Compare(fullname As String, sheet As String) Dim conn, sql, rows, i, cellContents ,rowInd ...
- excel跨表查询数据
环境:公司部分部门进行商品盘点,店铺经理要求不经过系统进行盘点,全程采用excel表格处理所示: 左图为总表,右图为首饰部门录入的数据 需求:找出盘点差异(即首饰部商品数量是否和 ...
随机推荐
- &pwn1_sctf_2016 &ciscn_2019_n_1 &ciscn_2019_c_1 &ciscn_2019_en_2&
在做buu题目的时候,发现在最上面有几道被各位师傅打到1分的题,强迫症逼迫我去做那几道题. 这里来试着去解决这些题...讲真的,我感觉自己刷题真的少,即使是很简单的栈题目,我还是能学习到新的东西.这里 ...
- 请注意JS方法,方法同名,参数个数不一样是不能区分方法的,
请注意JS方法,方法同名,参数个数不一样是不能区分方法的, 所以要区分方法,只能利用方法名不同来区分,而不能利用参数个数与参数类型来分.
- 【九度OJ】题目1024:畅通工程 解题报告
[九度OJ]题目1024:畅通工程 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述: 省政府"畅 ...
- 【LeetCode】152. Maximum Product Subarray 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双重循环 动态规划 参考资料 日期 题目地址:htt ...
- 【LeetCode】62. Unique Paths 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/unique-pa ...
- 【LeetCode】19. Remove Nth Node From End of List 删除链表的倒数第 N 个结点
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:链表, 删除节点,双指针,题解,leetcode, 力扣 ...
- 【LeetCode】809. Expressive Words 解题报告(Python)
[LeetCode]809. Expressive Words 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http ...
- Sum(hdu4407)
Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- bootstrap datetimepick 时分秒选择,坑我15个小时,整理记录
官网的datetimepick 下载链接 官网下载 <input type="text" readonly name="feedDay" id=" ...
- C++模拟python风格的print函数--打印vector,map,list等结构
// 最基本实现 template<typename T> static void print(T t) { std::cout << t; } // 处理 std::pair ...