用过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两表之间数据关联关系,知道这几招就够了的更多相关文章

  1. EF Core中如何正确地设置两张表之间的关联关系

    数据库 假设现在我们在SQL Server数据库中有下面两张表: Person表,代表的是一个人: CREATE TABLE [dbo].[Person]( ,) NOT NULL, ) NULL, ...

  2. JS之document例题讲解1(两张表之间数据转移、日期时间选择、子菜单下拉、用div做下拉菜单、事件总结)

    作业一:两个列表之间数据从一个列表移动到另一个列表 <div style="width:600px; height:500px; margin-top:20px"> & ...

  3. Kettle 实现mysql数据库不同表之间数据同步——实验过程

    下面是试验的主要步骤: 在上一篇文章中LZ已经介绍了,实验的环境和实验目的. 在本篇文章中主要介绍侧重于对Kettle ETL的相应使用方法, 在这里LZ需要说明一下,LZ成为了避免涉及索引和表连接等 ...

  4. 一条sql解决.一张表的数据复制到另外一张表

    如何把一个表的数组复制到一张表?也许很多人会把这个表查出来的数据再插入到另外一张表里面,这样很麻烦又要写代码逻辑去处理,其实一条sql语句就可以把一张表的数据复制到另外一张表,或者一张表的某一条数据复 ...

  5. EXCEL批量导入到Sqlserver数据库并进行两表间数据的批量修改

    Excel 大量数据导入到sqlserver生成临时表并将临时表某字段的数据批量更新的原表中的某个字段 1:首先要对EXCEL进行处理 列名改成英文,不要有多余的列和行(通过ctrl+shift 左或 ...

  6. Oracle 通过dblink和job方式实现两个数据库表之间数据同步

    需求是需要将Database_A中的dev_test表中的数据同步到Database_B中的dev_test表中. 因为是通过Database_B去同步Database_A库中的数据,所以操作都建立在 ...

  7. 5月9日 python学习总结 外键、表之间的关联关系、修改表、清空表内容、复制表

    一.外键foreign key    外键约束: 1.必须先创建被关联表才能创建关联表 2.插入记录时,必须先插入被关联表的记录,才能插入关联表(要用到被关联表)的记录 3.若不设置同步更新和同步删除 ...

  8. EXCEL 跨表比较数据

    Public Sub Compare(fullname As String, sheet As String) Dim conn, sql, rows, i, cellContents ,rowInd ...

  9. excel跨表查询数据

    环境:公司部分部门进行商品盘点,店铺经理要求不经过系统进行盘点,全程采用excel表格处理所示:            左图为总表,右图为首饰部门录入的数据 需求:找出盘点差异(即首饰部商品数量是否和 ...

随机推荐

  1. &pwn1_sctf_2016 &ciscn_2019_n_1 &ciscn_2019_c_1 &ciscn_2019_en_2&

    在做buu题目的时候,发现在最上面有几道被各位师傅打到1分的题,强迫症逼迫我去做那几道题. 这里来试着去解决这些题...讲真的,我感觉自己刷题真的少,即使是很简单的栈题目,我还是能学习到新的东西.这里 ...

  2. 请注意JS方法,方法同名,参数个数不一样是不能区分方法的,

    请注意JS方法,方法同名,参数个数不一样是不能区分方法的, 所以要区分方法,只能利用方法名不同来区分,而不能利用参数个数与参数类型来分.

  3. 【九度OJ】题目1024:畅通工程 解题报告

    [九度OJ]题目1024:畅通工程 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述: 省政府"畅 ...

  4. 【LeetCode】152. Maximum Product Subarray 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双重循环 动态规划 参考资料 日期 题目地址:htt ...

  5. 【LeetCode】62. Unique Paths 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/unique-pa ...

  6. 【LeetCode】19. Remove Nth Node From End of List 删除链表的倒数第 N 个结点

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:链表, 删除节点,双指针,题解,leetcode, 力扣 ...

  7. 【LeetCode】809. Expressive Words 解题报告(Python)

    [LeetCode]809. Expressive Words 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http ...

  8. Sum(hdu4407)

    Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. bootstrap datetimepick 时分秒选择,坑我15个小时,整理记录

    官网的datetimepick 下载链接 官网下载 <input type="text" readonly name="feedDay" id=" ...

  10. C++模拟python风格的print函数--打印vector,map,list等结构

    // 最基本实现 template<typename T> static void print(T t) { std::cout << t; } // 处理 std::pair ...